何时须要进行选举?服务器
当Zookeeper集群中的一台服务器出现如下两种状况之一时,须要进行Leader选举:大数据
1)服务器初始化启动spa
2)服务器运行期间没法和Leader保持链接server
怎样进行选举?class
1.服务器初始化启动的Leader选举集群
前提:至少须要两台服务器,当只有一台服务器时,其单独没法进行Leader选举,当有两台服务器时,而且他们之间能够相互通讯,此时才能进入选举状态统计
选举过程:通信
1)每台服务器发出本身的投票。初始投票每台服务器都会投本身,投票内容为(myid,ZXID,Epoch)数据
2)接收来自各个服务器的投票。每台服务器接收到其余服务器的投票后,首先判断该投票的有效性(根据Epoch判断是否为本轮投票,是否来自LOOKING状态的服务器)tab
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:逻辑时钟,每一轮投票过程当中逻辑时钟必须是相同的,每投完一轮这个数值就会增长。