ZooKeeper面试题(2020最新版,狂神说docker进阶笔记

2023-11-17

这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知。

9. 客户端回调 Watcher


客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher。

客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了。

10. ACL 权限控制机制


UGO(User/Group/Others)

目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。

ACL(Access Control List)访问控制列表

包括三个方面:

权限模式(Scheme)

(1)IP:从 IP 地址粒度进行权限控制

(2)Digest:最常用,用类似于 username:password 的权限标识来进行权限配置,便于区分不同应用来进行权限控制

(3)World:最开放的权限控制方式,是一种特殊的 digest 模式,只有一个权限标识“world:anyone”

(4)Super:超级用户

授权对象

授权对象指的是权限赋予的用户或一个指定实体,例如 IP 地址或是机器灯。

权限 Permission

(1)CREATE:数据节点创建权限,允许授权对象在该 Znode 下创建子节点

(2)DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点

(3)READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等

(4)WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作

(5)ADMIN:数据节点管理权限,允许授权对象对该数据节点进行 ACL 相关设置操作

11. Chroot 特性


3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。

通过设置 Chroot,能够将一个客户端应用于 Zookeeper 服务端的一颗子树相对应,在那些多个应用公用一个 Zookeeper 进群的场景下,对实现不同应用间的相互隔离非常有帮助。

12. 会话管理


分桶策略:将类似的会话放在同一区块中进行管理,以便于 Zookeeper 对会话进行不同区块的隔离处理以及同一区块的统一处理。

分配原则:每个会话的“下次超时时间点”(ExpirationTime)

计算公式:

ExpirationTime_ = currentTime + sessionTimeout

ExpirationTime = (ExpirationTime_ / ExpirationInrerval + 1) *

ExpirationInterval , ExpirationInterval 是指 Zookeeper 会话超时检查时间间隔,默认 tickTime

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 中最小 ZXIDmaxCommittedLog:

· 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 有哪几种几种部署模式?


Zookeeper 有三种部署模式:

  1. 单机部署:一台集群上运行;

  2. 集群部署:多台集群运行;

  3. 伪集群部署:一台集群启动多个 Zookeeper 实例运行。

21. 集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?


集群规则为 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)分布式队列

数据发布/订阅

介绍

数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者进行数据订阅。

目的

动态获取数据(配置信息)

实现数据(配置信息)的集中式管理和数据的动态更新

设计模式

Push 模式

Pull 模式

数据(配置信息)特性

(1)数据量通常比较小

(2)数据内容在运行时会发生动态更新

(3)集群中各机器共享,配置一致

如:机器列表信息、运行时开关配置、数据库配置信息等

基于 Zookeeper 的实现方式

· 数据存储:将数据(配置信息)存储到 Zookeeper 上的一个数据节点

· 数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并在该节点上注册一个数据变更 Watcher

· 数据变更:当变更数据时,更新 Zookeeper 对应节点数据,Zookeeper会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即可。

负载均衡

zk 的命名服务

命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

分布式通知和协调

对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,然后 zk 将这些变化发送给注册了这个节点的 watcher 的所有客户端。

对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况。

zk 的命名服务(文件系统)

命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

zk 的配置管理(文件系统、通知机制)

程序分布式的部署在不同的机器上,将程序的配置信息放在 zk 的 znode 下,当有配置发生改变时,也就是 znode 发生变化时,可以通过改变 zk 中某个目录节点的内容,利用 watcher 通知给各个客户端,从而更改配置。

Zookeeper 集群管理(文件系统、通知机制)

所谓集群管理无在乎两点:是否有机器退出和加入、选举 master。

对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点

的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper 的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。

新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount 又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为 master 就好。

Zookeeper 分布式锁(文件系统、通知机制)

有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

对于第一类,我们将 zookeeper 上的一个 znode 看作是一把锁,通过 createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放出锁。

对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次方便。

Zookeeper 队列管理(文件系统、通知机制)

两种类型的队列:

(1)同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。

(2)队列按照 FIFO 方式进行入队和出队操作。

第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。

第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建 PERSISTENT_SEQUENTIAL 节点,创建成功时Watcher 通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

最后提醒一下哦,如果你想要学习,却无奈于没有干货学习资料,只需你多多支持一下即可

QUENTIAL 节点,创建成功时Watcher 通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

[外链图片转存中…(img-GGiBFVBV-1630919456119)]

  • 算法与编程

[外链图片转存中…(img-uyD2Ow41-1630919456121)]

  • 数据库部分

[外链图片转存中…(img-NCnUqu7L-1630919456123)]

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

[外链图片转存中…(img-qPIUHcQD-1630919456125)]

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

最后提醒一下哦,如果你想要学习,却无奈于没有干货学习资料,只需你多多支持一下即可

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZooKeeper面试题(2020最新版,狂神说docker进阶笔记 的相关文章

随机推荐

  • MySQL第一讲 一遍让你彻底掌握MVCC多版本并发控制机制原理

    Mysql在可重复读隔离级别下 同样的sql查询语句在一个事务里多次执行查询结果相同 就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果 这个隔离性就是靠MVCC Multi Version Concurrency Contro
  • Python爬虫入门8:BeautifulSoup获取html标签相关属性

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 引言 在上节 https blog csdn net LaoYuanPython article details 113091721 Pyth
  • 【神经网络搜索】DARTS: Differentiable Architecture Search

    GiantPandaCV DARTS将离散的搜索空间松弛 从而可以用梯度的方式进行优化 从而求解神经网络搜索问题 本文首发于GiantPandaCV 未经允许 不得转载 1 简介 此论文之前的NAS大部分都是使用强化学习或者进化算法等在离散
  • io回顾

    package test import java io 读取一个文件 并打印在控制台上 class FileReaderTest public static void main String args throws IOException
  • Golang 项目部署实战

    一直认为不懂部署的开发工程师不是好的开发工程师 以下以一些实例讲解自己在项目中的 Golang 后端部署的情况 一般部署脚本应该具有构建 启动 停止 回滚已经查看记录日志等功能 以下分别将这些功能以单个脚本的形式给出 当然也可以写成Make
  • 数学建模算法体系分类

    数学建模算法体系 数据预处理模型 插值拟合 插值 拉格朗日插值法 分段线性插值 牛顿插值 埃尔米特 Hermite 插值 三次样条插值 n维数据插值 拟合 最小二乘法 评价 拟合工具箱 主成分分析 聚类分析 均值 方差分析 协方差分析等统计
  • 基于STM32的智能泊车系统

    一 前言 想起第一次参加的电子设计校赛好像在昨天一样 虽然确实在昨天 但是为了纪念这一段时间的劳动 并且记录一下遇到的问题 所以写了这篇文章 二 实现思路 通过手机向停车场发送停车请求 然后停车场通过判断车位是否为空 控制继电器打开相应的电
  • asp.net zero 8.2 学习-4-创建接口及服务

    上一节 在框架添加了实体 这一节 写接口及服务类 实现实体的增删改查 创建接口 SIS Application Shared层 创建DTO SIS Application Shared层 对应的Dto文件夹 创建Dto映射Mapper SI
  • vue-el-admin 使用?

    一 搭建 下载 启动 下载地址 panjiachen vue el admin Gitee com 共两个版本 vue element admin 完善版 vue admin template 极简版 启动 node js切换版本到16及以
  • STM32——端口复用与重映射

    目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例 串口1 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 AFIO时钟 开启AFIO情况 重映射端口
  • 用户注册及登录测试用例小记

    用户注册及登录测试用例
  • 更换PostgreSQL的data并重启服务

    更换 PostgreSQL 的 data 文件夹并重新启动 PostgreSQL 服务 适应场景 系统崩溃 需要恢复 PostgreSQL 数据及服务 平时可用的一种 PostgreSQL 备份 还原手段 操作步骤 导出 PostgreSQ
  • @SpringBootApplication注解学习

    SpringBootApplication 组合注解 具有多个注解功能 SpringBootConfiguration Documented 表明这个注解应该被 javadoc工具记录 没什么用 Configuration 表示当前类可以看
  • (ffmpeg)ffmpeg+SDL的简单播放器(雷霄骅)更新版

    代码源自雷神 一个是播放音频的demo 可以播放MP3和AAC 但是MP3应该是没有封面的 另一个是播放ts格式的视频 没有声音 源码可以到雷神博客下载 但是因为ffmpeg库的更新问题 并不能直接在ubuntu下直接运行 笔者做了修改 在
  • 第九周 【项目3 - 利用二叉树遍历思想解决问题】

    Copyright c 2017 烟台大学计算机与控制工程学院 All rights reservrd 作者 赵楷文 完成时间 2017年10月28日 版本号 v1 0 问题描述 利用二叉树遍历思想解决问题 一 头文件 btree h 包含
  • 支付宝、微信、银联三种支付平台链接

    1 申请支付宝需要的资料 支付宝移动开发平台 1 单位营业执照彩色扫描件或数码照片 2 组织机构代码证彩色扫描件或数码照片 3 对公银行账户 基本账户 一般账户均可 4 法定代表人的身份证彩色扫描件或数码照片 若为代理人 即法人以外的公司代
  • Redis(三)分布式应用

    一 分布式支持 1 性能 Redis本身的QPS已经很高了 但是如果在一些并发量非常高的情况下 性能还是会受到影响 这个时候我们希望有更多的Redis服务来分摊压力 实现负载均衡 2 高可用 如果只有一个Redis服务 一旦服务宕机 那么所
  • 解决在安装vue-cli脚手架出现的问题

    今天下载安装vue cli脚手架的时候 出现如下问题 刚开始我还以为是我曾经下载过vue cli 然后我便去执行卸载的命令 事实证明我从未下载过vue cli脚手架 下面我就记录一下我自己的解决方法 npm WARN deprecated
  • 关于遗传算法

    关于遗传算法 有很多袋鼠 它们降落到喜玛拉雅山脉的任意地方 这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰 但每过几年 就在一些海拔高度较低的地方射杀一些袋鼠 于是 不断有袋鼠死于海拔较低的地方 而越是在海拔高的袋鼠越是能活得更久 也越有机会生
  • ZooKeeper面试题(2020最新版,狂神说docker进阶笔记

    这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知 9 客户端回调 Watcher 客户端 SendThread 线程接收事件通知 交由 EventThread 线程回调 Watch