互联网Java工程师面试题·Zookeeper 篇·第二弹

目录

[13. 服务器角色](#13. 服务器角色)

[14. Zookeeper 下 Server 工作状态](#14. Zookeeper 下 Server 工作状态)

[15. 数据同步](#15. 数据同步)

[16. zookeeper 是如何保证事务的顺序一致性的?](#16. zookeeper 是如何保证事务的顺序一致性的?)

[17. 分布式集群中为什么会有 Master?](#17. 分布式集群中为什么会有 Master?)

[18. zk 节点宕机如何处理?](#18. zk 节点宕机如何处理?)

[19. zookeeper 负载均衡和 nginx 负载均衡区别](#19. zookeeper 负载均衡和 nginx 负载均衡区别)

[20. Zookeeper 有哪几种几种部署模式?](#20. Zookeeper 有哪几种几种部署模式?)

[21. 集群最少要几台机器,集群规则是怎样的?](#21. 集群最少要几台机器,集群规则是怎样的?)

[22. 集群支持动态添加机器吗?](#22. 集群支持动态添加机器吗?)

[23. Zookeeper 对节点的 watch监听通知是永久的吗?为什么不是永久的?](#23. Zookeeper 对节点的 watch监听通知是永久的吗?为什么不是永久的?)

[24. Zookeeper 的 java 客户端都有哪些?](#24. Zookeeper 的 java 客户端都有哪些?)

[25. chubby 是什么,和 zookeeper 比你怎么看?](#25. chubby 是什么,和 zookeeper 比你怎么看?)

[26. 说几个 zookeeper 常用的命令。](#26. 说几个 zookeeper 常用的命令。)

[27. ZAB 和 Paxos 算法的联系与区别?](#27. ZAB 和 Paxos 算法的联系与区别?)

[28. Zookeeper 的典型应用场景](#28. Zookeeper 的典型应用场景)


13. 服务器角色

Leader
1 、事务请求的唯一调度和处理者,保证集群事务处理的顺序性
2 、集群内部各服务的调度者
Follower
1 、处理客户端的非事务请求,转发事务请求给 Leader 服务器
2 、参与事务请求 Proposal 的投票
3 、参与 Leader 选举投票
Observer
1 、 3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提
升集群的非事务处理能力
2 、处理客户端的非事务请求,转发事务请求给 Leader 服务器
3 、不参与任何形式的投票


14. Zookeeper 下 Server 工作状态

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


15. 数据同步

整个集群完成 Leader 选举之后, Learner ( Follower 和 Observer 的统称)回向Leader 服务器进行注册。当 Learner 服务器想 Leader 服务器完成注册后,进入数据同步环节。
数据同步流程:(均以消息传递的方式进行)
Learner 向 Learder 注册
数据同步
同步确认
Zookeeper 的数据同步通常分为四类:
1 、直接差异化同步( DIFF 同步)
2 、先回滚再差异化同步( TRUNC+DIFF 同步)
3 、仅回滚同步( TRUNC 同步)
4 、全量同步( SNAP 同步)
在进行数据同步前, Leader 服务器会完成数据同步初始化:
peerLastZxid :
从 learner 服务器注册时发送的 ACKEPOCH 消息中提取 lastZxid(该Learner 服务器最后处理的 ZXID)
minCommittedLog :
Leader 服务器 Proposal 缓存队列 committedLog 中最小 ZXID
maxCommittedLog :
Leader 服务器 Proposal 缓存队列 committedLog 中最大 ZXID
直接差异化同步( DIFF 同步)
场景: peerLastZxid 介于 minCommittedLog 和 maxCommittedLog 之间
先回滚再差异化同步( TRUNC+DIFF 同步)
场景:当新的 Leader 服务器发现某个 Learner 服务器包含了一条自己没有的事务记录,那么就需要让该 Learner 服务器进行事务回滚 -- 回滚到 Leader服务器上存在的,同时也是最接近于 peerLastZxid 的 ZXID
仅回滚同步( TRUNC 同步)
场景: peerLastZxid 大于 maxCommittedLog
全量同步( SNAP 同步)
场景一: peerLastZxid 小于 minCommittedLog
场景二: Leader 服务器上没有 Proposal 缓存队列且 peerLastZxid 不等于 lastProcessZxid


16. zookeeper 是如何保证事务的顺序一致性的?

zookeeper 采用了全局递增的事务 Id 来标识,所有的 proposal (提议)都在被提出的时候加上了 zxid , zxid 实际上是一个 64 位的数字,高 32 位是 epoch (时期; 纪元 ; 世 ; 新时代)用来标识 leader 周期,如果有新的 leader 产生出来, epoch会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。


17. 分布式集群中为什么会有 Master?

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机 器可以共享这个结果,这样可以大大减少重复计算,提高性能,于是就需要进行 leader 选举。


18. zk 节点宕机如何处理?

Zookeeper 本身也是集群,推荐配置不少于 3 个服务器。 Zookeeper 自身也要保证当一个节点宕机时,其他节点会继续提供服务。
如果是一个 Follower 宕机,还有 2 台服务器提供访问,因为 Zookeeper 上的数据是有多个副本的,数据并不会丢失;
如果是一个 Leader 宕机, Zookeeper 会选举出新的 Leader 。
ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。
所以
3 个节点的 cluster 可以挂掉 1 个节点 (leader 可以得到 2 票 >1.5)
2 个节点的 cluster 就不能挂掉任何 1 个节点了 (leader 可以得到 1 票 <=1)


19. zookeeper 负载均衡和 nginx 负载均衡区别

zk 的负载均衡是可以调控, nginx 只是能调权重,其他需要可控的都需要自己写
插件;但是 nginx 的吞吐量比 zk 大很多,应该说按业务选择用哪种方式。


20. Zookeeper 有哪几种几种部署模式?

部署模式:单机模式、伪集群模式、集群模式。


21. 集群最少要几台机器,集群规则是怎样的?

集群规则为 2N+1 台, N>0 ,即 3 台。


22. 集群支持动态添加机器吗?

其实就是水平扩容了, Zookeeper 在这方面不太好。两种方式:
全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。
3.5 版本开始支持动态扩容。


23. Zookeeper 对节点的 watch监听通知是永久的吗?为什么不是永久的?

不是。官方声明:一个 Watch 事件是一个一次性的触发器,当被设置了 Watch 的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。
为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。
一般是客户端执行 getData("/ 节点 A",true) ,如果节点 A 发生了变更或删除,客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没有设置 watch 事件,就不再给客户端发送。
在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。


24. Zookeeper 的 java 客户端都有哪些?

java 客户端: zk 自带的 zkclient 及 Apache 开源的 Curator 。


25. chubby 是什么,和 zookeeper 比你怎么看?

chubby 是 google 的,完全实现 paxos 算法,不开源。 zookeeper 是 chubby的开源实现,使用 zab 协议, paxos 算法的变种。


26. 说几个 zookeeper 常用的命令。

常用命令: ls get set create delete 等。


27. ZAB 和 Paxos 算法的联系与区别?

相同点:
1 、两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行
2 、 Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提案进行提交
3 、 ZAB 协议中,每个 Proposal 中都包含一个 epoch 值来代表当前的 Leader周期,Paxos 中名字为 Ballot
不同点:
ZAB 用来构建高可用的分布式数据主备系统( Zookeeper ), Paxos 是用来构建
分布式一致性状态机系统。


28. Zookeeper 的典型应用场景

Zookeeper 是一个典型的发布 / 订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。
通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,可以非常方便的构建一系列分布式应用中年都会涉及的核心功能,如:
1 、数据发布 / 订阅
2 、负载均衡
3 、命名服务
4 、分布式协调 / 通知
5 、集群管理
6 、 Master 选举
7 、分布式锁
8 、分布式队列


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

相关推荐
所待.3833 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood6 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-11 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟30 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生37 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言