zookeeper选举触发的条件有2个:
1.zookeeper集群启动阶段触发的leader选举
2.zookeeper集群运行阶段leader挂机促发的leader选举
zookeeper集群的选举触发条件只有上面2个,因为follower的挂机或者加入不会触发leader选举。
一、zookeeper集群启动阶段选举
1.每台服务器选举自己为leader,然后把自己的选票通过广播通知其他服务器。此时ServerState的状态是LOOKING.
2.每台服务器接受来自其他服务器的选票的选票,并进行合法性校验,主要有两点校验,选举轮次校验和服务器状态校验。
3.处理选票。每台服务器都会将自己的选票与其他服务器进行PK,PK规则如下:
规则一:首先进行ZXID的PK,ZXID大的获胜。
规则二:如果ZXID相同,则进行MYID的PK,MYID大的获胜。
经过PK后,如果当服务器PK失败,则会把自己的选票重新投给胜者,然后把更新后的选票通过广播通知其他服务器。
4.统计选票。根据超过半数原则,每台服务器都会统计自己的leader选票,如果超过半数,则选举结束。
5.更新服务器状态。follower把自己状态更新为leading。
二、zookeeper集群运行阶段选举
zookeeper集群运行期间,leader挂了,此时会触发leader选举,流程如下:
1.变更状态。
当leader挂了之后,其他所有非observer服务器都会将自己的状态更新为looking然后开始选举leader。
2.每台服务器选举自己为leader,然后把自己的选票通过广播通知其他服务器。这里的流程和启动阶段的leader选举是一致的,但是zxid可能不同。
3.收接选票。流程和启动阶段的leader选举是一致的。
4.处理选票。流程和启动阶段的leader选举是一致的。
5.统计选票,流程和启动阶段的leader选举是一致的。
6.更新服务器状态。流程和启动阶段的leader选举是一致的。
三、serverstate
serverstate是quorunpeer.class的内部类,定义了zookeeper集群中服务器的状态,可选值有4个:
looking
following
leading
observing