RabbitMQ集群搭——多机多节点与单机多节点

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

如果是刚初始化的服务器,可以按需修改主机名;如果服务器已经运行了较多服务,不建议轻易修改主机名。修改主机名后通常需要重启服务器。

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 NodesRunning 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 个节点已经分别启动成功。

停止并重置待加入节点

rabbit2rabbit3 加入集群之前,需要先停止并重置它们:

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

rabbit2rabbit3 添加到这个集群:

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 NodesRunning 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 客户端通信

再启动两个节点

继续启动 rabbit2rabbit3

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/

停止并重置待加入节点

停止并重置 rabbit2rabbit3

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 集群搭建都要关注下面几个关键点:

  1. 节点名称必须明确,尤其是 rabbit@主机名 里的主机名要能被正确解析。
  2. 多机集群要保证各节点 Erlang Cookie 一致,否则节点间无法完成认证。
  3. 新节点加入集群前需要先执行 stop_appreset
  4. reset 会清除当前节点已有资源和数据,生产环境执行前必须确认影响范围。
  5. 管理界面无法显示节点统计信息时,优先检查对应节点是否启用了 rabbitmq_management 插件。

掌握这些步骤后,就可以根据实际环境选择多台服务器搭建真实集群,或者在单台服务器上模拟多个节点进行学习和验证。

相关推荐
添砖java_85713 小时前
基于RabbitMQ实现的轻量队列测试报告
分布式·rabbitmq
Zhu75814 小时前
使用腾讯CNB构建Hadoop定制容器镜像
大数据·hadoop·分布式
TTBIGDATA15 小时前
【Ambari Plus】13.Spark 安装
大数据·hadoop·分布式·spark·ambari·sqoop·ambari plus
sunxunyong17 小时前
Hadoop租户创建
大数据·hadoop·分布式
得物技术17 小时前
得物 OceanBase 落地实践
数据库·分布式·架构
GuangdongTong18 小时前
基于RabbitMQ实现延迟任务
后端·rabbitmq
heimeiyingwang19 小时前
【架构实战】分布式ID生成:从自增ID到雪花算法
分布式·架构
微三云 - 廖会灵 (私域系统开发)2 天前
电商系统微服务拆分实战:从单体到Spring Cloud的分布式事务踩坑与补偿方案
分布式·spring cloud·微服务
ACP广源盛139246256732 天前
破局 PCIe 4.0 交换瓶颈@ACP#IX8024 / ASM58024参数及应用对比
大数据·人工智能·分布式·嵌入式硬件
淡然的煎蛋2 天前
开始使用RabbitMQ
分布式·rabbitmq·ruby