温馨提示×

RabbitMQ在Ubuntu上的负载均衡

小樊
46
2025-12-03 02:39:02
栏目: 云计算

Ubuntu 上 RabbitMQ 的负载均衡实践

一 架构与前置条件

  • 建议采用“RabbitMQ 集群 + 负载均衡器”的架构:集群提供容量与冗余,负载均衡器对外提供统一的 AMQP 5672 入口与健康检查。
  • 节点命名必须唯一,常见形式为 rabbit@<主机名>;同一主机多实例需通过环境变量设置不同的 RABBITMQ_NODE_PORTRABBITMQ_NODENAME,避免端口冲突。
  • 多机部署需保证各节点 Erlang Cookie 一致(权限建议 400,属主 rabbitmq:rabbitmq),并正确配置 /etc/hosts 或 DNS 解析,以便节点互通。

二 快速搭建集群与必要检查

  • 单机三节点示例(便于本地验证,端口分别为 5672/5673/5674,管理端口 15672/15673/15674):
    • 启动节点
      • RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS=“-rabbitmq_management listener [{port,15672}]” RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
      • RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS=“-rabbitmq_management listener [{port,15673}]” RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
      • RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS=“-rabbitmq_management listener [{port,15674}]” RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
    • 查看状态
      • rabbitmqctl status
      • rabbitmqctl -n rabbit1 status
      • rabbitmqctl -n rabbit2 status
    • 组建集群(示例将 rabbit1、rabbit2 加入 rabbit)
      • rabbitmqctl -n rabbit1 stop_app
      • rabbitmqctl -n rabbit1 reset
      • rabbitmqctl -n rabbit1 join_cluster rabbit@<你的主机名>
      • rabbitmqctl -n rabbit1 start_app
      • rabbitmqctl -n rabbit2 stop_app
      • rabbitmqctl -n rabbit2 reset
      • rabbitmqctl -n rabbit2 join_cluster rabbit@<你的主机名>
      • rabbitmqctl -n rabbit2 start_app
    • 验证
      • rabbitmqctl cluster_status
  • 多机部署要点
    • 同步 Erlang Cookie、配置 /etc/hosts、确保 4369(epmd)、25672(集群分发)等端口放通,再按上述 join_cluster 步骤组建集群。

三 使用 HAProxy 进行负载均衡

  • 安装与启用
    • sudo apt-get update && sudo apt-get install haproxy
    • sudo systemctl enable --now haproxy(安装后通常已自动启动)
  • 配置示例(/etc/haproxy/haproxy.cfg)
    • 统计页面
      • listen stats
        • bind *:8100
        • mode http
        • stats enable
        • stats realm Haproxy\ Statistics
        • stats uri /
        • stats auth admin:admin
    • AMQP 负载均衡(TCP 转发,轮询,健康检查)
      • listen rabbitmq
        • bind *:5670
        • mode tcp
        • balance roundrobin
        • server rabbit1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
        • server rabbit2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
        • server rabbit3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
  • 应用与验证
    • sudo systemctl restart haproxy
    • 客户端连接 5670 端口即可被轮询分发到后端节点;访问 http://<负载均衡器IP>:8100/ 查看状态与健康检查情况。

四 高可用与队列镜像

  • 在仅“集群”形态下,队列默认只存在于创建它的节点,其他节点故障会导致不可达。为提升可用性,配置队列镜像(策略示例):
    • rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
    • 说明:上述策略会对匹配 ^ 的所有队列做全量镜像,生产环境可按需调整匹配规则与策略名称,以平衡一致性与性能。

五 生产注意事项与常见问题

  • 单点防护:单个 HAProxy 仍可能成为单点,建议部署 Keepalived + VIP 或多实例 HAProxy 做主备/集群。
  • 节点类型:集群中应保证至少一个 磁盘节点(disc),通常将 RAM 节点disc 节点 混合部署;节点类型可在停机后通过 rabbitmqctl change_cluster_node_type 调整。
  • 用户与权限:远程访问管理界面需创建管理员用户(默认 guest/guest 仅本地可登录),并为应用分配最小权限的专用账户。
  • 端口与连通性:放通 5672(AMQP)、15672(管理)、4369/25672(集群/分发)及负载均衡器与健康检查端口;多机环境优先使用主机名或内网 IP,避免依赖 localhost。
  • 健康检查与观察:HAProxy 的 inter/rise/fall 参数可调节探测频率与恢复条件;结合 /stats 页面与 rabbitmqctl cluster_status 持续观察节点与队列状态。

0