Raft 共识算法

Raft 通过领导者选举、日志复制与安全性约束实现共识:客户端请求由领导者追加日志,复制到多数派后提交;任期号与投票约束保证同一任期只有一个领导者。

Raft 是什么

Raft 是一致性共识算法,通过领导者选举、日志复制与安全性约束让多个节点对同一份日志达成一致。客户端请求由领导者追加到本地日志,复制到多数派后提交并应用到状态机,任期号与投票约束保证同一任期最多只有一个领导者。它的设计目标是可理解性,被 etcd、Consul、TiKV 等广泛实现,用于分布式协调、配置中心与元数据存储。

基本信息

角色Leader 领导者、Follower 跟随者、Candidate 候选者
关键机制任期号、随机选举超时、多数派日志复制、成员变更
提交条件日志被多数派节点持久化后即可提交并应用
容量规则三节点容忍一台故障,五节点容忍两台,节点数应为奇数
常见实现etcd、Consul、TiKV、RethinkDB

写入路径(领导者侧)

写入路径(领导者侧)
1. 收到写请求,追加到本地日志(未提交状态)
2. 并行复制日志条目给所有跟随者
3. 多数派确认后提交,并应用到本地状态机
4. 返回结果;跟随者随提交位置向前应用日志

运维关注点

事项说明风险
节点数通常部署 3 或 5 个投票节点偶数节点不增加容错反而增加故障域
时钟与超时选举超时随机化避免选票分裂网络抖动频繁触发重新选举
快照日志过大时压缩为快照快照过慢导致追赶时间过长
成员变更按单节点逐步变更一次性替换多数节点可能丢失多数派
磁盘日志持久化依赖 fsync磁盘抖动直接影响写入延迟
多数派是提交条件也是可用性边界:三节点集群失去两台后无法写入,这是设计上的正确行为而非故障。
跨越两个机房部署而多数派在同一机房,机房级故障时另一侧无法选出领导者,需按容灾目标安排节点分布。

易错点

  • 把多数派复制理解为所有节点确认,写入延迟评估错误
  • 忽略成员变更流程,一次性替换多数节点导致集群失去多数派
  • 节点数取偶数,容错能力没有提升反而扩大故障域
  • 将集群跨机房部署但不规划多数派位置,机房故障后无法写入
  • 磁盘使用普通共享存储且 fsync 性能差,写入抖动被放大为集群不可用

数据来源与参考

  • Diego Ongaro & John Ousterhout《In Search of an Understandable Consensus Algorithm》(USENIX ATC 2014)
  • etcd 官方文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌