MIT6824笔记五 Raft

Raft是一个分布式共识算法/协议,即让多台机器达成一致的算法。

Raft将共识问题分解为三部分:Leader选举、Log复制以及安全性设置(一致性设置)。

由于实验2完整复现了Raft协议,这里只挑一些重点讲。复现时应该着重考虑:节点崩溃又上线、不可靠网络。

Leader选举

角色转变

server有三种状态:follower、candidate、leader。分别经过如图所示的过程进行状态转变。

follower和candidate的任务就是等定时器过期发起投票,leader则是发起心跳请求。

当followers选举时间间隔到期后转变为candidate,增加自己的任期号,发起一轮投票;

当leader时,心跳时间间隔开启,选举时间间隔关闭,每隔一段时间向所有node发送空的AppendEntry。

任期机制

发送和回复RPC都要带上自己的任期。任何时刻(收到请求和处理回复)发现自己的任期旧,都要转变身份为follower。

一期一票制度:一个机器在一个任期只能投一票,投票对象VotedFor应该作持久化,避免节点崩溃再次上线重新投票。

投票过程

想明白几个问题:

  • 什么时候才能发起投票?
  • 发起投票的步骤?
  • 收到过半选票后的处理?
  • 什么条件下才能为candidate投出自己的选票?
  • 选举定时器重置的时间点?

过半票决的好处:

  • 在一机一票的场景下,只会产生一个leader节点
  • 出现网络分区的时候,只可能有一个分区会有超过一半的服务器互相通信
  • 旧leader的过半服务器必然与新leader的过半服务器有重叠,那么就有一个服务器经历过两个任期,它收集了完整的log信息

响应投票:

收到投票RPC消息后,需要比较任期号,驳回旧的任期号投票请求;

如果任期号校验通过,重置选举时间;

当且仅当自己的votedFor为空或为消息中的candidateId时,并且比较自己的log与RPC中的lastLog信息后,才同意投票,并设置自己的votedFor为candidateId。

日志复制

想明白几个问题:

  • nextIndex和matchIndex的作用?
  • 日志不一致时的回退算法?
  • 什么时候日志能提交?怎么避免日志重复提交?

leader只能提交当前任期内的日志。

作者

Desirer

发布于

2023-12-13

更新于

2024-06-09

许可协议