Zookeeper

目录

1、说说 Zookeeper 是什么?

2、ZooKeeper 有哪些应用场景?

3、说说Zookeeper的工作原理?

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

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

6、 Zookeeper 集群中是怎样选举leader的?

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

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

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

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

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

13、为什么Zookeeper集群的数目,一般为奇数个?

14、知道Zookeeper监听器的原理吗?

15、说说 Zookeeper 的 CAP 问题上做的取舍?

16、说说Zookeeper中的脑裂?

17、Zookeeper脑裂是什么原因导致的?

18、Zookeeper 是如何解决脑裂问题的?

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

20、讲解一下 ZooKeeper 的持久化机制

21、在Zookeeper中Zxid和Epoch是什么,有什么作用?

22、ZooKeeper 负载均衡和 Nginx 负载均衡有什么区别?

23、说说ZooKeeper 的序列化

24、说说Zookeeper中的ACL 权限控制机制

26、描述一下 ZAB 协议

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

28、Zookeeper集群支持动态添加机器吗?


1、说说ZooKeeper 是什么?


直译:从名字上直译就是动物管理员,动物指的是 Hadoop 一类的分布式软件,管理员三个字体现了 ZooKeeper 的特点:维护、协调、管理、监控。
简述:有些软件你想做成集群或者分布式,你可以用 ZooKeeper 帮你来辅助实现。
特点:

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

2、ZooKeeper 有哪些应用场景?


A、数据发布与订阅
 发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZooKeeper节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使用。
数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到 ZooKeeper 的一个或一系列的
节点上,供订阅者进行数据订阅,达到动态获取数据的目的。
配置信息一般有几个特点:
1. 数据量小的KV
2. 数据内容在运行时会发生动态变化
3. 集群机器共享,配置一致
ZooKeeper 采用的是推拉结合的方式。
1. 推: 服务端会推给注册了监控节点的客户端 Wathcer 事件通知
2. 拉: 客户端获得通知后,然后主动到服务端拉取最新的数据

B、命名服务
       作为分布式命名服务,命名服务是指通过指定的名字来获取资源或者服务的地址,利用ZooKeeper创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。统一命名服务的命名结构图如下所示:
1、在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。类似于域名与IP之间对应关系,IP不容易记住,而域名容易记住。通过名称来获取资源或服务的地址,提供者等信息。
2、按照层次结构组织服务/应用名称。可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。

C、集群管理
所谓集群管理就是:是否有机器退出和加入、选举master
集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集,后者则是对集群进行操作与控制。开发和运维中,面对集群,经常有如下需求:
1. 希望知道集群中究竟有多少机器在工作
2. 对集群中的每台机器的运行时状态进行数据收集
3. 对集群中机器进行上下线的操作
集群管理结构图如下所示:

1、分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。
2、可交由ZooKeeper实现。
可将节点信息写入ZooKeeper上的一个Znode。监听这个Znode可获取它的实时状态变化。
3、典型应用
Hbase中Master状态监控与选举。
利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功
D、分布式通知与协调
1、分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。
a)NameNode需知道各个Datanode的状态。
b)JobTracker需知道各个TaskTracker的状态。
2、心跳检测机制可通过ZooKeeper来实现。
3、信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统。
E、分布式锁
处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。
分布式锁具有以下特性:写锁、读锁、时序锁
写锁:在zk上创建的一个临时的无编号的节点。由于是无序编号,在创建时不会自动编号,导致只能客户端有一个客户端得到锁,然后进行写入。
读锁:在zk上创建一个临时的有编号的节点,这样即使下次有客户端加入是同时创建相同的节点时,他也会自动编号,也可以获得锁对象,然后对其进行读取
时序锁:
在zk上创建的一个临时的有编号的节点根据编号的大小控制锁。

F、分布式队列
分布式队列分为两种:
1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
a)一个job由多个task组成,只有所有任务完成后,job才运行完成。
b)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦临时节点数目达到task总数,则表明job运行完成。
2、队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。 

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 就失效了。

❤:client 端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些 client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。

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


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

6、 Zookeeper 集群中是怎样选举leader的?

开始投票 -> 节点状态变成 LOOKING -> 每个节点选自己-> 收到票进行 PK -> sid 大的获胜 -> 更新选票 -> 再次投票 -> 统计选票,选票过半数选举结果 -> 节点状态更新为自己的角色状态。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值