这是《RocketMQ 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 刷盘决定单机数据在机器故障下的持久性,复制决定多机数据在节点故障下的可用性。RocketMQ 的可靠性不是单个开关,而是“客户端确认 + 刷盘策略 + 复制策略 + 故障切换 + 运维流程”的组合结果。
16.1 可靠性层次
Producer receive OK
-> Broker memory
-> local disk
-> replica memory
-> replica disk
每前进一层,抗故障能力增强,延迟和成本也增加。
| 故障 | 需要的保护 |
|---|---|
| 生产进程崩溃 | 发送状态与补偿 |
| Broker 进程崩溃 | 操作系统页缓存 |
| 宿主机断电 | 本地刷盘 |
| 单机磁盘损坏 | 异地副本或备份 |
| 机房故障 | 跨可用区或跨地域容灾 |
16.2 同步刷盘与异步刷盘
| 模式 | 返回时机 | 特点 |
|---|---|---|
| SYNC_FLUSH | 消息落盘后返回 | 单机可靠性高,延迟受磁盘影响 |
| ASYNC_FLUSH | 写入后异步刷盘 | 吞吐高,宿主机断电可能丢失 |
异步刷盘并非没有价值。配合同步复制和多副本,可以在性能与可靠性之间取得平衡。
选择建议:
- 交易、支付、账务类事件优先高可靠配置;
- 行为日志可接受较低成本配置;
- 性能结论必须基于自身磁盘和压测;
- 任何模式都要有业务对账;
- 不要只看参数名,要确认版本语义。
16.3 复制模式
传统主从模式常见配置:
| 模式 | 说明 |
|---|---|
| SYNC_MASTER | 主节点等待至少一个从节点确认 |
| ASYNC_MASTER | 主节点不等待从节点 |
| SLAVE | 只读副本,可承载消费拉取 |
同步复制流程:
master append message
-> flush local
-> replicate to slave
-> slave persist
-> slave ack
-> master return success
异步复制流程:
master append message
-> return success
-> replicate later
16.4 高可用架构演进
常见模式:
- 主从读写分离;
- DLedger 自动切换;
- Controller 模式;
- 5.x Proxy 与计算存储分离;
- 云托管多可用区部署。
演进逻辑:
手工运维
-> 自动选主
-> 元数据中心化
-> 计算接入层与存储层解耦
不同模式的部署要求、客户端兼容性和恢复行为不同,不能只比较功能名。
16.5 副本一致性
关注三个位点:
| 位点 | 含义 |
|---|---|
| master commit offset | 主节点已确认位点 |
| slave replica offset | 从节点已复制位点 |
| consumer offset | 消费组确认位点 |
故障切换时必须处理:
- 未复制到新主的尾部消息;
- 消费位点是否超过数据位点;
- 老主恢复后是否脑裂;
- 客户端路由何时更新;
- 事务和定时消息状态;
- 运维操作审计。
16.6 脑裂与 fencing
脑裂指两个节点同时认为自己是主。常见防线:
- Controller 或 DLedger 多数派仲裁;
- epoch 或 term 递增;
- 共享磁盘锁;
- 客户端路由校验;
- 网络分区时禁止双写;
- 恢复流程强制对齐位点。
生产环境不应只依赖人工确认角色,要依赖仲裁机制和版本 fencing。
16.7 跨可用区部署
典型拓扑:
zone A: broker-a-master, broker-b-replica
zone B: broker-a-replica, broker-b-master
收益:
- 单可用区故障可恢复;
- 流量分布更均衡;
- 副本不集中在一个故障域。
代价:
- 同步复制延迟增加;
- 带宽成本增加;
- 运维复杂度提高;
- 机房间网络抖动影响写入;
- 需要验证 NameServer 与客户端路由策略。
16.8 监控与演练
指标:
broker_flush_latency_ms
replica_sync_latency_ms
replica_diff_bytes
broker_role
broker_epoch
unsynced_replica_count
master_changes_total
disk_usage_ratio
必做演练:
- kill Broker 进程;
- 宿主机断电重启;
- 断开从节点网络;
- 机房间网络抖动;
- 磁盘故障;
- 主从位点不一致恢复;
- 客户端重连和路由更新。
16.9 常见问题
| 现象 | 排查 |
|---|---|
| 发送延迟高 | 同步刷盘慢、同步复制等待 |
| 从节点落后 | 网络带宽、从节点磁盘、写入热点 |
| 切主后消息缺失 | 异步复制尾部未同步 |
| 双主 | 仲裁异常、配置错误、脑裂 |
| 副本无法同步 | 角色、地址、权限、版本 |
| 磁盘告警 | 保留策略、消费落后、容量不足 |
本章小结
刷盘和复制决定消息持久化边界。同步刷盘增强单机断电能力,同步复制增强节点故障能力,自动选主增强可用性,但都伴随延迟与成本。生产设计要明确业务容忍度,压测验证,并持续监控副本差距和演练故障恢复。
思考题
- 异步刷盘最怕什么故障?
- 同步复制能防止磁盘损坏导致的丢失吗?
- 为什么切主可能造成尾部消息差异?
- 脑裂为什么必须依赖仲裁和 fencing?
- 跨可用区部署的主要代价是什么?