RabbitMQ 集群搭建实战:多机多节点与单机多节点
RabbitMQ 集群搭建的核心,是让多个 RabbitMQ 节点能够通过节点名称互相识别,并使用相同的 Erlang Cookie 完成节点间认证。下面按照实际操作顺序,分别演示多台服务器搭建集群,以及在单台服务器上通过不同端口模拟多个节点搭建集群。
多机多节点搭建集群
多机多节点适合真实服务器环境。这里使用 3 台机器,每台机器都安装一个 RabbitMQ 节点,然后把它们组成一个集群。
安装 RabbitMQ 并确认节点可用
先在 3 台服务器上分别安装 RabbitMQ。安装完成后,在每台机器上执行下面的命令确认节点状态:
bash
rabbitmqctl status
如果命令能正常返回 RabbitMQ 版本、Erlang 版本、节点名称、监听端口等信息,说明当前节点已经可以正常运行。
示例节点信息如下:
| 服务器 | IP | 开放端口 | 节点名称 |
|---|---|---|---|
| 节点 1 | 10.0.0.232 | 5672、15672 | rabbit@iZ2vc7a1n9gvhfp589oav8Z |
| 节点 2 | 10.0.0.233 | 5672、15672 | rabbit@iZ2vc7a1n9gvhfp589oav6Z |
| 节点 3 | 10.0.0.234 | 5672、15672 | rabbit@iZ2vc7a1n9gvhfp589oav7Z |
其中 5672 是 AMQP 通信端口,15672 是 Web 管理界面端口。多机集群还需要保证节点之间的集群通信端口可达,RabbitMQ 默认会使用 25672 进行节点间通信和 CLI 工具通信。
配置 hosts 文件
RabbitMQ 节点名称依赖主机名,因此每台机器都要能解析其他节点的主机名。分别修改 3 台机器的 /etc/hosts 文件:
bash
vim /etc/hosts
配置格式是:
text
IP 主机名称
示例配置如下:
text
# rabbitmq
10.0.0.232 iZ2vc7a1n9gvhfp589oav8Z
10.0.0.233 iZ2vc7a1n9gvhfp589oav6Z
10.0.0.234 iZ2vc7a1n9gvhfp589oav7Z
这里的主机名称不能随便写,要和服务器真实主机名一致。可以通过下面的命令查看:
bash
more /etc/hostname
如果是刚初始化的服务器,可以按需修改主机名;如果服务器已经运行了较多服务,不建议轻易修改主机名。修改主机名后通常需要重启服务器。
配置 Erlang Cookie
RabbitMQ 节点之间,以及 rabbitmqctl 这类 CLI 工具和节点之间,都需要通过 Erlang Cookie 做身份认证。要让多个节点组成集群,所有节点必须使用相同的 Cookie。
Cookie 文件通常位于:
text
/var/lib/rabbitmq/.erlang.cookie
$HOME/.erlang.cookie
先停止所有节点上的 RabbitMQ 服务:
bash
systemctl stop rabbitmq-server
然后选择一个节点作为 Cookie 来源,把它的 .erlang.cookie 拷贝到其他节点。下面以节点 3 为来源,将 Cookie 分别拷贝到节点 1 和节点 2:
bash
# 在节点 3 上执行:拷贝到节点 1
scp /var/lib/rabbitmq/.erlang.cookie root@iZ2vc7a1n9gvhfp589oav8Z:/var/lib/rabbitmq/
# 在节点 3 上执行:拷贝到节点 2
scp /var/lib/rabbitmq/.erlang.cookie root@iZ2vc7a1n9gvhfp589oav6Z:/var/lib/rabbitmq/
第一次连接远程主机时,终端可能会提示是否继续连接,输入 yes 后再输入远程服务器密码即可完成拷贝。
启动所有节点
Cookie 配置完成后,在 3 台机器上分别以后端方式启动 RabbitMQ:
bash
rabbitmq-server -detached
其中 rabbitmq-server 用于启动 RabbitMQ 服务,-detached 表示让服务在后台运行。
构建集群
这里选择节点 3 作为被加入的目标节点,让节点 1 和节点 2 加入节点 3 所在集群。
在节点 1 和节点 2 上分别执行下面的命令:
bash
# 1. 关闭 RabbitMQ 应用
rabbitmqctl stop_app
# 2. 重置当前节点
rabbitmqctl reset
# 3. 加入节点 3 所在集群
rabbitmqctl join_cluster rabbit@iZ2vc7a1n9gvhfp589oav7Z
# 4. 启动 RabbitMQ 应用
rabbitmqctl start_app
需要注意,rabbitmqctl reset 会清除当前节点上已经存在的资源和数据。因此,执行前要确认该节点没有需要保留的队列、交换机、绑定关系或消息数据。
查看集群状态
集群构建完成后,可以在任意节点上执行:
bash
rabbitmqctl cluster_status
如果搭建成功,输出中的 Disk Nodes 和 Running Nodes 会看到 3 个节点,例如:
text
rabbit@iZ2vc7a1n9gvhfp589oav6Z
rabbit@iZ2vc7a1n9gvhfp589oav7Z
rabbit@iZ2vc7a1n9gvhfp589oav8Z
也可以通过 RabbitMQ Web 管理界面查看集群信息。进入管理界面后,在节点列表中能够看到其他节点,说明集群已经识别成功。
常见问题:Node statistics not available
集群搭建完成后,如果在 Web 管理界面的 Nodes 区域看到 Node statistics not available,通常说明对应节点没有启用 Web 管理插件。
在出现提示的节点上执行下面的命令即可:
bash
rabbitmq-plugins enable rabbitmq_management
启用后重新查看管理界面,节点统计信息就可以正常显示。
单机多节点搭建集群
单机多节点适合学习、测试和演示。它是在同一台服务器上启动多个 RabbitMQ 节点,每个节点使用不同的节点名称、AMQP 端口和 Web 管理端口。
下面分别演示 Ubuntu 和 CentOS 环境中的操作方式。
Ubuntu 环境
搭建并确认第一个节点
先完成 RabbitMQ 单机安装。如果已经安装过,可以直接检查运行状态:
bash
rabbitmqctl status
输出中需要关注节点名称和监听端口。例如:
text
Node name: rabbit@hcss-ecs-2618
Listeners
Interface: [::], port: 15672, protocol: http
Interface: [::], port: 25672, protocol: clustering
Interface: [::], port: 5672, protocol: amqp
几个端口的作用如下:
| 端口 | 作用 |
|---|---|
| 25672 | Erlang 分布式节点通信端口,用于 RabbitMQ 节点间通信 |
| 15672 | Web 管理界面端口 |
| 5672 | AMQP 协议端口,用于客户端连接 RabbitMQ |
再启动两个节点
当前已经有默认节点运行在 5672 和 15672 端口。接下来再启动两个节点:
| 节点名称 | AMQP 端口 | Web 管理端口 |
|---|---|---|
| rabbit2 | 5673 | 15673 |
| rabbit3 | 5674 | 15674 |
执行命令如下:
bash
RABBITMQ_NODE_PORT=5673 \
RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" \
RABBITMQ_NODENAME=rabbit2 \
rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 \
RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" \
RABBITMQ_NODENAME=rabbit3 \
rabbitmq-server -detached
如果是在云服务器上操作,需要放行 15673 和 15674 端口。之后可以分别访问:
text
http://服务器IP:15672/
http://服务器IP:15673/
http://服务器IP:15674/
三个地址都能打开管理界面,说明 3 个节点已经分别启动成功。
停止并重置待加入节点
将 rabbit2 和 rabbit3 加入集群之前,需要先停止并重置它们:
bash
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
这里的 -n 用于指定要操作的节点。
加入主节点所在集群
默认节点的名称可以通过 rabbitmqctl status 查看。这里的主节点是:
text
rabbit@hcss-ecs-2618
把 rabbit2 和 rabbit3 添加到这个集群:
bash
rabbitmqctl -n rabbit2 join_cluster rabbit@hcss-ecs-2618
rabbitmqctl -n rabbit3 join_cluster rabbit@hcss-ecs-2618
启动 rabbit2 和 rabbit3
加入集群后,重新启动两个节点:
bash
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
查看集群状态
查看集群状态:
bash
rabbitmqctl -n rabbit cluster_status
如果成功,会在 Disk Nodes 和 Running Nodes 中看到:
text
rabbit@hcss-ecs-2618
rabbit2@hcss-ecs-2618
rabbit3@hcss-ecs-2618
通过主节点的 Web 管理界面,也可以看到集群中的其他节点。
CentOS 环境
CentOS 下的整体思路和 Ubuntu 一样:先确认默认节点可用,再启动两个不同端口的新节点,最后把新节点加入默认节点所在集群。
搭建并确认第一个节点
先完成 RabbitMQ 单机安装,然后查看状态:
bash
rabbitmqctl status
需要确认输出中包含默认节点名称,例如:
text
Status of node rabbit@VM-24-3-centos
Node name: rabbit@VM-24-3-centos
同时确认默认端口已经监听:
text
15672:Web 管理界面
25672:节点间通信和 CLI 通信
5672:AMQP 客户端通信
再启动两个节点
继续启动 rabbit2 和 rabbit3:
bash
RABBITMQ_NODE_PORT=5673 \
RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" \
RABBITMQ_NODENAME=rabbit2 \
rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 \
RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" \
RABBITMQ_NODENAME=rabbit3 \
rabbitmq-server -detached
在云服务器安全组中放行 15673 和 15674 后,访问下面 3 个地址进行验证:
text
http://服务器IP:15672/
http://服务器IP:15673/
http://服务器IP:15674/
停止并重置待加入节点
停止并重置 rabbit2、rabbit3:
bash
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
加入主节点所在集群
默认节点是:
text
rabbit@VM-24-3-centos
将两个新节点加入该集群:
bash
rabbitmqctl -n rabbit2 join_cluster rabbit@VM-24-3-centos
rabbitmqctl -n rabbit3 join_cluster rabbit@VM-24-3-centos
启动 rabbit2 和 rabbit3
bash
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
查看集群状态
bash
rabbitmqctl -n rabbit cluster_status
正常情况下,可以看到 3 个节点都在运行:
text
rabbit@VM-24-3-centos
rabbit2@VM-24-3-centos
rabbit3@VM-24-3-centos
监听端口也会对应拆分为:
| 节点 | Web 管理端口 | 集群通信端口 | AMQP 端口 |
|---|---|---|---|
| rabbit | 15672 | 25672 | 5672 |
| rabbit2 | 15673 | 25673 | 5673 |
| rabbit3 | 15674 | 25674 | 5674 |
最后进入主节点的 Web 管理界面,如果能看到其他两个节点,就说明单机多节点集群已经搭建完成。
操作要点总结
无论是多机多节点还是单机多节点,RabbitMQ 集群搭建都要关注下面几个关键点:
- 节点名称必须明确,尤其是
rabbit@主机名里的主机名要能被正确解析。 - 多机集群要保证各节点 Erlang Cookie 一致,否则节点间无法完成认证。
- 新节点加入集群前需要先执行
stop_app和reset。 reset会清除当前节点已有资源和数据,生产环境执行前必须确认影响范围。- 管理界面无法显示节点统计信息时,优先检查对应节点是否启用了
rabbitmq_management插件。
掌握这些步骤后,就可以根据实际环境选择多台服务器搭建真实集群,或者在单台服务器上模拟多个节点进行学习和验证。