高可用架构
RocketMQ 高可用由路由发现、Broker 数据副本、自动选主、客户端容错和消费进度共同构成。NameServer 提供路由发现,但不负责消息副本一致性,也不是 Broker 自动选主模块。
高可用模块
| 模块 | 高可用职责 | 关键边界 |
|---|---|---|
| NameServer | 保存和提供 Topic 路由 | 节点之间不做强一致复制,不保存消息 |
| Broker 副本 | 复制 CommitLog 等业务数据 | 同步/异步复制决定数据风险和延迟 |
| Controller | 管理支持模式下的副本选主 | 需要自身形成高可用部署 |
| DLedger | 基于 Raft 的日志复制与自动选主方案 | 与普通静态 Master/Slave 部署方式不同 |
| Proxy | 为 5.x gRPC 客户端提供接入 | 多实例可用不等于 Broker 数据已有副本 |
| 客户端 | 缓存路由、重试和切换 Broker | 发送超时可能产生不确定结果和重复 |
NameServer 高可用
部署多个相互独立的 NameServer,Broker 向全部 NameServer 注册路由,客户端配置多个地址。单个 NameServer 故障时,客户端可从其他节点获取路由。
因为 NameServer 之间不使用强一致共识,同一时刻的路由视图可能短暂不同。它适合轻量发现,不负责判定哪份消息副本可以成为 Master。
静态 Master/Slave
传统模式由固定 Master 接收主要读写,Slave 复制数据:
- Async Replication:Master 不等待 Slave 完成复制即可返回,延迟较低但可能丢失尾部数据;
- Sync Replication:等待 Slave 到达确认边界,可靠性更高但会增加延迟,并受 Slave 状态影响;
- Sync/Async Flush 决定本机磁盘持久化边界,与副本复制是两个独立维度;
- 静态 Master/Slave 本身不一定具备自动主从切换。
Controller 与自动选主
Controller 模式负责 Broker 副本状态和 Master 选举,使 Master 故障后可从合适的副本自动选出新 Master。Controller 自身也需要奇数节点和多数派。
启用前应核对目标版本支持的副本模式、Broker Identity、复制确认和兼容客户端。不能在未迁移存储与元数据的情况下把静态 Slave 直接视为可自动选举副本。
DLedger 是另一条基于 Raft 的自动选主和复制路线。选择 Controller 还是 DLedger 应按目标版本、既有部署和官方迁移路径决定,不应同时拼接两套选主逻辑。
Producer 容错
Producer 从 NameServer 获取多个 MessageQueue 路由,并可在发送失败时尝试其他 Broker。要达到期望可靠性,还需处理:
- 同步、异步或 One-Way 发送的结果边界;
- 发送超时后的幂等重试;
- 故障规避与路由缓存刷新;
- 顺序消息不能随意切换 MessageQueue,否则会破坏顺序边界;
- 事务消息 Producer Group 和事务回查实例的可用性。
Consumer 容错
Clustering 模式下,Consumer Group 成员故障会触发负载重新分配,其他实例接管 MessageQueue。消费进度恢复后仍可能重新处理最后一批消息,因此业务必须幂等。
顺序消费时,某个 MessageQueue 或 MessageGroup 的故障消息可能阻塞后续消息。高可用设计还要包含重试上限、死信和人工处置,而不是无限重试。
故障矩阵
| 故障 | 预期行为 | 风险与限制 |
|---|---|---|
| 单 NameServer 故障 | 客户端使用其他 NameServer 或缓存路由 | 新路由传播可能延迟 |
| Async Master 故障 | 客户端切换可用 Broker | 未复制尾部消息可能丢失 |
| Sync 副本不足 | 写入延迟或失败,取决于确认配置 | 用可用性换取数据安全 |
| Controller 少数故障 | 多数派仍在时继续选主 | 容错余量下降 |
| Proxy 故障 | 客户端切换其他 Proxy | 未明确结果的请求可能重试重复 |
| Consumer 故障 | 同组实例重新分配队列 | 可能重复消费 |
跨地域灾备
单集群副本主要解决节点或机房内故障。跨地域需要独立集群、消息复制或业务双写方案,并明确异步复制 RPO、流量切换、消费进度、重复和回切流程。
验证清单
- 分别停止 NameServer、Proxy、Master、Slave 和 Consumer;
- 验证同步/异步复制下的实际消息丢失边界;
- 验证 Controller 或 DLedger 多数派和自动选主;
- 验证事务消息回查、顺序消息和消费重试;
- 比较 Broker Max Offset、Consumer Offset、复制延迟和死信;
- 演练跨集群切换与回切,而不只做单节点重启。