为什么会“越跑越慢”

Raft 日志长期不压缩会拖慢重放与追赶;但压缩过于激进又会让慢 follower 频繁走全量快照,网络和磁盘双杀。

压缩策略建议

  • 用“日志条目数 + 磁盘占用”双阈值触发快照。
  • 快照频率按写入速率自适应,而不是固定分钟数。
  • 仅在 commit index 安全推进后截断日志。

安装快照时的工程点

  1. 分块传输并带 offset 校验。
  2. 最后一块再原子切换状态机数据目录。
  3. 快照应用期间限制客户端写入峰值。

Go 侧接口设计

type SnapshotStore interface {
    Create(meta SnapshotMeta) (io.WriteCloser, error)
    Open(id string) (io.ReadCloser, SnapshotMeta, error)
    List(limit int) ([]SnapshotMeta, error)
}

常见故障

  • 截断日志早于快照持久化完成,导致节点重启后状态缺口。
  • 快照元数据未纳入 WAL,断电恢复后索引错位。
  • 对慢 follower 缺少限流,拖累 leader。

小结

Raft 的可用性不只来自选主,更来自“日志、快照、复制窗口”三者的节奏匹配。压缩策略设计得当,集群才能长期平稳运行。