概述
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
没有决策权,只有执行权
参考阅读
发表评论