Raft

Raft

Raft是斯坦福的Diego OngaroJohn Ousterhout两个人以易懂(Understandability)为目标设计的一致性算法,在2013年发布了论文《In Search of an Understandable Consensus AlgorithmPaxos一致性算法从90年提出,但是其流程太过于繁杂实现起来也比较复杂;而Raft一致性算法就是比Paxos简单又能实现Paxos所解决的问题的一致性算法,从2013年发布,两年多时间内就有了十多种语言的Raft算法实现框架,较为出名的有etcdGoogleKubernetes也是用了etcd作为他的服务发现框架。

Raft是一个用于日志复制,同步的一致性算法,它提供了和Paxos一样的功能和性能,只要保证 n/2+1 节点正常就能够提供服务;但是不同于Paxos算法直接从分布式一致性问题出发推导出来,Raft算法则是从多副本状态机的角度提出,用于管理多副本状态机的日志复制。为了强调可理解性,Raft将一致性算法分解为几个关键流程(模块Leader选举(Leader election、日志同步(Log replication、安全性(Safety、日志压缩(Log compaction、成员变更(Membership change)等,通过将分布式一致性这个复杂的问题转化为一系列的小问题进而各个击破的方式来解决问题。同时它通过实施一个更强的一致性来减少一些不必要的状态,进一步降低了复杂性。Raft还允许线上进行动态的集群扩容,利用有交集的大多数机制来保证安全性。

复制状态机

Raft的主要流程包含以下步骤:

  • Raft开始时在集群中选举出Leader负责日志复制的管理;
  • Leader接受来自客户端的事务请求(日志,并将它们复制给集群的其他节点,然后负责通知集群中其他节点提交日志,Leader负责保证其他节点与他的日志同步;
  • Leader宕掉后集群其他节点会发起选举选出新的Leader

系统角色

Raft将系统中的角色分为领导者(Leader、跟从者(Follower)和候选人(Candidate

  • Leader:接受客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后告诉Follower提交日志。
  • Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。
  • Candidate:Leader选举过程中的临时角色。

Raft 算法角色

Raft要求系统在任意时刻最多只有一个Leader,正常工作期间只有LeaderFollowers;算法将时间分为一个个的任期(term,每一个term的开始都是Leader选举。Raft算法角色状态转换如下:

Raft 算法角色状态转换

Follower只响应其他服务器的请求。如果Follower超时没有收到Leader的消息,它会成为一个Candidate并且开始一次Leader选举。收到大多数服务器投票的Candidate会成为新的LeaderLeader在宕机之前会一直保持Leader的状态。

选举时序流

在成功选举Leader之后,Leader会在整个term内管理整个集群。如果Leader选举失败,该term就会因为没有Leader而结束。Splite Vote是因为如果同时有两个候选人向大家邀票,这时通过类似加时赛来解决,两个候选者在一段timeout比如300ms互相不服气的等待以后,因为双方得到的票数是一样的,一半对一半,那么在300ms以后,再由这两个候选者发出邀票,这时同时的概率大大降低,那么首先发出邀票的的候选者得到了大多数同意,成为领导者Leader,而另外一个候选者后来发出邀票时,那些Follower选民已经投票给第一个候选者,不能再投票给它,它就成为落选者了,最后这个落选者也成为普通Follower一员了。

RaftMulti-Paxos对比

RaftMulti-Paxos有着千丝万缕的关系,下面总结了RaftMulti-Paxos的异同。RaftMulti-Paxos中相似的概念:

Raft 与 Multi-Paxos 对比

  • RaftLeaderMulti-PaxosProposer
  • RaftTermMulti-PaxosProposal ID本质上是同一个东西。
  • RaftLog EntryMulti-PaxosProposal
  • RaftLog IndexMulti-PaxosInstance ID
  • RaftLeader选举跟Multi-PaxosPrepare阶段本质上是相同的。
  • Raft的日志复制即Multi-PaxosAccept阶段。

RaftMulti-Paxos的不同:

Raft 与 Multi-Paxos 的不同

Raft假设系统在任意时刻最多只有一个Leader,提议只能由Leader发出(强Leader,否则会影响正确性;而Multi-Paxos虽然也选举Leader,但只是为了提高效率,并不限制提议只能由Leader发出(弱Leader。强Leader在工程中一般使用Leader LeaseLeader Stickiness来保证:

  • Leader Lease:上一任LeaderLease过期后,随机等待一段时间再发起Leader选举,保证新旧LeaderLease不重叠。
  • Leader Stickiness:Leader Lease未过期的Follower拒绝新的Leader选举请求。

Raft限制具有最新已提交的日志的节点才有资格成为LeaderMulti-Paxos无此限制。Raft在确认一条日志之前会检查日志连续性,若检查到日志不连续会拒绝此日志,保证日志连续性,Multi-Paxos不做此检查,允许日志中有空洞。RaftAppendEntries中携带Leadercommit index,一旦日志形成多数派,Leader更新本地的commit index即完成提交,下一条AppendEntries会携带新的commit index通知其它节点;Multi-Paxos没有日志连接性假设,需要额外的commit消息通知其它节点。

Links