Zookeeper的选举一:选举概述

leader选举是zookeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。
我们主要从leader选举概述、算法分析和实现细节三个方面来看一下zookereper leader选举的过程。

Zookeeper选举概述

服务器启动时leader的选举

以3台机器为例,当集群中启动一台机器的时候,是无法进行选举的,当第二台机器也启动后,此时这两台机器已经能相互通信,每台机器试图找到一个leader,于是便进入了leader选举流程。
1、每个Server会发出一个投票
投票包含的最基本的元素包括:所推举的服务器的myid和ZXID,我们以(myid,ZXID)形式表示。初始阶段,无论是server1还是server2都会投给自己,即server1的选票(1,0),server2的选票(2,0),然后各自将这个投票发送给集群中其他所有机器。
2、接收来自各个服务器的投票
每个服务器都会收到其他服务器的投票。收到投票后,首先判断该投票的有效性,包括检查是否是本轮投票、是否来自looking状态的服务器
3、处理投票
在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK。
PK规则如下:
优先检查ZXID。ZXID比较大的服务器优先作为leader。(选择ZXID大的服务器主要是省去了新的leader产生之后,删除其他服务器上比自己ZXID大Proposal(提议))
如果ZXID相同的话,那么就比较myid。myid比较大的服务器作为leader。

按以上规则,server1的投票为(1,0),收到的server2投票为(2,0);首先对比ZXID,都是0,然后对比myid,收到的投票myid为2,大于自己的,于是就会更新自己的投票为(2,0),然后重新将投票发出去。
对于server2,不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次的投票信息即可。
4、统计投票
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。
对于server1和server2服务器来说,都统计出集群中已经有两台机器接受了(2,0)这个投票信息。就是说集群中已经有过半的机器收到同样的选票(2,0),即可以认为已经选出了leader。
过半:过半的意思是指大于集群机器数量的一半,即大于(n/2)。这也是zookeeper推举为奇数台的原因,3台允许出问题的机器为1台,4台允许出问题的机器也是1台(需要保证存活的机器大于4/2);而且还增加了选主的时间。
5、一旦确定了leader,每个服务器都会更新自己的状态,如果是follower,更新为FOLLOWING,如果是leader,那么就更改为LEADING。

服务器运行期间leader选举

在zookeeper集群正常运行时,一旦选出了一个leader,那么所有服务器的集群角色一般不会发生变化。但是一旦leader所在的机器挂了,那么整个集群将暂时无法对外服务,而是进行新一轮的leader选举。
服务器运行期间的leader选举和启动时期的leader选举基本一样。
假设当前zookeeper服务器为3台,分别为server1,server2,server3,当前leader为server2。假设某一瞬间,leader挂了,此时就开始leader选举。
1、首先是变更状态
当leader挂了,余下的非Observer服务器会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举流程
2、每个Server会发出一个投票
每个需要投票的server都生成一个投票信息(myid,ZXID),由于是运行期间,因此每个服务器上的ZXID可能不同,假设server1的ZXID为100,而server3的ZXID为99。在第一轮投票中还是都投给自己,分别产生投票(1,100)和(3,99),然后各自将这个投票发送给集群中所有机器。
3、接收来自各自服务器的投票
4、处理投票
根据上面的处理规则,由于server1的ZXID为100,大于server3的ZXID,那么server3会成为leader
5、统计投票
6、改变服务器状态