Ubuntu 上构建 RabbitMQ 高可用方案
一 架构选型与节点规划
- 推荐采用3 节点集群(奇数节点便于达成多数派),节点类型包含磁盘节点与内存节点:至少保留1 个磁盘节点以持久化元数据,生产常用组合为2 磁盘 + 1 内存以兼顾可靠性与吞吐。
- 队列类型优先选择仲裁队列(Quorum Queues),基于 Raft 共识算法,提供更强的一致性与自动故障转移;经典镜像队列(Classic Mirrored Queues)已不推荐,且在 3.13+ 默认禁用。
- 典型拓扑与适用场景如下:
| 方案 |
节点类型 |
适用场景 |
关键点 |
| 经典稳健型 |
2 磁盘 + 1 内存 |
通用生产 |
元数据冗余,性能与可靠性平衡 |
| 极致性能型 |
1 磁盘 + 2 内存 |
高吞吐、可接受元数据风险 |
唯一磁盘节点为单点,维护需严格顺序 |
| 极致可靠型 |
3 磁盘 |
强一致与容灾要求高 |
容错更强,写入受磁盘 IO 约束 |
| 仲裁队列要求集群规模≥3,更利于在分区时保持数据安全与可用性。 |
|
|
|
二 环境准备与安装
- 系统要求:Ubuntu 22.04/20.04,节点间可互通,建议通过 /etc/hosts 或 DNS 完成主机名解析;开放端口:5672(AMQP)、15672(管理)、15692(Prometheus)。
- 安装步骤(以 Ubuntu 22.04 为例):
- 安装 Erlang(推荐 OTP 24+)与 RabbitMQ 官方仓库:
sudo apt-get update
sudo apt-get install -y curl gnupg apt-transport-https
echo “deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main” | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.E495BB49CC4BBE5B.key | sudo apt-key add -
sudo apt-get update && sudo apt-get install -y rabbitmq-server
- 启用管理插件并验证:
sudo rabbitmq-plugins enable rabbitmq_management
访问 http://<节点IP>:15672(默认账号 guest/guest,仅本机可访问,生产请创建管理员并限制来源)。
- 基础配置(/etc/rabbitmq/rabbitmq.conf):
listeners.tcp.default = 5672
management.tcp.port = 15672
vm_memory_high_watermark.relative = 0.7
disk_free_limit.absolute = 50MB
- 如需指标监控,启用 Prometheus 插件:
sudo rabbitmq-plugins enable rabbitmq_prometheus
抓取 http://<节点IP>:15692/metrics。
三 集群搭建与网络分区策略
- 统一 Erlang Cookie(节点间认证):
确保 /var/lib/rabbitmq/.erlang.cookie 内容一致,权限 400,属主 rabbitmq:rabbitmq。
- 主机名解析(示例):
echo “192.168.1.10 node1\n192.168.1.11 node2\n192.168.1.12 node3” | sudo tee -a /etc/hosts
- 加入集群(在 node2、node3 上执行,node1 为磁盘节点):
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@node1 --ram # 不加 --ram 为磁盘节点
sudo rabbitmqctl start_app
sudo rabbitmqctl cluster_status # 验证集群成员与运行状态
- 网络分区处理(生产建议):
在 /etc/rabbitmq/rabbitmq.conf 设置:cluster_partition_handling = pause_minority(少数分区自动暂停,避免脑裂)。
- 单机多实例演练(可选,便于本地验证):
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
之后按上述步骤将 rabbit1、rabbit2 加入 rabbit 集群。
四 高可用队列与策略配置
- 仲裁队列(推荐):在客户端声明队列时指定参数 x-queue-type=quorum,例如(Java 伪代码):
channel.queueDeclare(“my-quorum-queue”, true, false, false,
ImmutableMap.of(“x-queue-type”, “quorum”));
特点:基于 Raft 的一致性复制、自动选主、分区时优先数据安全。
- 经典镜像队列(不推荐,仅存量兼容):通过策略将队列镜像到多个节点,例如:
rabbitmqctl set_policy ha-all “^ha\.” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
注意:经典镜像队列在现代版本中已不推荐,存在分区场景数据丢失风险。
- 运维提示:仲裁队列以磁盘 IO 为主,确保磁盘性能与空间;镜像队列以内存为主,需关注内存压力。
五 负载均衡与监控告警
-
负载均衡(HAProxy 示例,面向 AMQP 5672 与管理 15672):
frontend rabbitmq-amqp
bind *:5672
default_backend rabbitmq-nodes
backend rabbitmq-nodes
balance roundrobin
server node1 192.168.1.10:5672 check
server node2 192.168.1.11:5672 check
server node3 192.168.1.12:5672 check
frontend rabbitmq-mgmt
bind *:15672
default_backend rabbitmq-mgmt-nodes
backend rabbitmq-mgmt-nodes
balance roundrobin
server node1 192.168.1.10:15672 check
server node2 192.168.1.11:15672 check
server node3 192.168.1.12:15672 check
-
监控与告警:启用 Prometheus 插件,抓取 15692/metrics,重点监控队列积压、节点内存与磁盘剩余;结合 Grafana 可视化并设置阈值告警。
-
快速验证:
- 管理界面:访问 http://<LB或节点IP>:15672 查看节点、队列与连接状态;
- 集群状态:执行 rabbitmqctl cluster_status 检查成员与运行状态;
- 端口连通:netstat -tulnp | grep -E “5672|15672”。