• ZooKeeper的Watcher机制主要包括客户端线程、客户端 WatcherManager、Zookeeper服务器三部分。
  • 客户端向ZooKeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中。
  • 当zookeeper服务器触发watcher事件后,会向客户端发送通知, 客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。

Watcher特性总结

  • **一次性:**一个Watch事件是一个一次性的触发器。一次性触发,客户端只会收到一次这样的信息。
  • 异步的: Zookeeper服务器发送watcher的通知事件到客户端是异步的,不能期望能够监控到节点每次的变化,Zookeeper只能保证最终的一致性,而无法保证强一致性。
  • 轻量级: Watcher 通知非常简单,它只是通知发生了事件,而不会传递事件对象内容。
  • 客户端串行: 执行客户端 Watcher 回调的过程是一个串行同步的过程。
  • 注册 watcher用getData、exists、getChildren方法
  • 触发 watcher用create、delete、setData方法

6、面试官:你对Zookeeper的数据结构都有一定了解,那你讲下Zookeeper的特性吧

小菜鸡的我:(我背过书,啊哈哈)

Zookeeper 保证了如下分布式一致性特性:

  • 顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
  • 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
  • 单一视图:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
  • 可靠性: 一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来。
  • 实时性(最终一致性): Zookeeper 仅仅能保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。

7、面试官:你刚提到顺序一致性,那zookeeper是如何保证事务的顺序一致性的呢?

小菜鸡的我:(完蛋了这题不会)

这道题可以看下这篇文章(本题答案来自该文章):[聊一聊ZooKeeper的顺序一致性](

)

需要了解事务ID,即zxid。ZooKeeper的在选举时通过比较各结点的zxid和机器ID选出新的主结点的。zxid由Leader节点生成,有新写入事件时,Leader生成新zxid并随提案一起广播,每个结点本地都保存了当前最近一次事务的zxid,zxid是递增的,所以谁的zxid越大,就表示谁的数据是最新的。

ZXID的生成规则如下:

ZXID有两部分组成:

  • 任期:完成本次选举后,直到下次选举前,由同一Leader负责协调写入;
  • 事务计数器:单调递增,每生效一次写入,计数器加一。

ZXID的低32位是计数器,所以同一任期内,ZXID是连续的,每个结点又都保存着自身最新生效的ZXID,通过对比新提案的ZXID与自身最新ZXID是否相差“1”,来保证事务严格按照顺序生效的。

8、面试官:你提到了Leader,你知道Zookeeper的服务器有几种角色嘛?Zookeeper下Server工作状态又有几种呢?

小菜鸡的我:

Zookeeper 服务器角色

Zookeeper集群中,有Leader、Follower和Observer三种角色

Leader

Leader服务器是整个ZooKeeper集群工作机制中的核心,其主要工作:

  • 事务请求的唯一调度和处理者,保证集群事务处理的顺序性
  • 集群内部各服务的调度者

Follower

Follower服务器是ZooKeeper集群状态的跟随者,其主要工作:

  • 处理客户端非事务请求,转发事务请求给Leader服务器
  • 参与事务请求Proposal的投票
  • 参与Leader选举投票

Observer

Observer是3.3.0 版本开始引入的一个服务器角色,它充当一个观察者角色——观察ZooKeeper集群的最新状态变化并将这些状态变更同步过来。其工作:

  • 处理客户端的非事务请求,转发事务请求给 Leader 服务器
  • 不参与任何形式的投票

Zookeeper下Server工作状态

服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。

  • 1.LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
  • 2.FOLLOWING:跟随者状态。表明当前服务器角色是Follower。
  • 3.LEADING:领导者状态。表明当前服务器角色是Leader。
  • 4.OBSERVING:观察者状态。表明当前服务器角色是Observer。

9、面试官:你说到服务器角色是基于ZooKeeper集群的,那你画一下ZooKeeper集群部署图吧?ZooKeeper是如何保证主从节点数据一致性的呢?

小菜鸡的我:

ZooKeeper集群部署图

ZooKeeper集群是一主多从的结构:

  • 如果是写入数据,先写入主服务器(主节点),再通知从服务器。
  • 如果是读取数据,既读主服务器的,也可以读从服务器的。

ZooKeeper如何保证主从节点数据一致性

我们知道集群是主从部署结构,要保证主从节点一致性问题,无非就是两个主要问题:

  • 主服务器挂了,或者重启了
  • 主从服务器之间同步数据~

Zookeeper是采用ZAB协议(Zookeeper Atomic Broadcast,Zookeeper原子广播协议)来保证主从节点数据一致性的,ZAB协议支持崩溃恢复和消息广播两种模式,很好解决了这两个问题:

  • 崩溃恢复:Leader挂了,进入该模式,选一个新的leader出来
  • 消息广播: 把更新的数据,从Leader同步到所有Follower

Leader服务器挂了,所有集群中的服务器进入LOOKING状态,首先,它们会选举产生新的Leader服务器;接着,新的Leader服务器与集群中Follower服务进行数据同步,当集群中超过半数机器与该 Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式。Leader 服务器开始接收客户端的事务请求生成事务Proposal进行事务请求处理。

10、面试官:Leader挂了,进入崩溃恢复,是如何选举Leader的呢?你讲一下ZooKeeper选举机制吧

小菜鸡的我:

服务器启动或者服务器运行期间(Leader挂了),都会进入Leader选举,我们来看一下~假设现在ZooKeeper集群有五台服务器,它们myid分别是服务器1、2、3、4、5,如图:

服务器启动的Leader选举

zookeeper集群初始化阶段,服务器(myid=1-5)依次启动,开始zookeeper选举Leader~

  • 服务器1(myid=1)启动,当前只有一台服务器,无法完成Leader选举

  • 服务器2(myid=2)启动,此时两台服务器能够相互通讯,开始进入Leader选举阶段

    1. 每个服务器发出一个投票

      服务器1 和 服务器2都将自己作为Leader服务器进行投票,投票的基本元素包括:服务器的myid和ZXID,我们以(myid,ZXID)形式表示。初始阶段,服务器1和服务器2都会投给自己,即服务器1的投票为(1,0),服务器2的投票为(2,0),然后各自将这个投票发给集群中的其他所有机器。

    2. 接受来自各个服务器的投票

      每个服务器都会接受来自其他服务器的投票。同时,服务器会校验投票的有效性,是否本轮投票、是否来自LOOKING状态的服务器。

    3. 处理投票

      收到其他服务器的投票,会将被人的投票跟自己的投票PK,PK规则如下:

      • 优先检查ZXID。ZXID比较大的服务器优先作为leader。
      • 如果ZXID相同的话,就比较myid,myid比较大的服务器作为leader。 服务器1的投票是(1,0),它收到投票是(2,0),两者zxid都是0,因为收到的myid=2,大于自己的myid=1,所以它更新自己的投票为(2,0),然后重新将投票发出去。对于服务器2呢,即不再需要更新自己的投票,把上一次的投票信息发出即可。
    4. 统计投票

      每次投票后,服务器会统计所有投票,判断是否有过半的机器接受到相同的投票信息。服务器2收到两票,少于3(n/2+1,n为总服务器),所以继续保持LOOKING状态

  • 服务器3(myid=3)启动,继续进入Leader选举阶段

    跟前面流程一致,服务器1和2先投自己一票,因为服务器3的myid最大,所以大家把票改投给它。此时,服务器为3票(大于等于n/2+1),所以服务器3当选为Leader。 服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

  • 服务器4启动,发起一次选举。

    此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。选票信息结果:服务器3为4票,服务器4为1票。服务器4并更改状态为FOLLOWING;

  • 服务器5启动,发起一次选举。

    同理,服务器也是把票投给服务器3,服务器5并更改状态为FOLLOWING;

  • 投票结束,服务器3当选为Leader

服务器运行期间的Leader选举

zookeeper集群的五台服务器(myid=1-5)正在运行中,突然某个瞬间,Leader服务器3挂了,这时候便开始Leader选举~

  • 1.变更状态

    Leader 服务器挂了之后,余下的非Observer服务器都会把自己的服务器状态更改为LOOKING,然后开始进入Leader选举流程。

  • 2.每个服务器发起投票

    每个服务器都把票投给自己,因为是运行期间,所以每台服务器的ZXID可能不相同。假设服务1,2,4,5的zxid分别为333,666,999,888,则分别产生投票(1,333),(2,666),(4,999)和(5,888),然后各自将这个投票发给集群中的其他所有机器。

  • 3.接受来自各个服务器的投票

  • 4.处理投票

最后

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

还有更多面试复习笔记分享如下

(含答案)+21条MySQL性能调优经验**小编已整理成Word文档或PDF文档

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

[外链图片转存中…(img-1Lvz3gkG-1631188132413)]

还有更多面试复习笔记分享如下

[外链图片转存中…(img-TcWOekiD-1631188132414)]

ZooKeeper的十二连问,你顶得了嘛,Java自学宝典电子书下载相关推荐

  1. ZooKeeper的十二连问,你顶得了嘛?

    来源 | 捡田螺的小男孩 [前言]一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github:https://github.com/whx123/JavaHome 什么是Zooke ...

  2. java数组排序sort原理,ZooKeeper的十二连问

    害怕干不过SpringBoot?莫慌,我送你套神级pdf文档 随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring B ...

  3. div默认外边距是多少_CSS盒模型之内边距、边框、外边距 十九问(持续更新)...

    第一问:什么是盒模型? 第二问:两者的区别是什么? 第三问:怎么设置这两种模型呢? 第四问JS怎么获取和设置盒模型的宽高呢,你能想到几种方法 第五问:描述一下下面盒子的大小,颜色什么的(content ...

  4. 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)

    大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...

  5. 面渣逆袭:计算机网络六十二问,三万字图文详解!速收藏!

    这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 基础 1.说下计算机网络体系结构 计算机网络体系结构,一般有三种:OSI 七层模型.TCP/IP 四层模型.五层结 ...

  6. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了

    大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. ...

  7. Android面试官:想进大厂先把基础打牢了再说!网络知识十二问你都答得出来吗?

    前言 过年倒计时- 今天扥想的是网络相关知识,网络知识也是面试常考内容,所以必须要把基础打牢. 网络十二问,送给大家. 这些问题,你能答上来吗 我总结了下网络方面会涉及到的一些问题,大家看看,如果都能 ...

  8. CSS盒模型之内边距、边框、外边距 十九问 (持续更新)

    第一问:什么是盒模型? 第二问:两者的区别是什么? 第三问:怎么设置这两种模型呢? 第四问JS怎么获取和设置盒模型的宽高呢,你能想到几种方法 第五问:描述一下下面盒子的大小,颜色什么的(content ...

  9. 编译器发展史5个十年3大人物及编译器知识(公号回复“编译器”下载PDF资料,欢迎转发、赞赏、支持科普)

    编译器发展史5个十年3大人物及编译器知识(公号回复"编译器"下载PDF资料,欢迎转发.赞赏.支持科普) 原创: 秦陇纪 科学Sciences 今天 科学Sciences导读:继本号 ...

最新文章

  1. 牛逼哄洪的 Java 8 Stream,性能也牛逼么?
  2. Process.Start() 传递参数中有空格问题
  3. 【每周NLP论文推荐】 对话管理中的标志性论文介绍
  4. Android九点阵手势识别,能量黑科技模块八-九:两路按键颜色手势魔块
  5. redis笔记——redis事务及锁应用
  6. 当Java遇上机密计算,又一段奇幻之旅开始了!
  7. python界面开发webview_Python+Appium学习篇之WebView处理
  8. python 入门基础-零基础入门Python,看这一篇就够了!
  9. python源码不需要编译成二进制代码_编译 Python 源代码
  10. Win7 下 VS2005 不能断点调试解决办法
  11. python初探偏微分方程数值解
  12. android 脱壳 加固,安卓的脱壳之战-爱加密加固
  13. Android屏幕截图实现方式 系统截屏源码分析和三指截屏
  14. 计算机分辨率无法调整,教你电脑分辨率调不过来怎么办
  15. java poi生成word
  16. 【关闭Antimalware Service Executable(windows defender)】
  17. markdown文本居中,段首缩进的方法
  18. 控制理论中的几种稳定性
  19. linux里面怎么进入U盘目录,在linux u盘在哪个文件夹。
  20. Harmonyos应用开发第一次笔记

热门文章

  1. BGP路由协议多线的优势
  2. 【ChatGPT的小妙招】结合Excel的vbs开发者工具达成对Excel文件的处理
  3. 人生五堂课:读万卷书、行万里路、阅人无数、名师指路、自己开悟
  4. O_CREAT O_EXCL O_APPEND O_TRUNC
  5. Linux以只写方式打开文件,creat只能以只写方式打开文件
  6. 谷歌浏览器 input 默认填充问题
  7. 使用CSS3制作网页动态效果入门
  8. 服务器回收信息,旧服务器回收
  9. keil MDK5搭建STM32开发环境
  10. 几何画板手机版_几何画板手机版