跳至正文
来两杯美式
返回

消息队列(末):RabbitMQ 集群与高可用四种模式

By 来两杯美式
发布于更新于

RabbitMQ 系列收尾篇。单点 RabbitMQ 在生产就是定时炸弹——机器一挂,业务全瘫。本篇把 RabbitMQ 的四种集群/高可用模式讲透:普通集群、镜像队列、Warren(主备)、Shovel(远程)。生产选哪种、各自的开销与坑,全部摊开讲。

一、四种模式总览

模式别名数据分布高可用典型场景
普通集群元数据共享、消息单点扩展吞吐,不保证 HA
镜像队列Mirror Queue每个节点都有完整副本生产标配(HA)
Warren主备模式主提供读写、备不读写✅(故障切换)小规模、低成本 HA
Shovel远程模式跨数据中心复制✅(异地容灾)异地双活、灾备

生产环境几乎只选镜像队列(或现代的 Quorum Queue)。普通集群是为了扩展、不是为了 HA;Warren 和 Shovel 是特殊场景的补充。

二、普通集群模式

多台机器组成集群,每台机器只记录交换机和绑定信息(元数据),而不记录队列的实际消息数据

RabbitMQ 普通集群:元数据全集群同步、消息数据单点存储

2.1 工作机制

2.2 单点故障

2.3 为什么不让每个节点都存队列数据?

这是 RabbitMQ 设计上很有意思的取舍:

假设一台 1G 内存的机器,队列数据已经撑满。如果每台都存全部队列,再扩容一台 1G 的机器,它还是满的——根本起不到扩容的目的。

所以普通集群选择「消息单点存、元数据全集群共享」,是为了真正能水平扩展存储。代价就是单点故障会丢消息。

2.4 适用场景

三、镜像集群模式

每台机器都有全部队列的镜像,能真正实现高可用。

镜像模式 + HAProxy + KeepAlived:完整的生产 HA 架构

3.1 数据同步机制

发送到镜像队列的消息会同时发送到 master 和所有 slave(就像 fanout 交换机一样):

3.2 为什么所有操作都走 master

除了消息接收(master 和 slave 同时收)外,其他所有动作都只向 master 发送,再由 master 按顺序把结果广播给各 slave:

为什么这么设计? 这与 MySQL 的主从不一样:MySQL 从库是只读的,而 MQ 的 slave 涉及「消费即删除」操作。如果允许直接操作 slave,会出现消息乱序、重复消费。所有操作都从 master 走,能保证:

  • 消息的有序性
  • 消费的不重复

3.3 master 是「队列级」而非「节点级」

不必担心 master 节点压力过大——master 是针对队列而言,不是针对服务器

一台服务器上的 RabbitMQ 实例里,某些队列是主节点,其他队列是从节点——这样负载自然分散到所有节点上,达到负载均衡。

3.4 缺点

3.5 通过 Policy 开启镜像

# 给以 ha. 开头的队列设置镜像策略:所有节点都镜像、自动同步
rabbitmqctl set_policy ha-all "^ha\." \
  '{"ha-mode":"all","ha-sync-mode":"automatic"}'
ha-mode含义
all队列在所有节点上镜像(节点多时开销大)
exactly镜像到指定数量的节点(如 exactly + ha-params: 2 = 主+1 从)
nodes镜像到指定节点名列表

生产推荐 exactly + 2 副本(主+1 从)——既保证 HA,又控制开销。all 模式下节点超过 5 个会明显感觉到同步延迟。

四、Warren 模式(主备模式)

主备模式,也叫 Warren 模式(兔子窝模式):

一般实现为一主一备一主多备

4.1 适用场景

Warren 和镜像队列的本质区别:Warren 的备机不工作,只在主机挂时接管;镜像队列的 slave 始终在工作(接受消息同步)。所以 Warren 资源利用率低,但运维简单

五、Shovel 模式(远程模式)

Shovel 是双活的一种模式——把消息跨数据中心复制,可以跨地域让两个 MQ 互联。

Shovel 远程模式:Goleta → Carpinteria 跨集群消息复制

5.1 工作机制

它是 RabbitMQ 早期的集群架构模型。典型实现:

  1. 把队列分为工作队列(work)和备份队列(backup)
  2. 当监听到工作队列负载过高时,自动投递到 backup 队列
  3. backup 队列与另一集群建立的 Shovel 联系,把数据复制到远端 MQ
  4. 在远端进行消费

5.2 图解

图中的「Shovel 订单处理拓扑」展示了完整流程:

源端(Goleta 仓库集群)                         目标端(Carpinteria 仓库集群)
┌─────────────────────────────────┐           ┌────────────────────────────┐
│  incoming orders exchange       │           │  incoming orders exchange  │
│     │                           │           │     │                      │
│     ├──► warehouse_goleta queue │           │     └──► warehouse_        │
│     │                           │  Shovel   │           carpinteria queue│
│     └──► backup_orders queue ───┼──────────►│  (远端消费)                 │
│                                 │  持续拉取   │                            │
└─────────────────────────────────┘           └────────────────────────────┘

5.3 适用场景

Shovel 与 Federation(联邦)的区别:Shovel 是单方向搬运(source → destination),Federation 是Exchange/Queue 级别的双向联邦。前者轻量、后者灵活。

六、四种模式怎么选

你的需求推荐模式
单机就够、只想练手
想扩展吞吐、不在意 HA普通集群
生产核心业务、要 HA镜像队列(或 Quorum Queue)
小规模、低成本的 HAWarren
跨地域容灾Shovel + 镜像
大规模生产、强一致性Quorum Queue(Raft)

绝大多数团队:从镜像队列起步(3 节点 + exactly + 2 副本),需要异地容灾再加 Shovel。Warren 几乎没人用——它的「备机闲置」实在太浪费。

七、镜像队列 vs Quorum Queue(番外)

这是 2018 年笔记里没有的内容,补在 2026 视角下。

RabbitMQ 官方从 3.8 开始推荐用 Quorum Queue(基于 Raft 的仲裁队列)替代老的镜像队列:

维度镜像队列(Mirror)Quorum Queue
一致性算法自研(master-slave 广播)Raft
数据存储Mnesia基于日志(WAL)
故障切换老 slave 提升Raft 选举
性能较好略低(强一致代价)
未来官方计划废弃主推
启用方式Policy ha-mode声明队列时 x-queue-type: quorum

新项目直接上 Quorum Queue。镜像队列官方明确说要废弃——2026 年起,新建的 RabbitMQ 集群不建议再用 ha-mode 了。

八、小结

RabbitMQ 的集群选型本质上是一道「一致性 vs 性能 vs 复杂度」的三方权衡题:

不管选哪种,单点 RabbitMQ 在生产环境是不可接受的——这是 RabbitMQ 系列最该记住的一句话。


至此「一文拿下 MQ」的 RabbitMQ 部分结束。下一篇切换到 Kafka 系列——讲清它为什么吞吐量这么大、日志结构怎么设计、零拷贝是怎么省时间的。

下一篇「Kafka(上):特性、应用场景与消息传递保障」。

现代视角补一句(2026):到 2026 年,Kafka 已经从「日志专用」全面进入「业务消息」领域——KRaft 去掉 ZK 依赖、Transactions 完善事务消息、Partition Tiered Storage 解决堆积问题。RabbitMQ 和 Kafka 的边界正在模糊。但 RabbitMQ 的复杂路由能力、低延迟 μs 级优势依然独有——选型逻辑还是看场景。


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
查看系列全部文章
  1. 01.消息队列开篇:为什么用 MQ + 主流选型对比
  2. 02.消息队列(中):RabbitMQ 安装与命令速查
  3. 03.消息队列(下):Spring Boot 集成 RabbitMQ 实战
  4. 04.消息队列(末):RabbitMQ 集群与高可用四种模式

上一篇
Kafka(上):特性、应用场景与消息传递保障
下一篇
消息队列(下):Spring Boot 集成 RabbitMQ 实战