概述

1.

Zookeeper

集群启动的时候,此时所有的节点

(

在集群中,节点指的就是服务器

)

都会进入选举状态,并且此时所有的节点都会推荐自己成为leader

2.

当一个节点收到别人的选举信息之后,就会进行比较。经过多轮比较之后,最后胜出的节点会成为 leader

选举细节

1.

Zookeeper

集群中,当出现没有

leader(

集群刚刚启动,或者是

leader

宕机

)

的状态时,此时整个

集群的所有节点都会进入选举状态,准备选举

2. Zookeeper

会为每一次选举出来的

leader

分配一个递增的编号,称之为

Epochid

3.

选举信息

  1. leader

编号

(Epochid)

。如果

Epochid

比较小,那么说明操作已经过时

  2.

最大事务

id(Zxid)

Zxid

越大,说明这个节点接收的写操作越多

  3.

选举编号

(myid)

。要求

myid

不能重复

4.

比较原则

  1.

先比较两个节点的

Epochid

,谁大谁赢

  2.

如果

Epochid

一致,那么比较两个节点的最大事务

id

,谁大谁赢

  3.

如果最大事务

id

一致,那么比较

myid

  4.

如果两个节点进行比较,一方失败,那么失败的节点会转而接受胜出的节点的选举信息,此

时可以理解为胜出的节点获得了一票。当一个节点赢得半数及以上的节点的支持的时候,那

么这个节点就会成为

leader -

过半性

5. 如果一个Zookeeper

集群中已经存在了

leader

,那么新添的节点的事务

id

或者

myid

无论是多少,

只能成为

follower

6. 如果

leader

产生宕机,那么

Zookeeper

集群会重新选举出一个新的

leader

7.

一个节点能否成为

leader

,看这个节点能否

抢先

过半

8.

Zookeeper

集群中,如果出现了

2

个及以上的

leader

,这种现象称之为脑裂

9.

产生脑裂的原因

  1.

集群产生了分裂

-

硬件故障、网络故障等都会产生分裂,这个问题无法避免

  2.

分裂之后还进行了选举

10.

Zookeeper

集群中,如果存活

(

能够相互通信

)

的节点个数不足一半,无论

leader

是否存在,剩余

的存活节点都会停止服务

(

对外停止接收请求,对内停止选举和原子广播

) -

过半性

11.

如果集群中存在两个及以上的

leader

,那么此时会比较

leader

之间的

Epochid

Epochid

较小的节点就会变为follower

状态

12.

在集群的选举期间,集群只对外提供读服务,不提供写服务!

13. Zookeeper

集群中的节点状态

                          zkServer.sh

start

                          zkServer.sh status

                     1. voting/looking

:选举状态

                     2. follower

:追随者

/

跟随者

                     3. leader

:领导者

                     4. observer

:观察者

14. leader

follower

都是有决策权和执行权的节点,

observer

没有决策权,只有执行权

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。