共识算法中 Follower 落后应该如何监控?
简化版
Follower 落后不能只看日志索引差,还要看时间差、字节差、状态机应用差和是否需要快照。 核心指标包括 Leader commitIndex、各 Follower matchIndex/appliedIndex、最近成功复制时间、复制吞吐、拒绝与重试、快照安装状态。 告警要结合写入速率和角色:差 1000 条在低流量时严重,在每秒 10 万条时可能只是 10 ms。
详细版
复制落后可定义为 commitIndex 减 matchIndex,应用落后为 commitIndex 减 appliedIndex。 前者说明日志尚未追到,后者说明日志已收到但状态机执行慢。 若日志条目大小差异大,还要统计 backlog bytes 与预计追平时间。
监控按节点、故障域和多数派健康聚合,避免每个日志 index 形成高基数时序。 持续落后节点会延长故障恢复、阻碍日志压缩,并在成为 Leader 时影响可用性。 处置前先区分网络、磁盘、CPU、状态机慢、快照传输和限速,而不是立即重启。
完整版教学
一、“落后”至少有两层
Follower 的日志可能尚未接收,也可能日志已接收却尚未应用。 只看最后日志 index 会把两种问题混在一起。
matchIndex 看复制进度,appliedIndex 看业务状态机进度;二者都要与 Leader 的提交边界比较。
二、核心指标定义
replication_lag_entries = leader_commit_index - follower_match_index
apply_lag_entries = leader_commit_index - follower_applied_index
catch_up_eta = backlog_bytes / effective_replication_bytes_per_sec
还要记录 last_ack_age、AppendEntries 延迟、失败率、冲突回退次数和当前 term。 索引不是时间,最好为已提交位置附加观测时间以估算秒级滞后。
三、为什么条数不足够
1000 条每条 100 B 只有约 100 KB,1000 条每条 1 MB 则近 1 GB。 相同 index gap 的网络与磁盘代价完全不同。
| 维度 | 能发现的问题 |
|---|---|
| entries gap | 逻辑进度 |
| bytes backlog | 传输与磁盘工作量 |
| seconds behind | 业务新鲜度 |
| apply gap | 状态机瓶颈 |
| snapshot status | 日志已压缩后的恢复路径 |
四、落后的常见原因
网络丢包和带宽不足会降低 AppendEntries 吞吐。 磁盘 fsync 慢导致持久化响应变慢。 Follower CPU/GC 暂停会同时影响复制与应用。 状态机涉及慢磁盘或大命令时 appliedIndex 单独落后。 Leader 对追赶流量限速过低,或快照与正常复制争用资源,也会延长恢复。
五、告警应使用持续时间和 SLO
瞬时 spike 不必告警,持续 5 分钟无法缩小的 backlog 更值得关注。 例如要求“任一故障后 10 分钟内副本追平,正常时 99% Follower 落后少于 2 秒”。 还要单独告警 quorum 风险:5 节点中两个严重落后,再坏一个节点就可能失去多数派。 Learner 落后的严重度可低于 voter,但会影响扩容完成时间。
六、快照边界
若 Follower 所需日志已被 Leader 压缩,只增加复制重试没有意义。 系统应切换为安装快照,监控 snapshot size、进度、耗时、失败和 lastIncludedIndex。 安装期间剩余日志仍增长,需要评估快照完成后的 tail catch-up。 频繁重复安装快照通常说明传输不稳、快照过大或压缩保留窗口过短。
七、定位和处置
先比较同故障域其他节点,判断节点问题还是网络/Leader 问题。 再看复制吞吐与写入吞吐:追赶速度必须长期大于新日志产生速度。 状态机慢则优化 apply,磁盘慢则检查 fsync、IO 饱和与队列。 不要盲目重启落后 Follower;重启可能丢失内存进度并再次触发大快照。
八、常见误区与追问
- 误区:日志 index 差就是延迟秒数。 需要结合写入速率和提交时间。
- 误区:lastLogIndex 追平就能服务最新读。 appliedIndex 可能仍落后。
- 误区:Follower 落后不影响写。 voter 响应慢会降低可用冗余,特定 quorum 下也会影响提交。
- 误区:落后就重启最有效。 可能触发更重的快照恢复。
- 追问:如何估算追平时间? backlog bytes 除以扣除新写后的净追赶吞吐。
- 追问:何时用快照? 需要的日志已被压缩,或逐条追赶成本明显更高时。
- 追问:最关键的告警是什么? 持续不收敛、apply 卡住和多数派冗余下降。
九、加强记忆
- 区分复制落后与应用落后。
- 同时看条数、字节、秒数和快照进度。
- 告警结合写入速率、持续时间和 quorum 风险。
- 追赶净吞吐必须高于新日志增长。
- 按网络、磁盘、CPU、状态机和快照逐层定位,避免盲目重启。