Raft实验报告(2A、2B)
原理 具体可以看翻译的论文。 状态转换图 Raft的系统主要包含节点角色、领导者选举和日志复制。Raft算法基于复制状态机模型,将集群中的节点分为领导者(Leader)、追随者(Follower)和候选者(Candidate)三种角色。 领导者:负责处理所有客户端请求,并将操作同步到其他节点,确保系统在出现故障时仍能保持一致性。 追随者:响应领导者的请求并保存日志条目,通常处于被动状态。追随者向领导者发送心跳以维持领导地位。 候选者:在选举过程中,节点可以变为候选者,尝试成为领导者。候选者通过请求投票来获得足够的支持。 三种状态之间的转换如下: 任务流程 在不发生特殊情况的前提下,该系统进行领导者选举、日志复制的时序图如下: sequenceDiagram participant Node1 as Node 1 (Follower) participant Node2 as Node 2 (Follower) participant Node3 as Node 3 (Follower) participant Node4 as Node 4 (Follower) participant Node5 as Node 5 (Follower) %% Node1 超时,转变为 Candidate 并发起选举 Note over Node1: 超时 Node1->>Node1: 增加当前任期编号<br>转变为 Candidate Node1->>Node2: RequestVote RPC (Term, CandidateId, LastLogIndex, LastLogTerm) Node1->>Node3: RequestVote RPC (Term, CandidateId, LastLogIndex, LastLogTerm) Node1->>Node4: RequestVote RPC (Term, CandidateId, LastLogIndex, LastLogTerm) Node1->>Node5: RequestVote RPC (Term, CandidateId, LastLogIndex, LastLogTerm) %% 其他节点响应投票请求 Node2-->>Node1: VoteGranted (true) Node3-->>Node1: VoteGranted (true) Node4-->>Node1: VoteGranted (false) : 日志较新 Node5-->>Node1: VoteGranted (true) %% Node1 成为 Leader Note over Node1: 获得多数票 Node1->>Node1: 转变为 Leader %% 持续发送心跳 loop 每个周期 Node1->>Node2: Heartbeat(Term, LeaderID, PrevLogIndex, PrevLogTerm, nil, LeaderCommit) Node1->>Node3: Heartbeat(Term, LeaderID, PrevLogIndex, PrevLogTerm, nil, LeaderCommit) Node1->>Node4: Heartbeat(Term, LeaderID, PrevLogIndex, PrevLogTerm, nil, LeaderCommit) Node1->>Node5: Heartbeat(Term, LeaderID, PrevLogIndex, PrevLogTerm, nil, LeaderCommit) Node2-->> Node1: Success(true) Node3-->> Node1: Success(true) Node4-->> Node1: Success(true) Node5-->> Node1: Success(true) end %% 更新日志 Node1->>Node2: AppendEntries RPC(Term, LeaderID, PrevLogIndex, PrevLogTerm, LogEntries, LeaderCommit) Node1->>Node3: AppendEntries RPC(Term, LeaderID, PrevLogIndex, PrevLogTerm, LogEntries, LeaderCommit) Node1->>Node4: AppendEntries RPC(Term, LeaderID, PrevLogIndex, PrevLogTerm, LogEntries, LeaderCommit) Node1->>Node5: AppendEntries RPC(Term, LeaderID, PrevLogIndex, PrevLogTerm, LogEntries, LeaderCommit) Node2-->> Node1: Success(true) Node3-->> Node1: Success(false):日志不匹配 Node4-->> Node1: Success(true) Node5-->> Node1: Success(true) Note over Node1: 多数派复制成功 Node1->>Node1: 提交日志 其主要可以分为两个部分:领导者选举和日志复制:...