部署 RabbitMQ 主动/被动集群的分步指南
为任务关键型消息传递服务实现高可用性 (HA) 需要强大的冗余。RabbitMQ 主动/被动集群设置是实现此目标的一种经典方法,它确保如果活动节点发生故障,指定的被动节点可以快速接管,从而最大限度地减少停机时间。本指南提供了一个全面的分步流程来配置此类部署,涵盖了先决条件、节点配置以及确保无缝故障转移功能。
此部署模式依赖于标准的 RabbitMQ 集群,并结合外部机制(如 Pacemaker 或简单脚本)来管理故障发生时的 IP 地址接管。在本指南中,我们重点关注支持 HA 设置的 RabbitMQ 集群方面。
主动/被动集群的先决条件
在开始配置之前,请确保所有计划的集群节点(节点 A - 主动,节点 B - 被动)都满足以下先决条件:
- 相同的软件版本: 所有节点必须运行完全相同的 RabbitMQ Server 和 Erlang/OTP 版本。
- 网络可达性: 所有节点必须能够通过必要的端口相互通信(默认情况下,AMQP 为 5672,集群为 25672)。
- 主机解析: 在所有节点上配置
/etc/hosts文件(或 DNS),以便每个节点都能可靠地解析所有其他节点的主机名。 - Cookie 一致性: 所有节点上的 Erlang“魔术 Cookie”必须相同。这对于节点之间能够相互信任以进行集群至关重要。
建立 Cookie 一致性
Erlang Cookie 决定了节点是否可以安全通信。必须将其从初始化的第一个节点复制到所有其他节点。
在节点 A 上(第一个节点):
找到 Cookie 文件(通常根据安装方法为 /var/lib/rabbitmq/.erlang.cookie 或 ~/.erlang.cookie)并复制其内容。
在节点 B(及后续节点)上:
- 停止 RabbitMQ 服务:
bash sudo systemctl stop rabbitmq-server - 用从节点 A 复制的内容替换现有的 Cookie 文件,确保权限正确(通常为
400)。
bash # 使用 echo 示例(根据需要替换内容) echo "YOUR_LONG_COOKIE_STRING" | sudo tee /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie - 在节点 B 上启动服务:
bash sudo systemctl start rabbitmq-server
步骤 1:配置主机名和网络
确保节点 A 和节点 B 上的主机文件正确映射了它们的主机名。
/etc/hosts 示例(在两个服务器上):
192.168.1.10 rabbitmq-node-a
192.168.1.11 rabbitmq-node-b
步骤 2:初始化第一个集群节点(主动)
节点 A 将是初始主节点,集群首先在此处建立。
- 在节点 A 上启动服务(如果尚未运行):
bash sudo systemctl start rabbitmq-server - 验证状态: 确保节点运行正常。
bash rabbitmqctl status
步骤 3:将第二个节点(被动)加入集群
现在,我们指示节点 B 加入由节点 A 领导的集群。
- 在节点 B 上停止服务(如果正在运行):
bash sudo systemctl stop rabbitmq-server -
加入命令: 在节点 B 上执行加入命令,指定节点 A 的主机名作为对等节点。
bash rabbitmqctl join_cluster rabbit@rabbitmq-node-a
提示:使用/etc/hosts中定义的主机名。 -
在节点 B 上启动服务:
bash sudo systemctl start rabbitmq-server
步骤 4:验证集群形成
登录到节点 A 并验证两个节点是否相互识别。
rabbitmqctl cluster_status
预期输出片段:
您应该在 running_nodes 下看到 rabbitmq-node-a 和 rabbitmq-node-b。
Cluster status of node rabbit@rabbitmq-node-a ...
[{nodes,[{disc,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]}]},
{running_nodes,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]},
...
]
步骤 5:配置高可用性(集群队列)
标准的 RabbitMQ 集群允许节点共享元数据(用户、交换器),但除非强制执行特定的 HA 策略,否则驻留在队列中的消息通常不会自动复制。要实现真正的主动/被动故障转移,必须使用镜像队列。
定义策略
策略应用于匹配特定模式的队列,以定义队列应在集群中存在多少副本以及应提升哪个副本。
在任一节点上使用 rabbitmqctl set_policy 命令,对整个集群("^")强制执行镜像。
# 设置一个名为 'ha-all' 的策略,该策略镜像匹配任何名称 ('^') 的队列
# 到集群中的所有节点(共 3 个节点),并设置 'promote' 行为。
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"'