Zookeeper的选举机制
假设有五台服务器组成的zookeeper集群,他们的id值为1,2,3,4,5,同时他们都是最新启动的,也就是没有历史数据,假设这些服务器依序启动,来看看会发生什么.
我们按启动顺序分为以下五个阶段:
- node1启动,此时只有他一台服务器启动了,他发出去的报文没有任何响应,他将自己的票投给自己, 他的选举状态是looking状态
- node’2启动,他与最开始的node1进行通信,相互交换自己选举的结果,由于两者都没有历史数据,所以id值大的node2胜出,node1的票改投给node2,node2的票也投给自己,获得两张票,但是由于没有达到超过半数以上的服务器都同意选举他(这个集群中半数以上是3),所以node1和node2还是继续保持looking状态
- node3启动,根据前面的理论分析,node3的id值为3,node1和node2将他们的票改投给node3,加上node3自己的票,已有三票,故node3成为leader.
- node4启动, 根据前面的理论分析,node4的id值为4,是已启动的服务器中最大的,但是由于前面有半数以上的服务器都选择了node3,所以他成为follower.
- node5启动,同node4一样成为follower.
选举过程如下图:
假如按照node5,4,3,2,1的循序启动,那么node5将会成为leader, 因为node5的id值最大,在过半前所有的node都会将票投给node5使其成为leader.
故而得出以下结论:
在启动过半时,在已启动的服务器中id值最大的服务器将会成为leader.
比如说, 如果按node3,4,2,5,1的顺序启动, 则node4将成为leader.