Zookeeper选举的触发条件有2个:
1,Zookeeper集群启动阶段触发的leader选举。
2,Zookeeper集群运行阶段leader挂机触发的leader选举。
个人理解,Zookeeper集群的选举的触发条件只有上面2个,因为follower的挂机或加入不会触发leader选举。
当然,还有一种极端情况:leader领导的所有follower都挂了,这种场景下,是否会触发leader选举?如何选举?目前我还无法回答这个问题。暂时不考虑,大家如果有想法,不妨留言交流。
OK,基于上面的认知,我们开始今天的讨论。
一,Zookeeper集群启动阶段选举
1,每台服务器选举自己为leader,然后把自己的选票通过广播通知其他服务器。此时ServerState的状态是LOOKING。
2,每台服务器接收来自其他服务器的选票,并进行合法性校验,主要有两点校验,选举轮次校验和服务器的状态的校验。
3,处理选票。每台服务器都会将自己的选票与其他服务器的选票进行PK,PK的规则如下:
规则一:首先进行ZXID的PK,大者获胜。
规则二:如果ZXID相等,则进行myid的PK,大者获胜。
经过PK以后,如果当前服务器PK失败,则会把自己的选票重新投给胜者,然后把更新后的选票通过广播通知其他服务器。
4,统计选票。根据超过半数的原则,每台服务器都会统计leader的选票,如果超过半数,则结束选举。
5,更新服务器状态。follower把自己的状态更新为following,leader把自己的状态更新为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
网友评论