分布式系统中的共识算法:Raft算法
字数 1239 2025-10-29 11:31:55
分布式系统中的共识算法:Raft算法
题目描述
在分布式系统中,多个节点需要就某个值(例如日志条目、配置变更)达成一致,即使部分节点发生故障。Raft算法是一种易于理解的共识算法,它将共识问题分解为领导者选举、日志复制和安全性三个子问题。假设一个由5个节点(A、B、C、D、E)组成的集群,部分节点可能崩溃或网络分区。要求设计一个流程,使得集群在部分故障时仍能达成共识,并保证日志的一致性。
解题过程
-
角色定义与任期机制
- Raft节点有三种角色:
- 领导者(Leader):处理所有客户端请求,管理日志复制。
- 跟随者(Follower):被动响应领导者的心跳和日志复制请求。
- 候选人(Candidate):在选举期间临时角色,发起投票请求。
- 任期(Term):一个连续递增的编号(初始为0),每个任期最多有一个领导者。任期用于检测过时信息(如旧领导者的请求)。
- Raft节点有三种角色:
-
领导者选举流程
- 触发选举的条件:跟随者在超时时间内未收到领导者心跳(心跳超时,通常150-300ms随机值),则转换为候选人。
- 选举步骤:
- 候选人递增当前任期,向所有节点发送
RequestVoteRPC请求(包含候选人的日志信息)。 - 节点收到请求后,检查候选人的日志是否至少与自己一样新(比较最后日志的任期和索引),且本任期未投票,则投票支持。
- 候选人收到多数派(如5节点中至少3票)投票后成为领导者。
- 领导者立即向所有节点发送心跳,阻止其他选举。
- 候选人递增当前任期,向所有节点发送
- 选举安全性:若同一任期多个候选人分票导致无多数派,则选举超时后重新发起(随机超时减少冲突)。
-
日志复制过程
- 客户端请求处理:
- 客户端向领导者发送写请求(如SET x=1)。
- 领导者将操作追加到本地日志(未提交),然后通过
AppendEntriesRPC并行发送给跟随者。
- 日志提交条件:
- 当多数派节点(如3/5)成功复制日志条目后,领导者提交该条目(更新本地状态机),并通知跟随者提交。
- 已提交的日志不可更改,保证最终所有节点状态一致。
- 日志一致性检查:领导者每次RPC会携带前一条日志的索引和任期,跟随者若发现不一致,则拒绝请求并回退日志,直到与领导者匹配。
- 客户端请求处理:
-
安全性保证
- 选举限制:只有日志足够新的候选人才能成为领导者(避免已提交日志被覆盖)。
- 提交规则:领导者只能提交当前任期的日志(间接提交之前任期的日志),防止旧日志被错误提交。
- 故障处理:
- 节点崩溃后恢复时,通过RPC同步到最新日志。
- 网络分区时,少数派分区无法选举出领导者,避免脑裂。
-
示例场景(5节点集群)
- 初始所有节点为跟随者,节点A超时后成为候选人,获得B、C的投票成为领导者(任期=1)。
- 客户端请求SET x=1,A将日志复制到B、C后提交,响应客户端。
- 若A崩溃,B和C超时后发起选举,B日志较新(已接收x=1)成为新领导者,继续服务。
通过以上步骤,Raft在保证正确性的同时,通过分解问题降低了理解难度,适用于实际系统(如Etcd、Consul)。