Raft 协议:分布式一致性算法的核心思想

发布于:2025-05-17 ⋅ 阅读:(20) ⋅ 点赞:(0)

引言

在分布式系统中,数据一致性是核心挑战。Raft 协议作为一种易于理解的一致性算法,被广泛应用于 etcd、Consul 等系统中。


一、Raft 核心概念

1.1 角色与任期(Term)

• 领导者(Leader):处理所有客户端请求,管理日志复制。

• 跟随者(Follower):被动响应领导者的心跳和日志条目。

• 候选人(Candidate):在领导者失效时发起选举。

• 任期(Term):逻辑时钟,用于检测过期的请求。

超时未收到心跳
赢得选举
心跳超时
其他候选人胜出
Follower
Candidate
Leader

1.2 日志结构

• 日志条目(Log Entry):包含命令、任期号和索引。

• 日志匹配原则:若两个日志条目索引相同且任期相同,则后续条目也一致。


二、领导者选举流程

2.1 选举触发条件

• 心跳超时:跟随者未在 election timeout(通常 150-300ms)内收到领导者心跳,则转为候选人。

• 自增任期号:候选人发起选举时递增当前任期号。

2.2 选举过程时序

Follower1 Follower2 Candidate All 请求投票(Term=3) 请求投票(Term=3) 投票成功 广播心跳(Term=3) 心跳响应 Follower1 Follower2 Candidate All

2.3 选举超时随机化

• 避免分割投票:每个节点的超时时间随机化(150-300ms),减少多个候选人同时竞选。


三、日志复制机制

3.1 日志追加流程

Client Leader Follower 提交命令(SET x=1) 写入本地日志(未提交) 发送日志条目(Term=3, Index=5) 确认写入 确认多数派写入 返回成功 Client Leader Follower

3.2 日志一致性规则

  1. 匹配原则:若索引 i 的日志条目在多数节点存在且任期一致,则视为已提交。
  2. 提交规则:领导者只能提交当前任期的日志,旧任期日志需通过新日志间接提交。

四、安全性保障

4.1 领导者完整性

• 日志匹配检查:候选人在选举时需携带最新日志索引和任期,跟随者拒绝日志落后的请求。

4.2 选举限制

• 任期号校验:节点拒绝来自旧任期的请求(如 Term=2 请求在 Term=3 时被丢弃)。

4.3 网络分区容错

心跳超时
赢得选举
脑裂
Leader in Partition A
Candidate in Partition A
New Leader in Partition A
Leader in Partition B
Follower in Partition B

五、Raft 与 Paxos 对比

特性 Raft Paxos
设计目标 易于理解和实现 理论完备性
角色划分 明确的三角色模型 多角色(Proposer/Acceptor/Learner)
日志复制 单领导者线性化复制 多领导者并行复制
学习曲线 低(状态机清晰) 高(多阶段提案机制)

六、实战应用场景

6.1 etcd 中的 Raft 实现

• 元数据管理:通过 Raft 同步集群节点状态。

• 键值存储:客户端请求经 Raft 提交后持久化。

6.2 容错与恢复

• 节点宕机:领导者持续发送心跳,超时后触发新一轮选举。

• 日志恢复:新加入节点通过快照(Snapshot)和日志同步补全数据。


七、总结与延伸

核心结论

  1. 易用性:Raft 通过明确角色和任期机制,大幅降低分布式一致性实现难度。
  2. 强一致性:通过多数派提交和日志匹配原则,确保系统状态严格一致。
  3. 适用场景:适合需要强一致性的系统(如配置中心、分布式锁服务)。

网站公告

今日签到

点亮在社区的每一天
去签到