下面详细解释一下这个流程:大数据
首先给出几个名词定义:
(1)Serverid:在配置server时,给定的服务器的标示id。
(2)Zxid:服务器在运行时产生的数据id,zxid越大,表示数据越新。
(3)Epoch:选举的轮数,即逻辑时钟。随着选举的轮数++
(4)Server状态:LOOKING,FOLLOWING,OBSERVING,LEADING
步骤:
1、 Server刚启动(宕机恢复或者刚启动)准备加入集群,此时读取自身的zxid等信息。
2、 全部Server加入集群时都会推荐本身为leader,而后将(leader id 、 zixd 、 epoch)做为广播信息,广播到集群中全部的服务器(Server)。而后等待集群中的服务器返回信息。
3、 收到集群中其余服务器返回的信息,此时要分为两类:该服务器处于looking状态,或者其余状态。
(1) 服务器处于looking状态
首先判断逻辑时钟 Epoch:
a) 若是接收到Epoch大于本身目前的逻辑时钟(说明本身所保存的逻辑时钟落伍了)。更新本机逻辑时钟Epoch,同时 Clear其余服务发送来的选举数据(这些数据已经OUT了)。而后判断是否须要更新当前本身的选举状况(一开始选择的leader id 是本身)
判断规则rules judging:保存的zxid最大值和leader Serverid来进行判断的。先看数据zxid,数据zxid大者胜出;其次再判断leaderServerid, leader Serverid大者胜出;而后再将自身最新的选举结果(也就是上面提到的三种数据(leader Serverid,Zxid,Epoch)广播给其余server)
b) 若是接收到的Epoch小于目前的逻辑时钟。说明对方处于一个比较OUT的选举轮数,这时只须要将本身的 (leader Serverid,Zxid,Epoch)发送给他便可。
c) 若是接收到的Epoch等于目前的逻辑时钟。再根据a)中的判断规则,将自身的最新选举结果广播给其余 server。
同时Server还要处理2种状况:
a) 若是Server接收到了其余全部服务器的选举信息,那么则根据这些选举信息肯定本身的状态(Following,Leading),结束Looking,退出选举。
b) 即便没有收到全部服务器的选举信息,也能够判断一下根据以上过程以后最新的选举leader是否是获得了超过半数以上服务器的支持,若是是则尝试接受最新数据,假若没有最新的数据到来,说明你们都已经默认了这个结果,一样也设置角色退出选举过程。
(2) 服务器处于其余状态(Following, Leading)
a) 若是逻辑时钟Epoch相同,将该数据保存到recvset,若是所接收服务器宣称本身是leader,那么将判断是否是有半数以上的服务器选举它,若是是则设置选举状态退出选举过程
b) 不然这是一条与当前逻辑时钟不符合的消息,那么说明在另外一个选举过程当中已经有了选举结果,因而将该选举结果加入到outofelection集合中,再根据outofelection来判断是否能够结束选举,若是能够也是保存逻辑时钟,设置选举状态,退出选举过程。
以上就是FAST选举过程。