Raft算法中服务器主要分为三种角色:Leader
、Follower
、Candidate
,而且三种角色相互独立,也就是服务器在同一时间内只可能扮演其中一种角色。html
Leader
:用于对全部用户的请求进行处理以及日志的复制等等。Follower
:不会主动发送消息,只响应来自Leader
与Candidate
的请求。Candidate
:用于选举新的Leader。算法
Raft 算法将时间划分红为任意不一样长度的任期(term
)。任期用连续的数字进行表示。每个任期的开始都是一次选举(election
),一个或多个候选人会试图成为领导人。若是一个候选人赢得了选举,它就会在该任期的剩余时间担任领导人。在某些状况下,选票会被瓜分,有可能没有选出领导人,那么,将会开始另外一个任期,而且马上开始下一次选举。Raft 算法保证在给定的一个任期最多只有一个领导人。服务器
网络状态分为两种状况:选举阶段,正常运行阶段。备注:网络状态还可能会有成员变化阶段,暂时先不考虑。
网络
每个任期都是以选举阶段开始。但不必定以正常运行阶段结束。在某些状况下一个完整的任期可能所有为选举阶段。以下图:mybatis
在网络初始化时,网络中全部的服务器都以Follower
的角色启动。因为Follower
只被动接收消息,因此全网中全部服务器都处于等待状态。同时每个服务器都在本地维护一个计时器。计时器的做用很简单,就是判断当前阶段(选举阶段或正常运行阶段)是否超时,而当计时器超时后,任期将会加1。并发
总之,在网络启动后全部服务器等待指定长度的一段时间以后,计时器将会超时。这时候计时器超时的服务器将转换本身的角色为Candidate
,从而进入选举阶段。进入选举阶段的Candidate
将会作如下几件事:日志
(1)将本身的任期号加1。
(2)为本身投一票用以选举出新的Leader。
(3)将本地的计时器重置。
(4)发送投票请求到网络中的其余全部的服务器。
(5)等待下一次的计时器超时。code
同时,投票选举Leader
具备如下几点要求:htm
(1)每一个服务器在一个任期内只能投一票,而且只能投先到者(即投票给本身收到的第一个请求)。若是没有先到者,只能投票选本身了。
(2)请求投票的消息中须要带有请求者所处的当前任期号。
(3)投票者只会投票给任期号大于等于本身当前任期号的服务器。blog
在选举状态会出现三种结果:
(1)本身成功当选Leader
(2)网络中其余服务器当选Leader
(3)网络中没有服务器当选Leader
当网络中某一个Candidate
接收到网络中大多数成员的投票后,便可将本身的身份转换为Leader
。在当选Leader
后,该服务器将周期性地发送心跳信息(心跳信息包含成功当选Leader
的服务器的当前任期号)到网络中其余服务器。在网络中其余的服务器收到心跳信息后检查心跳消息中的任期号是否大于等于本身的任期号。若是知足该条件的话Candidate
将会转换为Follower
状态,并重置计时器。而若是任期号小于本身的任期号,服务器将拒绝该心跳消息并继续处于Candidate
状态。
第三种状况为网络中没有服务器成功当选Leader
。这种状况在有不少Follower
同时成为Candidate
时会发生。由于当角色转换为Candidate
后将会将选票投给本身,从而致使选票被分散开来,没有Candidate
能够获得网络中大部分节点的选票,从而没有节点能够成为Leader
。这种状况下计时器将再次超时,网络状态将从选举阶段进入下一个选举阶段,同时Candidate
将会再次执行上面说明的几件事。
Raft算法采用了随机选举超时机制来避免出现这种状况。即当计时器超时后,服务器将随机延迟指定的时间后才进入选举阶段。
因为随机延迟的缘由,将下降服务器在同一时间选举超时的状况,能够有效避免选票分散的状况。
当Leader
成功选举以后,将周期性发送心跳消息到网络中其余服务器。同时其余服务器将转换本身的角色为Follower
,而且每次收到心跳消息后都会重置本身的计时器,防止超时再次进入选举阶段。
若是Leader
由于特殊状况崩溃时,网络中的其余服务器将再也不接收到心跳消息,在等待指定时间后计时器将会超时,从而再次进入选举阶段。
若是Leader
崩溃时间较短,能够在其余服务器计时器超时之间恢复,并发送心跳消息,网络仍然能够恢复为Leader
崩溃以前的状态。
若是Leader
崩溃时间较长,在网络中已有新的Leader
选举产生后恢复,因为旧的Leader
任期号将小于新的Leader
,在旧的Leader
接收到新的Leader
发送的心跳消息后则会变为Follower
状态。
http://www.mybatis.cn/archives/1147.html