2023java面试之Zookeeper基础

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、说说 Zookeeper 是什么

直译从名字上直译就是动物管理员动物指的是 Hadoop 一类的分布式软件管理员三个字体现了 ZooKeeper 的特点维护、协调、管理、监控。

简述有些软件你想做成集群或者分布式你可以用 ZooKeeper 帮你来辅助实现。

特点

最终一致性客户端看到的数据最终是一致的。

可靠性服务器保存了消息那么它就一直都存在。

实时性ZooKeeper 不能保证两个客户端同时得到刚更新的数据。

独立性等待无关不同客户端直接互不影响。

原子性更新要不成功要不失败没有第三个状态。

注意回答面试题切忌只是简单一句话回答可以将你对概念的理解特点等多个方面描述一

下哪怕你自己认为不完全切中题意的也可以说说面试官不喜欢会打断你的你的目的是让面试

官认为你是好沟通的。当然了如果不会可别装作会说太多不专业的想法。

二、ZooKeeper 有哪些应用场景

数据发布与订阅

发布与订阅即所谓的配置管理顾名思义就是将数据发布到ZooKeeper节点上供订阅者动态获取数据实现配置信息的集中式管理和动态更新。例如全局的配置信息地址列表等就非常适合使用。

数据发布/订阅的一个常见的场景是配置中心发布者把数据发布到 ZooKeeper 的一个或一系列的节点上供订阅者进行数据订阅达到动态获取数据的目的。配置信息一般有几个特点:

1. 数据量小的KV

2. 数据内容在运行时会发生动态变化

3. 集群机器共享配置一致

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

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

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

命名服务

作为分布式命名服务命名服务是指通过指定的名字来获取资源或者服务的地址利用ZooKeeper

创建一个全局的路径这个路径就可以作为一个名字指向集群中的集群提供的服务的地址或

者一个远程的对象等等。

统一命名服务的命名结构图如下所示

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

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

配置管理

程序分布式的部署在不同的机器上将程序的配置信息放在ZooKeeper的znode下当有配置发生

改变时也就是znode发生变化时可以通过改变zk中某个目录节点的内容利用watch通知给各

个客户端 从而更改配置。

ZooKeeper配置管理结构图如下所示

1、分布式环境下配置文件管理和同步是一个常见问题。

一个集群中所有节点的配置信息是一致的比如 Hadoop 集群。

对配置文件修改后希望能够快速同步到各个节点上。

2、配置管理可交由ZooKeeper实现。

可将配置信息写入ZooKeeper上的一个Znode。

各个节点监听这个Znode。

一旦Znode中的数据被修改ZooKeeper将通知各个节点。

集群管理

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

集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集后者则是对集群进行操作与控制。开发和运维中面对集群经常有如下需求:

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

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

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

集群管理结构图如下所示

1、分布式环境中实时掌握每个节点的状态是必要的可根据节点实时状态做出一些调整。

2、可交由ZooKeeper实现。

可将节点信息写入ZooKeeper上的一个Znode。

监听这个Znode可获取它的实时状态变化。

3、典型应用

Hbase中Master状态监控与选举。

利用ZooKeeper的强一致性能够保证在分布式高并发情况下节点创建的全局唯一性即同时有多个客户端请求创建 /currentMaster 节点最终一定只有一个客户端请求能够创建成功

分布式通知与协调

1、分布式环境中经常存在一个服务需要知道它所管理的子服务的状态。

aNameNode需知道各个Datanode的状态。

bJobTracker需知道各个TaskTracker的状态。

2、心跳检测机制可通过ZooKeeper来实现。

3、信息推送可由ZooKeeper来实现ZooKeeper相当于一个发布/订阅系统。

分布式锁

处于不同节点上不同的服务它们可能需要顺序的访问一些资源这里需要一把分布式的锁。

分布式锁具有以下特性写锁、读锁、时序锁。

写锁在zk上创建的一个临时的无编号的节点。由于是无序编号在创建时不会自动编号导致只能客户端有一个客户端得到锁然后进行写入。

读锁在zk上创建一个临时的有编号的节点这样即使下次有客户端加入是同时创建相同的节点时他也会自动编号也可以获得锁对象然后对其进行读取。

时序锁在zk上创建的一个临时的有编号的节点根据编号的大小控制锁。

分布式队列

分布式队列分为两种

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

a一个job由多个task组成只有所有任务完成后job才运行完成。

b可为job创建一个/job目录然后在该目录下为每个完成的task创建一个临时的Znode一旦临时节点数目达到task总数则表明job运行完成。

2、队列按照FIFO方式进行入队和出队操作例如实现生产者和消费者模型。

三、说说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。

FOLLOWINGleader已经选举出来当前Server与之同步。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java