1.为什么要选举?

Zookeeper的运行需要有一个Leader,多个Follower。无论是在服务器集群上线还是之前的Leader宕机,都需要重新选举出Leader。

2.集群刚部署时Leader选取原则:,分布式集群中的每台机器都参与投票,每台自己都会优先投给自己一票,通过交换选票查看对方有多少票,彼此票数相同时,比较myid大小,赢家通吃,得到每台机器的最终得票。一旦出现票数超过机器总数的一半以上数量,当前机器就是Leader。

 

举例说明:

          以5台服务器为例,顺序启动,当前集群 中没有任何数据。

Zookeeper 做leader 选举 zookeeper如何选举_服务器

第一轮:服务器1先启动,立马给自己投一票,然后检查自己的票数发现没过半,清空选票,选举状态变成Locking锁定状态。

Zookeeper 做leader 选举 zookeeper如何选举_高可用_02

第二轮:服务器2启动,给自己投一票,服务器1也会给它自己投1票,服务器1和服务器2这时会交换选票,然后发现各自有一票,此时会比较Myid(管理员自己配置的),发现服务器2的myid比较大,于是服务器1会把自己的票交给服务器2。服务器2检查自己的票数发现没有过半,于是清空投票,选举状态保持Locking。

Zookeeper 做leader 选举 zookeeper如何选举_数据_03

第三轮:服务器3启动,给自己投一票,服务器1和2也都会自己给自己投一票,然后三个服务器交换选票发现都是各有一票,而比较了myid后发现,服务器3的myid=3是最大的,所以服务器1和2都将自己的票交给服务器3,服务器3检查出自己票数超过集群的半数,成了Leader。

Zookeeper 做leader 选举 zookeeper如何选举_高可用_04

最后阶段:服务器4和5各自顺序启动,发现集群中已经有了Leader,自动称为Follower。

 3.集群正在使用,无论有没有数据,仍然以五台机器为例,当Leader突然宕机时,会重新选举一个Leader,此时首先会比较每一台机器的事务ID czxid,直接让czxid最大的当选Leader,极端情况下,如果czxid都相等,再比较myid,myid大者当选。

 

 

Note:有一个小地方要解释一下,上面举出的例子,包括ZK官方都推荐使用奇数台机器的原因。

 

在ZK集群中,2F+1 和 2F+2的机器容错率都是一样的,所以会考虑到节省资源的问题。比如3台服务器和4台服务器,如果有1台服务器宕机,剩下2台服务器仍然可以工作,即仍然能投票使其中一台为2票,超过集群数3的一半,宕机容忍度是1。如果是4台服务器呢,宕机一台还可以工作,因为有一台机器有机会得3票,但是如果宕机了两台,集群就不能工作了,所以宕机容忍度也是1,Zookeeper的服务器并不是为了存储数据服务的,而是为了实现高可用(实现数据备份),在能实现高可用的前提下,两者的容错率又都相等,那肯定是使用较少的服务器更节省资源。