搭建一个高可用(High Availability, HA)的 RocketMQ 生产环境,最少需要 3 台 服务器。
这是基于 RocketMQ 经典的 NameServer + Broker(主从架构) 部署模式得出的结论,具体分析如下:
1. 核心组件与角色分配
在最小化的高可用架构中,我们需要保证 NameServer 集群和 Broker 集群都不存在单点故障。
-
NameServer 集群:
- 需求:至少 2 个节点(通常建议奇数节点以符合多数派原则,但 2 个节点也能通过“脑裂”处理机制维持基本服务,不过生产环境推荐 3 个)。
- 作用:负责路由信息的维护。如果只有 1 台,宕机后客户端无法发现 Topic 或队列信息,导致服务不可用。
- 部署策略:为了节省资源,通常将 NameServer 部署在 Broker 所在的机器上,或者独立部署。在 3 台服务器的场景下,我们通常让每台机器都运行 NameServer。
-
Broker 集群(主从复制):
- 需求:至少 2 个节点(1 个 Master + 1 个 Slave),且必须跨机房或跨节点部署以保证数据不丢失。
- 作用:负责消息的存储和转发。
- 高可用逻辑:当 Master 挂掉时,Slave 可以自动或手动提升为 Master,保证服务不中断。
- 部署策略:在 3 台服务器的限制下,我们可以采用 双主双从 或 一主两从 的混合部署,但最经典的最小高可用组合是 2 个 Broker 节点(1M1S)。
2. 推荐的 3 台服务器拓扑方案
在 3 台物理机(或虚拟机)上,最稳健且资源利用率合理的部署方式如下:
| 服务器 IP | 部署组件 | 说明 |
|---|---|---|
| Node A | NameServer (1), Broker-Master-0, Broker-Slave-0 | 作为主 Master 节点,同时承担部分 NameServer 负载。 |
| Node B | NameServer (2), Broker-Slave-1 | 作为 Slave-0 的从节点,同时承担 NameServer 负载。 |
| Node C | NameServer (3), Broker-Master-1 (可选) | 作为独立的 NameServer 节点,并作为第二个 Broker 组的主节点(形成双主多从)。 |
更极简的 3 节点高可用配置(推荐):
为了严格满足“最少”且“高可用”,通常采用以下配置:
- NameServer: 3 个节点(A、B、C 各一个),组成集群。任意一台宕机不影响路由发现。
-
Broker: 2 个节点(例如 A 和 B 组成一对 Master-Slave,C 单独作为另一个 Broker 节点或备用)。
- 最佳实践配置:
- Master 0 部署在 Node A。
- Slave 0 部署在 Node B(同步复制)。
- Master 1 部署在 Node C(可选,视流量而定,若只需一组高可用,则 Node C 仅跑 NameServer)。
修正后的“绝对最少”高可用模型(1 组 M+S + 3 个 NS):
实际上,只要 NameServer 有 2 个以上 且 Broker 有 1 对 M+S 即可。- Node A: NameServer, Broker-Master
- Node B: NameServer, Broker-Slave
- Node C: NameServer (纯 NS 节点,用于防止 A/B 同时故障导致 NS 集群过半数宕机)
注意:如果只部署 2 台服务器,虽然可以实现 Broker 主从(A: M, B: S),但 NameServer 如果只部署 2 台,一旦其中一台宕机,集群可能进入不稳定状态(取决于配置),且无法应对网络分区。因此 3 台 是保证 NameServer 多数派(Quorum)和 Broker 主从容灾的最小安全线。
- 最佳实践配置:
3. 为什么不能少于 3 台?
- 2 台服务器的情况:
- 如果部署 2 台 NameServer 和 1 组 Broker(1M1S)。
- 风险:当某一台服务器宕机时,剩下的那台服务器既要提供 NameServer 服务(此时 NameServer 集群只剩 1 个,属于少数派,可能触发脑裂保护或无法投票),又要承载 Broker 业务。如果该机器磁盘 IO 压力大,可能导致整个集群雪崩。此外,NameServer 集群在偶数节点下,网络分区时的行为不如奇数节点稳定。
- 结论:2 台只能算“简易高可用”,在生产环境中不被视为标准的高可用架构。
总结
要搭建一个标准的、具备容灾能力(No Single Point of Failure)的 RocketMQ 生产环境:
- 最少服务器数量:3 台。
- 部署建议:
- 每台机器部署 1 个 NameServer(共 3 个,构成稳定集群)。
- 部署 2 个 Broker 节点(1 个 Master + 1 个 Slave,分布在不同的两台机器上,实现数据冗余)。
- 第三台机器作为 NameServer 的补充,同时也应预留 Broker 扩展空间。
额外提示:在生产环境中,除了服务器数量,还需要配合 Keepalived/VIP(可选)、负载均衡器(如 Nginx/LVS 做客户端接入层)以及 监控告警系统(Prometheus + Grafana)来构建完整的高可用体系。
CLOUD云枢