又到了金三银四的时候,大家都按耐不住内心的躁动,我在这里给大家分享下之前面试中遇到的一个知识点(ZAB协议),希望对大家有些帮助。如有不足,欢迎大佬们指点指点。
ZAB协议虽然舍弃分布式协议中的可用性,但却是一致性的经典代表。
1、zookeeper服务端架构?
咱们先来看下zookeeper的架构图,从上图可知,zookeeper服务端中会存在一个leader节点,负责所有数据的写入,而其他follower节点只支持读,follower节点的写请求会转发给leader节点处理,有点类似读写分离的主从模式。
2、ZAB协议过程说明
从这个过程可以看出ZAB协议的重要特性是有序性,主要提现在Zxid的生成规则上
3、ZAB协议中的崩溃恢复
leader服务器出现崩溃,或者说由于网络原因导致leader服务器失去了与过半Follower的联系,那么就会讲入崩溃恢复模式。
ZAB协议需要设计的选举算法应该满足:
确保提交已经被leader提交的事务Proposal,同时丢弃已经被跳过的事务Proposal。
这个选举算法的好处是什么呢?
对选举算法的要求:
- 选出的leader节点上要持有最高的zxid
- 过半数节点同意
4、ZAB协议中的数据同步
leader选举出来后,需完成Followers与leader的数据同步,当半数的Followers完成同步,则可以开始提供服务。
同步的过程如下:
5、ZAB协议中丢弃事务Proposal外理
在ZAB协议的事务编号ZXID设计中,ZXID是一个64位的数字。
基于这样的策略,当一个包含了上一个leader周期中尚未提交过的事务Proposal的服务器启动加入到集群中,发现此时集群中已经存在leader,将自身以Follower角色连接上leader服务器之后,leader服务器会根据自己服务器上最后被提交的 Proposal来和 Follower 服务器的Proposal进行比对,发现follower中有上一个leader周期的事务Proposal时,leader会要求Follower进行一个回退操作(回退到一个确实已经被集群中过半机器提交的最新的事务Proposal)。
6、ZooKeeper集群leader选举机制
选举机制中的概念:
选举算法:
- 每个服务实例均发起选举自己为领导者的投票(自己的投给自己);
- 其他服务实例收到投票邀请时,比较发起者的数据事务ID是否比自己最新的事务ID大,大则给它投一票,小则不投票给它,相等则比较发起者的服务器ID,大则投票给它;
- 发起者收到大家的投票反馈后,看投票数(含自己的)是否大于集群的半数,大于则胜 出,担任领导者;未超过半数且领导者未选出,则再次发起投票。
胜出条件:
投票赞成数大于半数则胜出的逻辑。
选举示例
有5台服务器,每台服务器均没有数据,它们的编号分别是1,2;3,4,5,按编号依次启动,它们的选举过程如下:
- 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking
- 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是Lookingo
- 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
- 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
- 服务器5启动,后面的逻辑同服务器4成为小弟。
7、总结
在微服务和分布式的时代,zookeeper作为协调服务的代表,在面试中很容易被问到,希望大家能掌握这方面的知识,提高自己的核心竞争力,在谈薪的时候拿到最高的那个区间。
最后,外出打工不易,希望各位兄弟找到自己心仪的工作,虎年发发发! 也希望兄弟们能关注、点赞、收藏、评论支持一波,非常感谢大家!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。