什么时候需要进行选举?
当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进行Leader选举:
1)服务器初始化启动
2)服务器运行期间无法和Leader保持连接
怎样进行选举?
1.服务器初始化启动的Leader选举
前提:至少需要两台服务器,当只有一台服务器时,其单独无法进行Leader选举,当有两台服务器时,并且他们之间可以相互通信,此时才能进入选举状态
选举过程:
1)每台服务器发出自己的投票。初始投票每台服务器都会投自己,投票内容为(myid,ZXID,Epoch)
2)接收来自各个服务器的投票。每台服务器接收到其他服务器的投票后,首先判断该投票的有效性(根据Epoch判断是否为本轮投票,是否来自LOOKING状态的服务器)
3)处理投票。针对接收到的每一个投票,都需要将该投票与自己的投票进行PK,规则如下:
1)首先检查ZXID,ZXID大的服务器优先作为Leader
2)ZXID相同,myid大的服务器作为Leader
4)将投票的处理结果发送给其他服务器,进行重新投票。
5)统计投票结果。若超过半数的服务器接受到相同的投票信息,则便可以认为选出了Leader。
6)改变服务器状态。一旦确定了Leader,每台服务器根据选举结果,更新自己的状态为Leader或是Follower。
//启动的顺序不同,选举的结果有可能不同
2.服务器运行期间的Leader选举
前提:Leader服务器挂了。在服务器运行期间,Follower服务器挂掉不会影响Leader,只有当Leader服务器挂掉,才会进入选举状态。此时,整个集群暂停对外的服务,进入选举状态。
选举过程:
1)变更状态。Leader挂掉,其他的Observer服务器都会将自己的服务器状态变更为Looking,并进入选举过程。
。。。与初始化启动选举过程一致
名词:
1)Looking:寻找Leader状态。拥有此状态及服务器会进入Leader选举状态
2)Follower:跟随者状态。表明当前服务器的角色为Follower
3)Leading:领导者状态。表明当前服务器的角色为Leader
4)Observing:观察者状态。表名当前服务器的角色为Observer
myid:服务器ID,编号越大在选举中所占权重越大
ZXID:服务器中存放的最大数据ID,值越大表明数据越新,在选举中所占权重越大。
Epoch:逻辑时钟,每一轮投票过程中逻辑时钟必须是相同的,每投完一轮这个数值就会增加。