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 插件。

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

相关推荐
三十..6 小时前
Ceph分布式存储核心技术精要与运维实践指南
运维·分布式·ceph
cfm_291410 小时前
Redis高并发分布式锁了解
redis·分布式
小小编程路11 小时前
分布式核心知识
分布式
bukeyiwanshui11 小时前
20260528 Ceph 分布式存储 集群配置
分布式·ceph
Vick_Zhang12 小时前
ubuntu上rabbitmq
服务器·ubuntu·rabbitmq
我叫张小白。12 小时前
基于Redis与FastAPI的分布式共享会话体系
数据库·redis·分布式·缓存·中间件·fastapi·依赖注入
天河归来12 小时前
国产数据库安全可靠测评产品观察:从集中式、分布式到 HTAP 的发展趋势
数据库·分布式
小碗羊肉13 小时前
【Redis | 第五篇】分布式锁
数据库·redis·分布式
运维栈记13 小时前
Ceph 入门:一文读懂分布式存储的“瑞士军刀”
分布式·ceph