RabbitMQ 在 Ubuntu 的高可用方案
一、总体架构思路
- 在 Ubuntu 上构建高可用通常从三方面入手:
- 搭建 RabbitMQ 集群(多节点共享元数据);
- 选择具备强一致性的 队列类型(仲裁队列);
- 在接入层使用 HAProxy 做连接负载均衡与健康检查。
- 集群节点类型包含 磁盘节点 与 内存节点,生产环境建议至少保留 1 个磁盘节点 以持久化元数据,并可按需加入内存节点提升性能。
- 客户端通过 5672(AMQP)与 15672(管理)访问,接入层统一暴露 VIP/域名,避免直连单点。
二、方案对比与适用场景
| 方案 |
架构要点 |
优点 |
局限与注意 |
适用场景 |
| 集群 + 仲裁队列(Quorum Queues) |
基于 Raft 共识;建议 3 节点(奇数更佳);队列数据多副本 |
强一致性、自动选主、运维简单、官方推荐 |
吞吐略低于镜像队列;网络分区时优先一致性 |
对数据可靠性要求高的核心业务 |
| 集群 + 经典镜像队列(Classic Mirrored Queues) |
通过策略将队列镜像到多个节点 |
配置灵活、生态成熟 |
官方已不推荐;分区时可能丢消息;脑裂风险 |
存量系统兼容与平滑迁移 |
| 单机多实例(测试/演练) |
同一台机器启动多个节点(不同 RABBITMQ_NODENAME 与端口) |
快速验证集群流程与策略 |
非生产用途,存在单机关联故障 |
开发/CI 验证 |
| 接入层负载均衡(HAProxy) |
对 5672/15672 做 TCP/HTTP 健康检查与轮询 |
隐藏后端拓扑、故障节点自动摘除 |
需正确配置健康检查与统计页面 |
生产接入标准化 |
说明:仲裁队列为 3.8+ 引入,强调数据安全与一致性;经典镜像队列在新版本中已不推荐;HAProxy 常用于对 AMQP 与管理端口做负载均衡与健康检查。
三、落地步骤要点
- 准备与版本
- 选择 Ubuntu 22.04/24.04,安装匹配版本的 Erlang/OTP 与 RabbitMQ 3.12.x/3.13.x;启用管理插件(默认 15672 端口)。
- 集群搭建
- 多机:确保节点名唯一(形如 rabbit@hostname),Erlang Cookie 一致,使用
rabbitmqctl join_cluster 组成集群;
- 单机多实例:通过环境变量指定不同 RABBITMQ_NODENAME 与 RABBITMQ_NODE_PORT,必要时为管理插件指定不同端口(如 15672/15673/15674)。
- 队列选型与创建
- 新业务优先声明 仲裁队列(客户端设置队列参数
x-queue-type: quorum);
- 存量业务若使用镜像队列,可通过策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' 配置,但建议规划迁移至仲裁队列。
- 接入层与健康检查
- 使用 HAProxy 对 5672 做 TCP 健康检查与轮询,对 15672 暴露统计页面(如 /stats),便于观测后端节点状态与摘除异常实例。
四、生产实践清单
- 节点与一致性:至少 3 节点 且为奇数;至少 1 个磁盘节点;优先 仲裁队列;镜像队列仅作兼容过渡。
- 接入与故障隔离:通过 HAProxy 统一暴露 5672/15672,开启健康检查与统计;应用使用连接池与重试,避免单点依赖。
- 运维与观测:启用管理插件(15672),定期检查 /var/log/rabbitmq/ 日志、内存与磁盘水位(如
vm_memory_high_watermark.relative、disk_free_limit.absolute),并验证分区处理策略。