Raft算法详解1--Raft基础

Tue Mar 27, 2018

1400 Words|Read in about 3 Min
Tags: Raft   共识算法   blockchain  

介绍

本文介绍了Raft协议的三种核心的角色和时间周期的概念,并说明了角色之间的转换过程。通过本文的学习,可以理解Raft共识算法的三种角色,和各个角色之间的转换流程,为后面的Raft算法的学习打下基础。

Raft基础

一个Raft集群有多个服务节点,一般是5个,这样系统允许有两个服务节点不可用。在任何时候,服务节点都处于以下三个状态中的一个状态:

  • leader(主或领导)
  • candidate(选举者)
  • follower(更随者)

在通常情况下,有一个确定的leader,其他节点都是follower。follower是被动的,它自己不会发送请求,而是简单的回应leader和candidate的请求。leader处理所有的客户端请求(若客户端连接的是一个follower,follower会把请求转发给leader)。第三个状态是candidata,这个状态用来选举一个新的leader。下图说明了这些状态之间是如何转换的。转换将会在下面进行讨论。 说明 图说明:服务器节点状态转换。 Followers是被动的,仅响应来自其他服务节点的请求。 如果一个follower没有收到任何请求,它就会变成为candidate并发起选举。 一个candidate接收到来自整个集群的大部分节点的投票,就会成为新的leader。 leader通常会一直运行直到退出。

Raft把时间分成很多任意长的周期,如下图所示: 说明 图说明:时间被划分为周期,每个条周期从选举开始。 在成功的选举之后,一个leader会管理集群,直到周期结束。 有些选举可能失败,在这种情况下,这个周期没有leader就结束了。 周期之间的转换可以在不同服务节点上的不同时间观察到。

  每个周期都使用连续的整数进行标识。每个周期在开始选举时,每个周期从选举开始,其中一个或多个candidate尝试成为leader。如果candidate赢得了选举,那么它将在该周期其余时间作为leader,为集群服务。有时候,可能将会导致投票的分裂,此时,该时间周期将会以没有leader而结束。一个新的周期会马上开始。Raft协议确保每个时间周期只有一个leader。

不同服务节点可以观察不同时间周期之间的转换,并且在某些情况下服务节点在整个时间周期内也不会观察到选举过程。在Raft中时间周期充当逻辑时钟,它们允许服务节点检测到历史信息,比如:一个过时的leader。每个服务节点都保存了一个当前的时间周期编号,随着时间的推移该编号也不断增加。当两个服务器节点通信时,会相互告知当前的周期。若一个服务节点的当前时间周期小于另一个服务节点的时间周期,则将其当前期限更新为更大的值。若一个candidate或leader发现它的周期已经过时,它会把状态立即转换成follower。若服务节点接收到一个过去的时间周期号发送的请求,它会拒绝该请求。

Raft服务节点使用RPC进行通信,而基础的共识算法只需要两种类型的RPC。Request Vote RPC是由候选者在选举期间发起的,而AppendEntries RPC则由领导者发起来复制日志实体并提供一种形式的心跳。另外还有第三个RPC请求,用于在服务器之间传输快照(在后面的章节讲解)。 如果服务器没有收到响应,那么服务节点将重新发送RPC请求,并且为了获得最佳性能,它们并行地发送RPC请求。

See Also

Tue Mar 27, 2018

1400 Words|Read in about 3 Min
Tags: Raft   共识算法   blockchain