温馨提示×

RabbitMQ在Ubuntu上如何实现高可用性

小樊
33
2025-12-08 23:37:55
栏目: 智能运维

在 Ubuntu 上实现 RabbitMQ 高可用

一、架构选型与前置准备

  • 架构建议:至少部署3 个节点的集群,节点类型包含磁盘节点(disc)内存节点(ram);集群中必须至少有1 个磁盘节点,推荐2 个磁盘 + 1 个内存以兼顾可靠性与吞吐。对于队列类型,优先使用仲裁队列(Quorum Queues),基于 Raft 提供更强的一致性与自动选主;经典镜像队列(Mirrored Queues)已不推荐。仲裁队列至少需要3 个节点参与。为提升入口可用性,建议在前面放置 HAProxy 或同等负载均衡器进行连接分发与健康检查。以上选型与做法适用于 Ubuntu 20.04/22.04 等常见 LTS 版本。

二、Ubuntu 上的集群部署步骤

  • 主机与解析:为每台机器设置唯一主机名(如 node1、node2、node3),并在所有节点的 /etc/hosts 中写入所有节点的 IP 与主机名 映射,确保节点间可互相解析。
  • 安装与启停:在所有节点安装 ErlangRabbitMQ(可使用 APT 官方仓库或系统仓库),完成后启动服务并启用管理插件以便观测与运维(管理端口默认为 15672)。
  • 形成集群:选择第一个节点为种子节点,其余节点依次执行“stop_app → reset → join_cluster → start_app”加入集群;加入时可按需指定 –ram 成为内存节点,未指定即为磁盘节点。示例(在 node2 上):
    • rabbitmqctl -n rabbit2 stop_app
    • rabbitmqctl -n rabbit2 reset
    • rabbitmqctl -n rabbit2 join_cluster rabbit@node1
    • rabbitmqctl -n rabbit2 start_app
  • 验证:在任意节点执行 rabbitmqctl cluster_status,应能看到所有节点及其类型(disc/ram)。

三、队列与数据的高可用配置

  • 仲裁队列(推荐):在业务代码声明队列时指定参数 x-queue-type=quorum,队列将基于 Raft 自动完成复制与选主,具备更强的数据安全性与自动故障转移能力。适用于对消息不丢要求较高的场景。
  • 镜像队列(兼容旧系统):如仍需使用经典镜像队列,可通过策略将所有或匹配前缀的队列镜像到多个节点,例如:
    • rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’ 注意:镜像队列为传统方案,存在网络分区时的一致性与可用性权衡,官方已不推荐,且在 3.13+ 版本中默认禁用。
  • 持久化配合:为降低消息丢失风险,业务侧建议将队列与消息设置为持久化(durable=true),并结合发布确认(publisher confirms)与消费者确认(ack)机制共同使用。

四、入口高可用与运维要点

  • 负载均衡与健康检查:在 HAProxy 中配置 5672(AMQP)与 15672(管理)前端与健康检查后端,示例片段:
    • frontend rabbitmq bind *:5672 default_backend rabbitmq_nodes
    • backend rabbitmq_nodes balance roundrobin server rabbit1 10.0.0.11:5672 check server rabbit2 10.0.0.12:5672 check server rabbit3 10.0.0.13:5672 check 生产上建议配合 TCP 健康检查虚 IP(VIP)/Keepalived 实现入口层面的故障转移与平滑切换。
  • 网络与分区处理:确保节点间 4369(epmd)/25672(集群分发)/5672/15672 等端口放通;对可能发生的网络分区,建议配置 cluster_partition_handling = pause_minority 并结合业务容忍度选择自动恢复策略,以降低“脑裂”风险。
  • 资源与告警:在 /etc/rabbitmq/rabbitmq.conf 中设置关键水位与磁盘阈值,例如:
    • vm_memory_high_watermark.relative = 0.7
    • disk_free_limit.absolute = 50MB 同时启用管理插件并监控 /var/log/rabbitmq/ 日志与管理界面指标,及时处置内存、磁盘与连接告警。

0