Zookeeper面试题

Zookeeper是一个开源的分布式协调服务。他是一个为分布式应用提供一致性服务的软件。简单点说就是辅助分布式系统,帮助分布式系统提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。其设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一些简单的接口提供给用户使用。

分布式应用程序可以基于Zookeeper实现数据发布与订阅,负载均衡,命名服务,集群管理,Leader选举,分布式锁,分布式队列

1.Zookeeper是什么

Zookeeper是一个分布式协调服务,为分布式系统提供数据一致性的服务。分布式系统在他的基础上可以实现数据发布/订阅,负载均衡,Leader选举,分布式锁等功能

2. Zookeeper提供了什么

文件系统和通知机制

3.Zookeeper文件系统

Zookeeper提供了一个多层级的节点命名空间,只有文件节点才可以存放数据
Zookeeper为了保证高吞吐和低延迟,在内存中维护了一个树状的目录结构,每个节点的存放数据上限为1M

4. 四种类型的数据节点ZNode

持久节点:不主动删除,则一直存在

持久顺序节点:在持久节点的基础上加了顺序性,节点名会追加一个由父节点维护的自增整型数字

临时节点:临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与Zookeeper连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除

临时顺序节点:在临时节点的基础上增加了顺序性

这里解释以下客户端会话:客户端启动时,会与服务器建立TCP连接,连接成功后,客户端的生命周期开始,客户端和服务器通过心跳检测保持有效的会话以及请求响应,监听Watcher事件

5.Watcher机制

Zookeeper允许客户端向服务端的某个ZNode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能。

工作机制:

1)客户端注册Watcher

调用getData()/getChildren()/exist()三个API,传入Watcher对象
标记请求request,封装Watcher到WatchRegistration
封装成Packet对象,向服务端发送request
收到服务端响应后,将Watcher注册到ZKWatcherManager中进行管理
请求返回,完成注册
2)服务端处理Watcher

服务端接收Watcher并存储
Watcher触发
3)客户端回调Watcher

客户端SendThread线程接收事件通知,交由EventThread线程回调Watcher
客户端的Watcher机制同样是一次性的
特性:

1)一次性:无论时服务端还是客户端,一旦一个Watcher被触发,Zookeeper都会将其相应的存储中移除。这样的设计有效的减轻了服务端的压力。不然对于更新频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大

2)客户端串行执行:客户端Watcher回调的过程是一个串行同步的过程

3)轻量:Watcher通知非常简单,只会告诉客户端发生了事件,不会说明事件的具体内容

6.Zookeeper如何保证主从节点的状态同步

通过ZAB协议,基于崩溃恢复的原子广播协议。

Zookeeper主要依靠ZAB协议实现数据一致性

崩溃恢复:当zk服务刚刚启动或者Leader服务器宕机时导致不存在过半的服务器与Leader服务器保持通信时,所有的服务器进入崩溃恢复模式,首先会选举出新的leader,然后其他follower开始与leader进行数据同步

消息广播:当集群中超过一半的服务完成数据通信后,退出崩溃恢复进行消息广播,开始接收客户端的请求事务进行事处理。这时进入一个server,它会在恢复模式下启动,发现leader并进行数据同步。同步结束后,也进入消息广播模式

详细了解:http://82.157.68.61/index.php/2021/12/23/zab%e5%8d%8f%e8%ae%ae/

7.Zookeeper的典型应用场景

1)数据发布/订阅:

简介:用来做配置中心
目的:可以动态获取数据,实现数据的集中式管理和数据的动态更新
数据存储:存储到Zookeeper上的一个数据节点
数据获取:应用在启动初始化节点从Zookeeper数据节点读取数据,并注册一个Watcher
数据变更:收到Watcher发送的变更通知后,重新读取即可
2)命名服务:

利用Zookeeper创建顺序节点,生成全局唯一id
3)集群管理

注意点:是否有机器退出或加入,选举Master
利用的是客户端和服务端一旦失效,临时节点自动销毁,通过这样的方式就可以识别是否有机器退出或加入
4)分布式锁

排他锁:选用临时节点,利用只有一个客户端能够创建成功,也就是或得到了锁
共享锁(读写锁):选用临时顺序节点
这里给大家解释一下:

文章大部分内容都是文字性的叙述,整体来说有点抽象,下面附一张Zookeeper图

左边代表服务端,是Zookeeper的一个集群,locker是持久节点,下面三个是locker的临时顺序节点,client代表三个客户端。Service表示需要互斥的访问共享资源
获取分布式锁的思路:

在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。每个客户端通过调用createNode方法在locker下创建临时顺序节点,然后调用getChildren(“locker”)来获取locker下面的所有子节点。客户端获取到所有的子节点后,如果发现自己在之前创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己不是最小的,需要找到比自己小的节点,对其调用exist()方法,同时对其注册事件监听器。简单点说就是监听他释放锁。

排他锁:加了排他锁后,不允许其他其他事务加任何锁,获准排他锁的事务可以读和修改。在zookeeper的基础上,在需要获取排他锁时,所有的客户端都会调用create方法在固定路径下创建临时节点,并发环境下,只有一个客户端可以创建成功,也就相当于获取了锁
共享锁:只读。分布式进程在读写一个共享数据时,可以先在某个公共目录下创建一个有序子目录,然后判断该目录id是否最小。目录id最小则获得锁并消费共享数据,然后删除该目录。否则则等待,直到自己的目录id成为最小后,才获得锁。
这里我写一下实现共享锁的具体步骤:

1)定义锁

2)获取锁
在需要获取共享锁时,所有的客户端都会到/share_lock这个节点下面创建一个临时顺序节点

这就是具体的处理逻辑

3)释放锁

8. ZAB协议和Paxos协议的区别

相同点:

两者都存在类似于Leader进程的角色,由其负责协调多个Follower进程的运行
Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交
ZAB协议中,每个Proposal中都包含了一个epoch值来代表当前的Leader周期,Paxos中名字为Ballot
不同点:

ZAB用来构建高可用的分布式数据主备系统,Paxos是用来构建分布式一致性状态机系统

9.ACL权限控制

访问控制列表,用于控制资源的访问权限。zk利用ACL策略控制节点的访问权限

使用schema:ID:permission来进行标识

权限模式

授权对象
指的是权限赋予的用户或一个实体

权限

10.Chroot特性

3.2.0版本后,添加了Chroot特性,该特性允许每个客户端为自己设置一个命名空间,如果一个客户端设置了Chroot,那么该客户端对服务器的任何操作,都会被限制在其自己的命名空间下。
通过设置Chroot,能够将一个客户端应用于Zookeeper服务端的一颗子树相对应,在那些多个应用共用一个zk集群的场景下,对实现不同应用间的相互隔离非常有帮助

11.会话管理

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

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

12.服务器角色

Leader

1)事务请求的唯一调度和处理者,保证集群事务处理的顺序性

2)集群内部各服务的调度者

Follower

1)处理客户端的非事务请求,转发事务请求给Leader服务器

2)参与事务请求Proposal(提议)的投票

3)参与Leader选举投票

Observer

在不影响集群事务处理能力的基础上提升集群的非事务处理能力

1)处理客户端的非事务请求,转发事务请求给Leader服务器

2)不参与任何形式的投票

13.Zookeeper下Server工作状态

1)LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态

2)FOLLOWING:跟随者状态。表明当前服务器角色是Follower

3)LEADING:领导者状态。表明当前服务器角色是Leader

4)OBSERVER:观察者状态。表明当前服务器角色是observer

14.Zookeeper是如何保证事务的顺序一致性的

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

15. Zookeeper节点宕机该如何处理

如果宕机的是Follower,因为Zookeeper上的数据是多个副本的,数据不会丢失

如果宕机的是Leader,Zookeeper会选举新的Leader

只有集群宕机到只剩一半或以下时,集群才会失效

最少可以有2个节点,但不能有任何一个宕机

16. Zookeeper负载均衡和Nginx负载均衡有什么区别

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

另外,这里几乎没有写实际操作Zookeeper,其实Zookeeper需要我们手动操作的地方还是很多的,例如使用linux命令行操作,使用API操作,还有搭建集群(三种模式)。推荐大家对这些东西可以手动操作一遍,这些东西都记录在我的笔记当中,如果大家想看我的笔记可以私聊我,想看的人多的话我后续也可以上传我的笔记。欢迎交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值