在 Ubuntu 上实现 RabbitMQ 高可用
一、架构与前置准备
- 架构建议:部署至少 3 个节点的集群,节点类型包含 磁盘节点(disc) 与 内存节点(ram),其中磁盘节点至少 1 个(推荐 2 个),用于保障元数据与队列恢复能力。
- 版本建议:优先使用 RabbitMQ 3.13+,队列类型优先选择 Quorum Queues(基于 Raft,强一致、自动选主),避免继续使用已弃用的 Classic Mirrored Queues。
- 主机名与解析:各节点主机名需可互相解析(/etc/hosts 或 DNS),节点名形如 rabbit@。
- 端口放通:确保节点间与客户端访问所需端口开放:4369(EPMD)、25672(Erlang 分布式)、5672(AMQP)、15672(管理界面)。
- 一致性配置:建议将队列类型设置为 quorum 以获得更强的一致性与故障恢复能力。
二、安装与集群搭建步骤
- 安装 RabbitMQ(所有节点)
- 安装 Erlang 与 RabbitMQ(Ubuntu 22.04 示例):
- sudo apt-get update && sudo apt-get install -y erlang rabbitmq-server
- 启动服务并启用管理插件:
- sudo systemctl enable --now rabbitmq-server
- sudo rabbitmq-plugins enable rabbitmq_management
- 访问管理界面:http://<节点IP>:15672(默认账号 guest/guest,仅本地访问;生产请创建管理员用户并赋权)。
- 节点加入集群(以 node1/node2/node3 为例)
- 统一 Erlang Cookie(首次搭建时执行一次即可):
- 在 node1 查看:sudo cat /var/lib/rabbitmq/.erlang.cookie
- 将内容复制到 node2/node3 相同路径,权限设为 400。
- 在 node2、node3 上执行:
- sudo rabbitmqctl stop_app
- sudo rabbitmqctl reset(首次加入集群需要)
- sudo rabbitmqctl join_cluster rabbit@node1(如需内存节点:加入参数 –ram)
- sudo rabbitmqctl start_app
- 验证集群状态:
- sudo rabbitmqctl cluster_status(应看到 3 个节点,并区分 disc/ram 类型)。
- 单机多节点(测试环境)
- 通过环境变量区分节点与端口启动多个实例,再按上述步骤 join_cluster 组成集群。
三、队列高可用与数据保护
- 使用 Quorum Queues(推荐)
- 特性:基于 Raft 共识,提供更强的一致性与自动故障转移;队列至少 3 节点更稳健(奇数更佳)。
- 声明方式(客户端示例):
- channel.queueDeclare(“my-quorum-queue”, true, false, false,
ImmutableMap.of(“x-queue-type”, “quorum”));
- 如需兼容旧系统再考虑 Classic Mirrored Queues(不推荐)
- 策略示例(将队列镜像到所有节点):
- rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
- 消息可靠性要点
- 将队列与消息设为 durable,生产者开启 publisher confirms,消费者使用 手动确认(ack),避免消息丢失与重复消费。
四、入口流量与运维要点
- 负载均衡与健康检查
- 使用 HAProxy 对外暴露 AMQP 5672 与管理 15672,并开启后端健康检查,示例片段:
- frontend rabbitmq bind *:5672
default_backend rabbitmq_nodes
- backend rabbitmq_nodes
balance roundrobin
server rabbit1 192.168.1.101:5672 check
server rabbit2 192.168.1.102:5672 check
server rabbit3 192.168.1.103:5672 check
- 管理界面可通过 HAProxy 统计页(如 :8100/stats)观察节点健康。
- 用户与权限
- 生产环境禁用远程 guest/guest,创建管理员用户并赋权:
- rabbitmqctl add_user admin StrongPass!
- rabbitmqctl set_user_tags admin administrator
- rabbitmqctl set_permissions -p / admin “." ".” “.*”
- 常用运维
- 查看集群:rabbitmqctl cluster_status
- 变更节点类型(需先 stop_app):rabbitmqctl change_cluster_node_type disc|ram
- 移除故障节点:在其他节点执行 rabbitmqctl forget_cluster_node
- 网络与分区
- 保证节点间 4369/25672/5672/15672 端口互通;合理规划 分区(partition) 处理策略,避免脑裂导致的数据不一致。