Raft
Raft
一致性算法正是用于解决分布式环境下多副本之间数据一致性的问题 通过选举Leader并由Leader节点负责管理日志复制来实现多副本的一致性
流程图

角色
- Leader:负责接收客户端的请求,将日志复制到其他节点并告知其他节点何时应用这些日志是安全的
- Candidate:用于选举Leader的一种角色
- Follower:负责响应来自Leader或者Candidate的请求
每个任期都由一次选举开始,若选举失败则这个任期内没有Leader;如果选举出了Leader则这个任期内有Leader负责集群状态管理
执行规则
所有节点
- 如果commitIndex > lastApplied,应用log lastApplied 到状态机,增加lastApplied
- 如果RPC请求或者响应包含的任期T > currentTerm,将currentTerm设置为T并转换为Follower
Followers
- 响应来自Leader和Candidate的RPC请求
- 如果在选举超时周期内没有收到AppendEntries的请求或者给Candidate投票,转换为Candidate角色
Candidates:
转换为candidate角色,开始选举:
- 递增currentTerm
- 给自己投票
- 重置选举时间
- 发送RequestVote给其他所有节点
如果收到了大多数节点的选票,转换为Leader节点
如果选举超时,重新开始新一轮的选举
Leader:
- 一旦选举完成:发送心跳给所有节点;在空闲的周期内不断发送心跳保持Leader身份
- 如果收到客户端的请求,将日志追加到本地log,在日志被应用到状态机后响应给客户端
- 如果对于一个跟随者,最后日志条目的索引值大于等于 nextIndex,那么:发送从 nextIndex 开始的所有日志条目,并更新 commitIndex