Java资源分享网 - 专业的Java学习网站 学Java,上Java资源分享网
Apache Zookeeper面试题 PDF 下载
发布于:2024-03-18 10:05:14
(假如点击没反应,多刷新两次就OK!)

Apache Zookeeper面试题  PDF 下载 图1

 

 

资料内容:

 

1. ZooKeeper是什么,有什么功能
Zookeeper 是 ⼀个典型的分布式数据⼀致性的解决⽅案.
Zookeeper的典型应⽤场景:
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群管理
Master
分布式锁
分布式队列
2. 讲⼀下leader 选举过程
这⾥选取3台机器组成的服务器集群为例。在集群初始化阶段,当有⼀台服务器Server1启动时,其单独⽆法进⾏和
完成Leader选举,当第⼆台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于
是进⼊Leader选举过程。选举过程如下:
(1) 每个Server发出⼀个投票。由于是初始情况,Server1Server2都会将⾃⼰作为Leader服务器来进⾏投票,每
次投票会包含所推举的服务器的myidZXID,使⽤(myid, ZXID)来表示,此时Server1的投票为(1, 0)Server2
投票为(2, 0),然后各⾃将这个投票发给集群中其他机器。
(2) 接受来⾃各个服务器的投票。集群的每个服务器收到投票后,⾸先判断该投票的有效性,如检查是否是本轮投
票、是否来⾃LOOKING状态的服务器。
(3) 处理投票。针对每⼀个投票,服务器都需要将别⼈的投票和⾃⼰的投票进⾏PKPK规则如下
· 优先检查ZXIDZXID⽐较⼤的服务器优先作为Leader
· 如果ZXID相同,那么就⽐较myidmyid较⼤的服务器作为Leader服务器。
对于Server1⽽⾔,它的投票是(1, 0),接收Server2的投票为(2, 0),⾸先会⽐较两者的ZXID,均为0,再⽐较
myid,此时Server2myid最⼤,于是更新⾃⼰的投票为(2, 0),然后重新投票,对于Server2⽽⾔,其⽆须更新⾃
⼰的投票,只是再次向集群中所有机器发出上⼀次投票信息即可。
(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于
Server1Server2⽽⾔,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了
Leader
(5) 改变服务器状态。⼀旦确定了Leader,每个服务器就会更新⾃⼰的状态,如果是Follower,那么就变更为
FOLLOWING,如果是Leader,就变更为LEADINGLeader 选取算法分析
3.4.0后的Zookeeper的版本只保留了TCP版本的FastLeaderElection选举算法。当⼀台机器进⼊Leader选举时,
当前集群可能会处于以下两种状态
· 集群中已经存在Leader
· 集群中不存在Leader
  对于集群中已经存在Leader⽽⾔,此种情况⼀般都是某台机器启动得较晚,在其启动之前,集群已经在正常
⼯作,对这种情况,该机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器⽽⾔,仅仅需
要和Leader机器建⽴起连接,并进⾏状态同步即可。⽽在集群中不存在Leader情况下则会相对复杂,其步骤如
下:
  (1) 第⼀次投票。⽆论哪种导致进⾏Leader选举,集群的所有机器都处于试图选举出⼀个Leader的状态,即
LOOKING状态,LOOKING机器会向所有其他机器发送消息,该消息称为投票。投票中包含了SID(服务器的唯⼀
标识)和ZXID(事务ID),(SID, ZXID)形式来标识⼀次投票信息。假定Zookeeper5台机器组成,SID分别为1
2345ZXID分别为99988,并且此时SID2的机器是Leader机器,某⼀时刻,12所在机器出现
故障,因此集群开始进⾏Leader选举。在第⼀次投票时,每台机器都会将⾃⼰作为投票对象,于是SID345
的机器投票情况分别为(3, 9)(4, 8) (5, 8)
  (2) 变更投票。每台机器发出投票后,也会收到其他机器的投票,每台机器会根据⼀定规则来处理收到的其他
机器的投票,并以此来决定是否需要变更⾃⼰的投票,这个规则也是整个Leader选举算法的核⼼所在,其中术语
描述如下
· vote_sid:接收到的投票中所推举Leader服务器的SID
· vote_zxid:接收到的投票中所推举Leader服务器的ZXID
· self_sid:当前服务器⾃⼰的SID
· self_zxid:当前服务器⾃⼰的ZXID
每次对收到的投票的处理,都是对(vote_sid, vote_zxid)(self_sid, self_zxid)对⽐的过程。
规则⼀:如果vote_zxid⼤于self_zxid,就认可当前收到的投票,并再次将该投票发送出去。
规则⼆:如果vote_zxid⼩于self_zxid,那么坚持⾃⼰的投票,不做任何变更。
规则三:如果vote_zxid等于self_zxid,那么就对⽐两者的SID,如果vote_sid⼤于self_sid,那么就认可当前收到的
投票,并再次将该投票发送出去。
规则四:如果vote_zxid等于self_zxid,并且vote_sid⼩于self_sid,那么坚持⾃⼰的投票,不做任何变更。
结合上⾯规则,给出下⾯的集群变更过程。