Skip to content

高可用架构

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、复制延迟和死信;
  • 演练跨集群切换与回切,而不只做单节点重启。

参考资料