Zookeeper面试题总结

news/2024/9/28 13:15:10 标签: zookeeper

1、说说 Zookeeper 是什么?

有些软件你想做成集群或者分布式,你可以用 ZooKeeper 帮你来辅助实现。
特点:ZooKeeper 的特点:维护、协调、管理、监控

最终一致性:客户端看到的数据最终是一致的。可靠性:服务器保存了消息,那么它就一直都存在。
实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据。独立性(等待无关):不同客户端直接互不影响。原子性:更新要不成功要不失败,没有第三个状态。

2、ZooKeeper 有哪些应用场景?

A、数据发布与订阅

数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到 ZooKeeper 的一个或一系列的

节点上,供订阅者进行数据订阅,达到动态获取数据的目的。

配置信息一般有几个特点:

1. 数据量小的KV 2. 数据内容在运行时会发生动态变化3. 集群机器共享,配置一致

ZooKeeper 采用的是推拉结合的方式。

1. 推: 服务端会推给注册了监控节点的客户端 Wathcer 事件通知

2. 拉: 客户端获得通知后,然后主动到服务端拉取最新的数据

B、命名服务

  作为分布式命名服务,命名服务是指通过指定的名字来获取资源或者服务的地址,利用ZooKeeper创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。统一命名服务的命名结构图如下所示:

1、在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。类似于域名与IP之间对应关系,IP不容易记住,而域名容易记住。通过名称来获取资源或服务的地址,提供者等信息。

2、按照层次结构组织服务/应用名称。可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。

C、集群管理

所谓集群管理就是:是否有机器退出和加入、选举master。

集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集,后者则是对

集群进行操作与控制。开发和运维中,面对集群,经常有如下需求:

1. 希望知道集群中究竟有多少机器在工作

2. 对集群中的每台机器的运行时状态进行数据收集

3. 对集群中机器进行上下线的操作

3、说说Zookeeper的工作原理?

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。Zab协议 的全称是 Zookeeper Atomic Broadcast** (Zookeeper原子广播)。Zookeeper 是通过Zab 协议来保证分布式事务的最终一致性。Zab协议要求每个 Leader 都要经历三个阶段:发现,同步,广播。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加 上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一 个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

epoch:可以理解为皇帝的年号,当新的皇帝leader产生后,将有一个新的epoch年号。

每个Server在工作过程中有四种状态:LOOKING:当前Server不知道leader是谁,正在搜寻。

LEADING:当前Server即为选举出来的leader。FOLLOWING:leader已经选举出来,当前Server与之同步。OBSERVING:观察者状态;表明当前服务器角色是 Observer

4、请描述一下 Zookeeper 的通知机制是什么?

Zookeeper 允许客户端向服务端的某个 znode 注册一个 Watcher 监听,当服务端的一些指定事件,触发了这个 Watcher ,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变

客户端注册 Watcher

1、调用 getData、getChildren、exist 三个 API ,传入Watcher 对象。

2、标记请求request ,封装 Watcher 到 WatchRegistration 。

3、封装成 Packet 对象,发服务端发送request 。

4、收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理。

5、请求返回,完成注册。

服务端处理 Watcher

1、服务端接收 Watcher 并存储。

2、Watcher 触发

3、调用 process 方法来触发 Watcher 。

客户端回调 Watcher

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

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

5、Zookeeper 对节点的 watch 监听通知是永久的吗?

不是一次性的

6、 Zookeeper 集群中有哪些角色?

一个集群中最少需要 3 台。

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

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

Observer处理客户端的非事务请求,转发事务请求给 Leader 服务器不参与任何形式的投票。Observer 不需要将事务持久化到磁盘,一旦 Observer 被重启,需要从 Leader 重新同步整个名字空间.

7、 Zookeeper 是如何保证事务的顺序一致性的呢

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

8、 ZooKeeper 集群中个服务器之间是怎样通信的

Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接,同时为每个Follower/Observer 都创建一个叫做 LearnerHandler 的实体。LearnerHandler 主要负责 Leader 和Follower/Observer 之间的网络通讯,包括数据同步,请求转发和 proposal 提议的投票等。Leader 服务器保存了所有 Follower/Observer 的 LearnerHandler

9、ZooKeeper 分布式锁怎么实现的?

如果有客户端1、客户端2等N个客户端争抢一个 Zookeeper 分布式锁。大致如下:

1. 大家都是上来直接创建一个锁节点下的一个接一个的临时有序节点

2. 如果自己不是第一个节点,就对自己上一个节点加监听器

3. 只要上一个节点释放锁,自己就排到前面去了,相当于是一个排队机制。而且用临时顺序节的

另外一个用意就是,如果某个客户端创建临时顺序节点之后,不小心自己宕机了也没关系,Zookeeper 感知到那个客户端宕机,会自动删除对应的临时顺序节点,相当于自动释放锁,或者是自动取消自己的排队。本地锁,可以用 JDK 实现,但是分布式锁就必须要用到分布式的组件。比如 ZooKeeper、Redis。

死锁问题:锁不能因为意外就变成死锁,所以要用 ZK 的临时节点,客户端连接失效了,锁就自动释放了。锁等待问题:锁有排队的需求,所以要 ZK 的顺序节点。

锁管理问题:一个使用释放了锁,需要通知其他使用者,所以需要用到监听。

监听的羊群效应:比如有 1000 个锁竞争者,锁释放了,1000 个竞争者就得到了通知,然后判断,最终序号最小的那个拿到了锁。其它 999 个竞争者重新注册监听。这就是羊群效应,出点事,就会惊动整个羊群。应该每个竞争者只监听自己前面的那个节点。比如 2 号释放了锁,那么只有 3 号得到了通知。

10、了解Zookeeper的系统架构吗?

a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。

b) 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。

c) 当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast的过程。

d) Atomic Brodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。

11、你熟悉Zookeeper节点ZNode和相关属性吗?

Znode两种类型 :

持久的(persistent):客户端和服务器端断开连接后,创建的节点不删除(默认)。

短暂的(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。

Znode有四种形式 :

1、持久化目录节点(PERSISTENT):客户端与Zookeeper断开连接后,该节点依旧存在

2、持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL):客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号:

3、临时目录节点(EPHEMERAL):客户端与Zookeeper断开连接后,该节点被删除

4、临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL):客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

12、Zookeeper选举中投票信息的五元组是什么?

Leader:被选举的 Leader 的 SIDZxid:被选举的 Leader 的事务 ID

Sid:当前服务器的 SIDelectionEpoch:当前投票的轮次peerEpoch:当前服务器的 Epoch

Epoch > Zxid > SidEpoch,Zxid 都可能一致,但是 Sid 一定不一样,这样两张选票一定会 PK 出结果。

13、ZooKeeper 的持久化

数据,存到磁盘或者文件当中。机器重启后,数据不会丢失。内存 -> 磁盘的映射,和序列化有些像。

napShot 快照,记录内存中的全量数据,TxnLog 增量事务日志,记录每一条增删改记录(查不是事务日志,不会引起数据变化)


http://www.niftyadmin.cn/n/347982.html

相关文章

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析 一、ELF概述二、ELF的组成结构2.1 ELF header:解析出 section headers 含31个section节和 program headers 含13个segment段2.2 Section Headers:获取当前程序的31个section节区信息2…

如何设计正确的SpringBoot接口访问频率?

最近在基于SpringBoot做一个面向普通用户的系统,为了保证系统的稳定性,防止被恶意攻击,我想控制用户访问每个接口的频率。为了实现这个功能,可以设计一个annotation,然后借助AOP在调用方法之前检查当前ip的访问频率&am…

IO流详解

IO流 1. 文件 1.1 什么是文件 文件对大家来说都不陌生: 文件是保存数据的地方,它可以保存文字、图片、视频等等例如大家平时使用的word文档、Excel文档、PPT文档等都是文件 1.2 文件流 文件在程序中是以流的形式来操作的流是指数据在数据源&#x…

代码随想录算法训练营第48天 |198、213、337

198. 打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一…

当四款AI大模型遇上考公真题,谁被难倒了?

在当今社会,人工智能(AI)正以不可思议的速度发展,并在各个领域崭露头角,给人们的生活和工作带来许多便利。AI大模型被誉为人类“第二大脑”,成为人们学习、生活、工作的 “智能助手”。 公务员考试在我国教…

ProtoBuf安装及避坑指南

文章目录 安装前注意事项(避坑)ProtoBuf在Linux下的安装protoBuf 测试demo 安装前注意事项(避坑) 1.安装前,我们需要升级g,使用较新的g编译器。 2.在安装过程中,出现问题,可以选择安装其他版本,在加压文件下执行make …

借助TeeChart图表控件,创建本地静态、实时浏览器图表

Steema是全球领先的图表类控件公司,总部设在西班牙的巴塞罗那附近,Steema公司的VCL图表报表控件在全球拥有极高知名度。TeeChart可以在微软的Visual Studio、Office和.NET以及Java和PHP开发平台中使用,也可以作为本地Javascript-HTML5使用。 …

品优购项目06课后作业--产品详情页,text-align:justify属性无效,

文章目录 0.编程中出现的问题0.1 html文字字数不一致的布局方法,也就是如何实现文字俩端对齐?0.2 text-align:justify;属性无效怎么办? 1.结构分析1.1 快捷导航栏header头部模块nav导航模块1.2 主产品模块1.3 产品详情模块 2.代码部分2.1 主产…