1. zookeeper服务器的四种状态
- looking:寻找Leader的状态,当前集群没有leader
- leading:成为一个leader节点。
- following:成为一个follower节点。
- observing:当前服务角色是一个observer。
2. zookeeper集群启动时的选举
假如有三个节点(s1,s2,s3)组成的集群。在集群启动过程中,当有一台zookeeper节点s1启动完成后,此时集群中只有一个节点无法进行leader的选举。当第二个节点s2启动成功后,此时两个节点可以正常通信,进入leader的选举过程,具体如下:
- 每一个节点都是自私的,各自都投自己1票。每次投票都会包含选举服务器的myid和zxid,投票结果使用(myid,zxid)表示,此时s1的投票为(1,0),s2为(2,0)。然后各自投票给集群中其他节点。
- 集群中的每个节点都接受其他节点的投票,s1将(1,0)发给s2,s2将(2,0)发给s1。
- PK投票结果,对于每一次投票,服务器都会将自己的投票结果和其他节点做比较:
- 首先检查zxid,zxid大的优先作为leader。
- 如果zxid相同,则比较myid,myid大的优先作为leader。
对于s1,他的投票是(1,0),接受到s2的投票(2,0),首先它会比较自己的zxid和s2的zxid,此时相等,然后比较myid,s2的myid大,s1更新自己的投票结果为(2,0),然后重新投票,对于s2收到s1的投票(1,0),显然s2胜出,无需更新自己的投票结果。
- 统计投票。每次投票结束后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息,对于s1,s2,都统计出集群中已经有两台机器是(2,0)的投票信息,此时认为leader已经产生。
- 改变服务器状态。一旦确定了leader,每个节点都会更改自己的状态,胜出的leader将状态改为leading,败者follower更改自己的状态为following。
3. zookeeper集群运行中的leader选举
还是假如有三台服务器(s1,s2,s3)组成的集群,s2时leader。在集群运行中时,只有当集群中的leader宕机才会触发leader的重新选举,集群中follower宕机或者新节点的加入并不影响leader的地位。
选举过程如下:
- 状态更改。leader宕机之后,各节点将自己的状态更改为looking。然后进入leader的选举。
- 每个节点都会发出投票,运行期间每个节点的zxid可能不同,假设s1的zxid为122,s3的zxid也为122,在第一轮投票中s1,s2都会投自己,产生投票s1(1,122),s2(3,122),然后各自将投票发送给其他节点。
- 接受来自其他节点的投票。
- 处理投票。PK投票,与启动时相同,此时s3胜出。
- 统计投票。s1,s3的投票都为(3,122),已经有过半机器是(3,122),s3成为leader。
- 更改状态。s1,s3更改自己的状态,s1—>following,s3—>leadin
















