部署 RabbitMQ 主备集群的逐步指南

了解如何配置一个健壮的 RabbitMQ 主备集群以实现高可用性。本指南涵盖了前提条件设置、必要的 Erlang cookie 同步、加入集群节点,以及应用镜像策略(`ha-mode:all`)以确保数据一致性,并在主节点发生故障时实现无缝的服务故障转移。

35 浏览量

部署 RabbitMQ 主动/被动集群的分步指南

为任务关键型消息传递服务实现高可用性 (HA) 需要强大的冗余。RabbitMQ 主动/被动集群设置是实现此目标的一种经典方法,它确保如果活动节点发生故障,指定的被动节点可以快速接管,从而最大限度地减少停机时间。本指南提供了一个全面的分步流程来配置此类部署,涵盖了先决条件、节点配置以及确保无缝故障转移功能。

此部署模式依赖于标准的 RabbitMQ 集群,并结合外部机制(如 Pacemaker 或简单脚本)来管理故障发生时的 IP 地址接管。在本指南中,我们重点关注支持 HA 设置的 RabbitMQ 集群方面。

主动/被动集群的先决条件

在开始配置之前,请确保所有计划的集群节点(节点 A - 主动,节点 B - 被动)都满足以下先决条件:

  1. 相同的软件版本: 所有节点必须运行完全相同的 RabbitMQ Server 和 Erlang/OTP 版本。
  2. 网络可达性: 所有节点必须能够通过必要的端口相互通信(默认情况下,AMQP 为 5672,集群为 25672)。
  3. 主机解析: 在所有节点上配置 /etc/hosts 文件(或 DNS),以便每个节点都能可靠地解析所有其他节点的​​主机名。
  4. Cookie 一致性: 所有节点上的 Erlang“魔术 Cookie”必须相同。这对于节点之间能够相互信任以进行集群至关重要。

Erlang Cookie 决定了节点是否可以安全通信。必须将其从初始化的第一个节点复制到所有其他节点。

在节点 A 上(第一个节点):

找到 Cookie 文件(通常根据安装方法为 /var/lib/rabbitmq/.erlang.cookie~/.erlang.cookie)并复制其内容。

在节点 B(及后续节点)上:

  1. 停止 RabbitMQ 服务:
    bash sudo systemctl stop rabbitmq-server
  2. 用从节点 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
  3. 在节点 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 将是初始主节点,集群首先在此处建立。

  1. 在节点 A 上启动服务(如果尚未运行):
    bash sudo systemctl start rabbitmq-server
  2. 验证状态: 确保节点运行正常。
    bash rabbitmqctl status

步骤 3:将第二个节点(被动)加入集群

现在,我们指示节点 B 加入由节点 A 领导的集群。

  1. 在节点 B 上停止服务(如果正在运行):
    bash sudo systemctl stop rabbitmq-server
  2. 加入命令: 在节点 B 上执行加入命令,指定节点 A 的主机名作为对等节点。
    bash rabbitmqctl join_cluster rabbit@rabbitmq-node-a
    提示:使用 /etc/hosts 中定义的主机名。

  3. 在节点 B 上启动服务:
    bash sudo systemctl start rabbitmq-server

步骤 4:验证集群形成

登录到节点 A 并验证两个节点是否相互识别。

rabbitmqctl cluster_status

预期输出片段:

您应该在 running_nodes 下看到 rabbitmq-node-arabbitmq-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"'