Zookeeper面试题

「林老师带你学编程」,是林老师在知识星球创建的星球,一个希望我们能够“知其然,知其所以然”的社群。
加入星球,学习最新面试题集,帮助你找到更好的工作。

🔥 具体的加入方式:

1. Zookeeper是什么(了解)

Zookeeper 是一个分布式协调服务的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题.
ZooKeeper 本质上是一个分布式的小文件存储系统. 提供基于类似于文件系统的目录树方式的数据存储, 并且可以对树中的节点进行有效管理. 从而用来维护和监控你存储的数据的状态变化. 通过监控这些数据状态的变化,从而可以达到基于数据的集群管理.
在大数据生态系统里,很多组件的命名都是某种动物,比如hadoop就是大象, hive就是蜜蜂, 而Zookeeper就是动物管理员.

2. Zookeeper的数据模型(必会)

 ZK本质上是一个分布式的小文件存储系统.
 ZK表现为一个分层的文件系统目录树结构, 既能存储数据, 而且还能像目录一样有子节点. 每个节点可以存最多1M左右的数据.
 每个节点称做一个Znode, 每个Znode都可以通过其路径唯一标识.
 而且客户端还能给节点添加watch, 也就是监听器, 可以监听节点的变化, 这个功能常在实际开发中作为监听服务器集群机器上下线操作.

2.1 节点结构

图中的每个节点称为一个 Znode。 每个 Znode 由 3 部分组成:
① stat:此为状态信息, 描述该 Znode 的版本, 权限等信息
② data:与该 Znode 关联的数据
③ children:该 Znode 下的子节点

2.2 节点类型

Znode 有2大类4小类, 两大类分别为永久节点和临时节点.
 永久节点(Persistent): 客户端和服务器端断开连接后,创建的节点不会消失, 只有在客户端执行删除操作的时候, 他们才能被删除.
 临时节点(Ephemeral): 客户端和服务器端断开连接后,创建的节点会被删除.
Znode 还有一个序列化的特性, 这个序列号对于此节点的父节点来说是唯一的, 这样便会记录每个子节点创建的先后顺序. 它的格式为“%10d”(10 位数字, 没有数值的数位用 0 补充, 例如“0000000001”),因此节点可以分为4小类:
 永久节点(Persistent)
 永久_序列化节点(Persistent_Sequential)
 临时节点(Ephemeral)
 临时_序列化节点(Ephemeral_Sequential)

3.Zookeeper的watch监听机制(高薪常问)

 在ZooKeeper中还支持一种watch(监听)机制, 它允许对ZooKeeper注册监听, 当监听的对象发生指定的事件的时候, ZooKeeper就会返回一个通知.
 Watcher 分为以下三个过程:客户端向ZK服务端注册 Watcher、服务端事件发生触发 Watcher、客户端回调 Watcher 得到触发事件情况.
触发事件种类很多,如:节点创建,节点删除,节点改变,子节点改变等。
 Watcher是一次性的. 一旦被触发将会失效. 如果需要反复进行监听就需要反复进行注册.

3.1 监听器原理


 首先要有一个main()线程
 在main线程中创建Zookeeper客户端, 这时就会创建两个线程, 一个复制网络连接通信(connect), 一个负责监听(listener).
 通过connect线程将注册的监听事件发送给zk, 常见的监听有
监听节点数据的变化get path [watch]
监听节点状态的变化 stat path [watch]
监听子节点增减的变化 ls path [watch]
 将注册的监听事件添加到zk的注册的监听器列表中
 监听到有数据或路径变化, 就会将这个消息发送给listener线程.
 listener线程内部调用了process()方法.此方法是程序员自定义的方法, 里面可以写明监听到事件后做如何的通知操作.

3.2 监听器实际应用

监听器+ZK临时节点能够很好的监听服务器的上线和下线.


• 第一步: 先想zk集群注册一个监听器, 监听某一个节点路径
• 第二步: 主要服务器启动, 就去zk上指定路径下创建一个临时节点.
• 第三步: 监听器监听servers下面的子节点有没有变化, 一旦有变化, 不管新增(机器上线)还是减少(机器下线)都会马上给对应的人发送通知.

4.Zookeeper的应用场景(高薪常问)
ZK提供的服务包括: 统一命名服务, 统一配置管理, 统一集群管理, 集群选主, 服务动态上下线, 分布式锁等.

4.1 统一命名服务

统一命名服务使用的是ZK的node节点全局唯一的这个特点.
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。创建一个节点后, 节点的路径就是全局唯一的, 可以作为全局名称使用.


4.2 统一配置管理

统一配置管理, 使用的是Zookeeper的watch机制

 需求: 分布式环境下, 要求所有节点的配置信息是一致的, 比如Kafka集群. 对配置文件修改后, 希望能够快速同步到各个节点上.
 方案: 可以把所有的配置都放在一个配置中心, 然后各个服务分别去监听配置中心, 一旦发现里面的内容发生变化, 立即获取变化的内容, 然后更新本地配置即可.
 实现: 配置管理可交由Zookeeper实现
 可将配置信息写入Zookeeper上的一个Znode.
 各个客户端服务器监听这个Znode.
 一旦Znode中的数据被修改, Zookeeper将通知各个客户端服务器.


4.3 统一集群管理

统一集群管理使用的是Zookeeper的watch机制
 需求: 分布式环境中, 实时掌握每个节点的状态是必要的, 可以根据节点实时状态做出一些调整.
 方案: Zookeeper可以实现实时监控节点状态变化
 可将节点信息写入Zookeeper上的一个Znode.
 监听这个Znode可获取它的实时状态变化.


4.4 集群选主

查看更多