构建RabbitMQ镜像集群
本文档将指导您如何在多台服务器上配置RabbitMQ集群,并启用镜像模式以实现高可用性。
一、环境准备
在开始之前,请确保您的所有集群节点已完成以下准备工作:
- 网络配置: 配置所有节点的
/etc/hosts文件,使其能够通过主机名解析到正确的IP地址。例如:192.168.1.135 rabbit-master01 192.168.1.136 rabbit-master02 192.168.1.137 rabbit-master03 - 防火墙: 确保防火墙允许RabbitMQ所需端口(默认为 5672, 15672, 25672, 4369, 5671)的通信,或暂时关闭防火墙。
二、安装RabbitMQ服务器
在集群的每一台机器上执行以下步骤:
- 添加YUM仓库:
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash - 安装RabbitMQ服务器:(以下以3.8.14版本为例)
yum install rabbitmq-server-3.8.14 - 启用管理插件:
rabbitmq-plugins enable rabbitmq_management - 启动并启用服务:
systemctl start rabbitmq-server systemctl enable rabbitmq-server注意:服务配置文件(
rabbitmq.conf)通常不包含在安装包中。您可以从RabbitMQ的GitHub仓库下载示例配置文件进行修改。
三、配置集群镜像模式
集群的配置分为多个步骤,需要在不同节点上执行。
1. 节点认证(Cookie共享)
在第一个节点(例如 rabbit-master01)上,执行以下命令将 .erlang.cookie 文件复制到其他节点。此文件用于节点间的身份验证。
# 在 rabbit-master01 上执行
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-master02:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-master03:/var/lib/rabbitmq/.erlang.cookie
在执行加入集群命令前,可以先查看当前集群名称(通常与节点主机名相关):
rabbitmqctl cluster_status | grep 'Cluster name'
2. 加入集群
在除了第一个节点(rabbit-master01)之外的其他节点(rabbit-master02, rabbit-master03)上执行以下操作:
- 恢复文件权限:由于
.erlang.cookie文件是通过root用户复制的,需要将其所有者更改回rabbitmq用户。chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie - 重启服务:使 cookie 文件生效。
systemctl restart rabbitmq-server - 停止RabbitMQ应用:(Erlang节点服务保持运行)
rabbitmqctl stop_app如果节点已有数据,并且您想将其重置为新节点状态,可以使用
rabbitmqctl reset命令。 - 加入集群:将当前节点加入到以
rabbit@rabbit-master01为代表的集群中。rabbitmqctl join_cluster rabbit@rabbit-master01默认节点类型为磁盘节点(disk)。您可以通过
--ram参数创建内存节点(RAM node)。集群中至少需要一个磁盘节点。 - 启动RabbitMQ应用:
rabbitmqctl start_app
3. 配置镜像策略
在集群中的任意一个节点上执行以下命令,为所有队列(匹配正则表达式 ^,即所有队列)设置镜像策略 ha-all,使其所有副本都进行同步。
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
您可以随时使用 rabbitmqctl cluster_status 命令查看集群状态,确认节点是否已加入以及策略是否生效。
四、用户管理与验证
为了验证集群是否正常工作,可以创建一个管理用户并进行测试。
- 创建用户:
rabbitmqctl add_user admin admin123 - 设置用户角色:(例如设置为
administrator)rabbitmqctl set_user_tags admin administrator - 设置用户权限:授予对所有虚拟主机(
/)下所有资源的读、写、配置权限。rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" - 验证用户列表:
rabbitmqctl list_users - 访问Web管理界面:在浏览器中访问任意节点的
http://<节点IP>:15672,使用刚创建的admin用户登录。
五、常用RabbitMQctl命令
以下是一些在集群管理中常用的 rabbitmqctl 命令:
rabbitmqctl stop: 停止RabbitMQ服务器。rabbitmqctl shutdown: 终止RabbitMQ服务器的Erlang进程。rabbitmqctl stop_app: 停止RabbitMQ应用,Erlang节点保持运行。rabbitmqctl start_app: 启动RabbitMQ应用。rabbitmqctl reset: 将节点重置为原始状态,并从集群中移除。rabbitmqctl force_reset: 强制重置节点,即使数据库损坏。rabbitmqctl join_cluster <clusternode> [--ram]: 将当前节点加入指定集群,可选择创建RAM节点。rabbitmqctl cluster_status: 显示集群状态。rabbitmqctl change_cluster_node_type <disc|ram>: 改变节点类型。rabbitmqctl forget_cluster_node [--offline]: 远程移除一个节点。rabbitmqctl add_user <username> <password>: 添加用户。rabbitmqctl delete_user <username>: 删除用户。rabbitmqctl set_user_tags <username> <tag ...>: 设置用户角色。rabbitmqctl set_permissions [-p vhost] <user> <conf> <write> <read>: 设置用户权限。rabbitmqctl list_permissions [-p vhost]: 列出权限。rabbitmqctl add_vhost <vhost>: 添加虚拟主机。rabbitmqctl delete_vhost <vhost>: 删除虚拟主机。rabbitmqctl purge_queue [-p vhost] <queue>: 清空队列中的消息。rabbitmqctl sync_queue [-p vhost] <queue>: 同步镜像队列。
六、高可用性增强(可选)
可以使用 Nginx/HAProxy 配合 Keepalived 实现四层代理,为集群提供统一的访问入口和高可用性。
七、集群恢复与故障转移
在镜像模式下,当集群节点发生故障时,RabbitMQ 具备一定的自动恢复能力。以下是一些常见场景及处理方案:
- 场景1:节点A先停,节点B后停。
方案:先启动B(Master),再启动A。或先启动A,在30秒内启动B即可恢复。
- 场景2:节点A、B同时停机。
方案:在30秒内连续启动A和B即可恢复。
- 场景3:节点A先停,节点B后停,且A无法恢复。
方案:启动B(Master),然后在B节点执行
rabbitmqctl forget_cluster_node A移除A,再将新的Slave节点加入B。 - 场景4:节点A先停,节点B后停,且B无法恢复。
方案:此场景处理难度较大。在 RabbitMQ 3.4.2 及以上版本,可以使用
rabbitmqctl forget_cluster_node -offline B命令,强制移除无法恢复的Master节点B,然后启动A,并添加新的Slave节点。 - 场景5:节点A、B均无法恢复,但可获得磁盘文件。
方案:将损坏节点的Mnesia数据库文件(通常在
$RABBIT_HOME/var/lib/)拷贝到新节点的对应目录下,并将新节点的 hostname 修改为原节点名。若原节点为Slave,则按场景4处理;若原节点为Master,则按场景3处理。最后将新的Slave节点加入。 - 场景6:节点A、B均无法恢复,且无法获得磁盘文件。
方案:此情况下恢复非常困难,通常需要重建集群。
八、开启监控
可以通过 rabbitmq_prometheus 插件来暴露监控指标。
- 启用插件:(无需重启)
rabbitmq-plugins enable rabbitmq_prometheus - 访问监控接口:在任意节点上通过
http://<节点IP>:15692/metrics访问 Prometheus 格式的监控数据。
您还可以参考 Grafana 提供的 RabbitMQ 监控模板来可视化这些数据。