diff --git a/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md b/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md index 7ad6f992..7f7320e2 100644 --- a/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md +++ b/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md @@ -38,9 +38,15 @@ RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模 所以这个事儿就比较尴尬了,这就**没有什么所谓的高可用性**,**这方案主要是提高吞吐量的**,就是说让集群中多个节点来服务某个 queue 的读写操作。 -#### 镜像集群模式(高可用性) +#### 镜像集群模式(⚠️ 已废弃,自 RabbitMQ 4.0 起被移除) -这种模式,才是所谓的 RabbitMQ 的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论是元数据还是 queue 里的消息都会**存在于多个实例上**,就是说,每个 RabbitMQ 节点都有这个 queue 的一个**完整镜像**,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把**消息同步**到多个实例的 queue 上。 +⚠️ **重要提示**:镜像集群模式已在 **RabbitMQ 4.0** 中完全移除,不再可用。此模式存在严重的性能和扩展性问题——消息需同步到所有节点,带宽消耗大;queue 负载无法线性扩展。 + +**推荐方案**:使用下一节介绍的 **Quorum Queues(仲裁队列)**,基于 Raft 共识算法,提供更好的数据一致性、自动故障转移和线性扩展能力。 + +> 有关迁移指南,请参阅 [RabbitMQ 官方文档](https://www.rabbitmq.com/quorum-queues.html)。 + +这种模式,才是所谓的 RabbitMQ 的高可用模式(现已废弃)。跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论是元数据还是 queue 里的消息都会**存在于多个实例上**,就是说,每个 RabbitMQ 节点都有这个 queue 的一个**完整镜像**,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把**消息同步**到多个实例的 queue 上。 ![mq-8](./images/mq-8.png) @@ -48,6 +54,36 @@ RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模 这样的话,好处在于,你任何一个机器宕机了,没事儿,其它机器(节点)还包含了这个 queue 的完整数据,别的 consumer 都可以到其它节点上去消费数据。坏处在于,第一,这个性能开销也太大了吧,消息需要同步到所有机器上,导致网络带宽压力和消耗很重!第二,这么玩儿,不是分布式的,就**没有扩展性可言**了,如果某个 queue 负载很重,你加机器,新增的机器也包含了这个 queue 的所有数据,并**没有办法线性扩展**你的 queue。你想,如果这个 queue 的数据量很大,大到这个机器上的容量无法容纳了,此时该怎么办呢? + +#### Quorum Queues(仲裁队列,推荐) + +从 RabbitMQ 3.8 版本开始,引入了 Quorum Queues(仲裁队列)作为新的高可用解决方案,旨在替代传统的镜像集群模式。 + +**核心原理**:基于 Raft 共识算法,Quorum Queues 在多个节点之间通过 quorum 复制实现数据一致性。 + +**主要优势**: +- **数据一致性**:基于 Raft 算法,保证消息在 quorum 多数节点确认后才算写入成功 +- **自动故障转移**:leader 节点宕机后,自动重新选举,无需手动干预 +- **线性扩展**:可以独立扩展副本数量,不受单节点容量限制 +- **持久化优化**:支持段式存储,滚动刷新时性能更优 + +**配置示例**: +```bash +rabbitmqctl set_policy ha-quorum "^quorum\." '{"ha-mode":" quorum"}' +``` + +**适用场景**: +- 对数据可靠性要求高的生产环境 +- 需要更好扩展性的分布式部署 +- 替代传统镜像集群模式的升级路径 + +**注意事项**: +- Quorum Queues 仅支持持久化消息(persistent),不适用于临时队列 +- 资源消耗高于普通队列,需合理规划节点数量 +- 最低需要 3 节点才能形成有效的 quorum + +**迁移建议**:对于现有使用镜像集群的队列,建议逐步迁移到 Quorum Queues。迁移过程中需注意消息持久化配置和消费者兼容性。 + ### Kafka 的高可用性 Kafka 一个最基本的架构认识:由多个 broker 组成,每个 broker 是一个节点;你创建一个 topic,这个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据。