• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

阿里 说说你对《动物园管理员》中ZAB协议的理解?


Recommended Posts

又到了金三银四的时候,大家都按耐不住内心的躁动,我在这里给大家分享下之前面试中遇到的一个知识点(ZAB协议),希望对大家有些帮助。如有不足,欢迎大佬们指点指点。

虽然ZAB协议放弃了分布式协议的可用性,但它是一致性的经典代表。

1、zookeeper服务端架构?

在这里插入图片描述

我们先来看看zookeeper的架构图。从上图可以看出,zookeeper服务器中会有一个leader节点,负责写所有数据,其他的follower节点只支持读。从节点的写请求会被转发到领导节点进行处理,有点类似于读写分离的主从模式。

2、ZAB协议过程说明

在这里插入图片描述

所有交易请求都转发给主管。

领导者分配全局单调递增的事务id(Zxid ),并广播事务提议。

追随者处理建议并给出反馈。

领导收到一半以上的反馈,并广播提交。

从这个过程可以看出ZAB协议的重要特性是有序性,主要提现在Zxid的生成规则上

3、ZAB协议中的崩溃恢复

如果盟主服务器崩溃,或者盟主服务器因为网络原因与半数以上的追随者失去联系,则参考崩溃恢复模式。

在这里插入图片描述

ZAB协议规定,如果一个事务提议在一台机器上被成功处理,则它应该在所有机器上被成功处理,即使该机器崩溃。

ZAB协议确保已经在领导者服务器上提交的那些事务最终被所有服务器提交。

ZAB协议确保仅在主服务器上提出的事务被丢弃。

ZAB协议需要设计的选举算法应该满足:

确保提交领导已提交的交易建议,并放弃已跳过的交易建议。

这个选举算法的好处是什么呢?

如果领导者选举算法能够保证新选出的领导者服务器具有集群中所有机器中具有最高ZXID的事务提议,则它能够保证新选出的领导者必须具有所有提交的提议。如果你让最高价交易

提议的机器成为领导者,这可以省去领导者服务器检查提议的提交和丢弃。

对选举算法的要求:

所选的首节点应该保存最高的zxid。

超过一半的节点同意。

4、ZAB协议中的数据同步

领袖选出后,需要完成。

Followers与Leader的数据同步,当半数的Followers完成同步,则可以开始提供服务。

同步的过程如下:

  1. Leader 服务器会为每一个 Follower服务器都准备一个队列,并将那些没有被各Follower服务器同步的事务以Proposal消息的形式逐个发送给Follower服务器,并在每一个Proposal消息后面紧接着再发送一个Commit消息,以表示该事务已经被提交。
  2. Follower服务器将所有其尚未同步的事务Proposal 都从 Leader 服务器上同步过来并成功应用到本地数据库中后,Leader服务器就会将该Follower服务器加入到真正的可用 Follower列表中,并开始之后的其他流程。

5、ZAB协议中丢弃事务Proposal外理

在ZAB协议的事务编号ZXID设计中,ZXID是一个64位的数字。

  1. 低32位是一个简单的单调递增的计数器,针对客户端的每一个事务请求,Leader服务器在产生一个新的事务Proposal的时候,都会对该计数器进行加1操作;
  2. 高32位代表了Leader周期纪元的编号,每当选举产生一个新的Leader服务器,就会从这个Leader服务器上取出基本地日志中最大事务 Proposal的ZXID,并从该ZXID中解析出对应的纪元值,然后对其进行加1操作,之后就会以此编号作为新的纪元,并将低32位置0来开始生成新的ZXID。

基于这样的策略,当一个包含了上一个Leader周期中尚未提交过的事务Proposal的服务器启动加入到集群中,发现此时集群中已经存在leader,将自身以Follower角色连接上Leader服务器之后,Leader服务器会根据自己服务器上最后被提交的 Proposal来和 Follower 服务器的Proposal进行比对,发现follower中有上一个leader周期的事务Proposal时,Leader会要求Follower进行一个回退操作(回退到一个确实已经被集群中过半机器提交的最新的事务Proposal)。

6、ZooKeeper集群Leader选举机制

选举机制中的概念:

  1. 服务器id:myid
  2. 事务id,服务器中存放的最大Zxid
  3. 逻辑时钟,发起的投票轮数计数
  4. 选举状态:

    Looking,竞选状态。
    Following,随从状态,同步leader状态,参与投票。
    Observing,观察状态,同步leader状态,不参与投票。
    Leading,领导者状态。

选举算法:

  1. 每个服务实例均发起选举自己为领导者的投票(自己的投给自己);
  2. 其他服务实例收到投票邀请时,比较发起者的数据事务ID是否比自己最新的事务ID大,大则给它投一票,小则不投票给它,相等则比较发起者的服务器ID,大则投票给它;
  3. 发起者收到大家的投票反馈后,看投票数(含自己的)是否大于集群的半数,大于则胜 出,担任领导者;未超过半数且领导者未选出,则再次发起投票。

胜出条件:

投票赞成数大于半数则胜出的逻辑。

选举示例

有5台服务器,每台服务器均没有数据,它们的编号分别是1,2;3,4,5,按编号依次启动,它们的选举过程如下:

  1. 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking
  2. 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是Lookingo
  3. 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
  4. 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
  5. 服务器5启动,后面的逻辑同服务器4成为小弟。

7、总结

在微服务和分布式的时代,zookeeper作为协调服务的代表,在面试中很容易被问到,希望大家能掌握这方面的知识,提高自己的核心竞争力,在谈薪的时候拿到最高的那个区间。

最后,外出打工不易,希望各位兄弟找到自己心仪的工作,虎年发发发! 也希望兄弟们能关注、点赞、收藏、评论支持一波,非常感谢大家!

Link to comment
Share on other sites