raft协议

what:

  raft是分布式的一致性协议(Consensus),其相对pasox更加简单。用来保障servers上副本一致性的一种算法。

  一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程

 

how:

  确保一致性的核心思想:

    采用选举机制,参选者需要说服大多数选民(服务器)投票给他,一旦选定(leader)后,其他的server就是(follower)跟随leader操作,从而确保分布式的一致性。

 

  选leader:

    参考如下图(也是follower状态转化图):

      

 

       Raft 的选主基于一种“心跳机制”。leader 会周期性的向所有节点发送心跳包来维持自己的权威。

      第一步:准备选举自己     

        刚启动时,所以的server节点都是follower身份(Step: starts up)。没有leader时,某个server节点和leader的心跳先超时,它就会从follower变为candidate,而发起选举(Step: times out, starts election)。(注意:为了各节点不同时变为candidate,在各节点的固定超时时间上某个范围内的随机数)。如下图:

                 

 

      第二步:开始选举自己:

        节点身份切换为 candidate,并将term加上1。然后它会向集群其它节点发送“请给自己投票”的消息(RequestVote RPC)。

                      

 

      第三步:选择结果:

        candidate会有3种结果,分别对应上面状态图的3条线。

        1. 选举成功(Step: receives votes from majority of servers):

        

 

 

           

        2、选举失败(Step: discovers current leader or new term):

          Candidate 在等待投票回复的时候,收到其它自称是 leader 节点发送的心跳包,且term 不小于 candidate 当前的 term,那么 candidate 会承认这个 leader,并将身份切回 follower。term 比自己小,candidate 会拒绝这次请求并保持选举状态

          

 

 

                 

        3、选举超时(Step: times out, new election):

          多个 follower 同时成为 candidate,选票是可能被瓜分的,如果没有任何一个 candidate 能得到大多数节点的支持,那么每一个 candidate 都会超时。这里的“特殊处理”指的就是前文所述的随机化选举超时时间。此时 candidate 需要增加自己的 term,然后发起新一轮选举。

 

 

      第四步、老leader更换:

        即上面状态图的:discovers server with higher term。一段时间后老 leader 恢复了(如:网络故障、或者机器宕机恢复),收到了来自新leader 的心跳包,发现心跳中的 term 大于自己的 term,此时该节点会立刻切换为 follower 并跟随的新 leader。

 

 

 

 

       

        

 

 

 

 

 

 

    

      

      

  

  

posted @ 2022-03-16 23:30  修心而结网  阅读(1909)  评论(0编辑  收藏  举报