选举过程概述
经过前面的zookeeper相关的文章,我们也对zookeeper有一定的了解,知道在zookeeper中存在三种服务器角色,分别是Leader,Follower以及Observer,其中Observer仅仅作为一个监控协调者的作用,并不参与zookeeper对外提供服务以及zookeeper的选举,而zookeeper的选举我们从前面的内容也知道,总共可以分为两种,第一种是当整个zookeeper的集群启动后,进行的选举过程,第二种则是在zookeeper运行期间,当出现Leader崩溃的过程时,zookeeper进行的选举操作。接下来我们先从启动的时候触发的选举开始学习
服务端启动时选举过程
我们在搭建zookeeper的时候往往会有一个配置文件,里面存放一个myid,用来标示集群内不同客户端的机器编号,当至少两台含有myid的机器启动后,就开始进入了zookeeper的集群选举流程
1.每个server发起一个投票
由于当前是刚启动状态,因此每一个服务实例都会默认把自己作为Leader服务器来发起投票,而每一个投票中包含了最基本的选举所需要的元素,例如myid和ZXID,我们将这两个按照选票的方式表示,例如myid为1,ZXID为0,我们将会表示为(1,0),由于每台服务端实例优先都是按照自己是Leader发起投票,那么server1默认生成的选票就是(1,0),server2的选票则是(2,0),以此类推
2.接受到其他服务端实例发来的选票
没台服务端实例都会收到其他服务端实例发来的选票信息,当收到选票后,就会开始校验处理选票的流程
3.校验处理选票
其他服务实例发来的选票,要经过一系列验证,比如是不是本轮投票的选票,是否来自于Looking状态的实例发来的选票,经过校验后,就会和当前实例的选票信息进行pk比较,比较的规则大致如下:
①优先比较ZXID,ZXID不一样的时候,较大的那个选票所在的服务实例作为Leader
②如果两个选票的ZXID相同的话,那么就会比较myid,默认为myid较大的服务实例作为Leader
根据这个规则,我们来看看当server1收到server2的选票后,比较的流程是怎样的,首先两个选票都是第一轮投票选举,所以zxid都是0,接着就要开始比较myid了,server1的myid是1,而server2的myid是2,大于自身的myid,那么server2就应该是Leader,因此server1会更新自己的选票为(2,0),然后下次发送的时候就是发送新的选票信息出去
4.统计每一次选票
每一次投票以后,都会统计所有的投票,判断是否有过半的实例接受到了相同的选票信息,对与当前server1和server2来说,必须这两个实例的选票都一样才可以算是完成了选举流