#####################

规则:

1)集群中所有节点在任何时刻都只能在leader、follower、candidate这3个状态中;

2)集群中必须有且只有一个领导者,客户端所有的读写请求最终都是发给领导人来处理的。在没有领导人的情况下,集群不对外提供服务。所以领导人选举是首要要解决的问题;

3)集群每进行一次选举就会产生一个单调自增的任期,表明该任期内哪个节点是leader,这样就记录了集群的生命周期内的所有选举结果,任期term是一个全局且连续单调递增的整数,每完成一次选举,term会递增 +1;

4)选举成为leader的规则,决议通过都必需要超过半数节点同意,也就是大多数节点赞成。对于领导人选举来说,就是一个候选人收到了包括它自己在内的超过半数节点的选票。比如一个集群由5台机器组成,一个候选人如果收到除了它自己之外2台机器的选票,那它就可以成功当选,即向上取整:ceil(节点数/2),即大于等于该数即可;

5)被选举成为leader的节点,一定是当前所有可连通的节点中具有最新数据的节点,因此,具有最新数据是成为leader的首要条件。

6)选举超时机制。每个节点的选举超时时间都是一个在150ms到300ms之间的一个随机值。

7)leader的职责:为了保持它的统治地位,要不断的向其他节点发送心跳,告诉他们“我还活着,我还活着,,,,”,不然follower就会过时不候的态度,到了electionTimeout就会跃跃欲试地发起选举干掉你,所以身为leader也是不容易的,时刻准备着被抛弃掉。Leader 节点选举时,最终选出来的 Leader 的 term 任期一定是最大的。

8)follower节点收到心跳请求后,会返回响应,发现原来 Leader 还在,不需要发起选举,同时要重置选举超时时间 electionTimeout,每次收到leader的心跳都会重置一下自己的electionTimeout。每个节点都有 electionTimeout 选举超时时间,用于当 Follower 节点无法收到心跳时,到期发起选举 Leader 的操作。

9)选举超时时间:每个follower在启动后都会随机赋予一个超时时间electionTimeout,follower启动后开始等待,在这个超时时间内,如果没有收到其他的投票请求、心跳请求、日志复制请求,follower进入candidate状态,并开始发起投票,如果这段时间有收到上述请求,则复位等待时间,重新开始等待。

10)每个节点的超时时间electionTimeout 必须大于心跳时间间隔heartbeatTime。 我们建议electionTimeout = 10 * heartbeatTime,以避免不必要的leader切换。比如heartbeatTime=10ms,electionTimeout=50ms

状态变换规则:

1)在一个正常运行中的任期内,集群处于稳定状态,集群中只有两种节点:leader和follower。其中只有一个节点是leader,其余节点均是follower,leader定期并行地向每个follower发送心跳信息,以此表明自己是leader身份和地位,以免follower忘记了他们是follower的身份;

2)当Leader宕机后,集群进入重新选举阶段,只会存在Follower和Candidate,一旦新的Leader被选出,没选上的Candidate就转成Follower;

3)选举超时机制。集群启动后,初始节点状态都是 Follower 状态。如果每次各节点都投票给自己,Leader 会始终无法选出来,这样僵持下去肯定是不行的。所以出现了 electionTimeout 的概念,称为 选举超时时间 每个节点都会有 electionTimeout。一旦发现一轮投票没有结果,集群中各节点自身设置一个 electionTimeout,时间范围在 150ms ~ 300ms 之间的一个随机值。

4)当一个处于follower状态的节点的electionTimeout时间到了,该节点就从follower状态转换为candidate状态,该节点立马给自己投一票,然后并行地向集群中其他两个节点发起选举投票(Http协议或者RPC协议请求都可以),其他节点收到candidate发出的选举请求后,根据自己节点和candidate节点上的任期大小比较而进行投票赞成还是反对。



 

 

 

 

 

 

 #####################

 

####################