- 《Java面试题集》
- 《Spring面试题集》
- 《SpringMVC面试题集》
- 《MyBatis面试题集》
- 《SpringBoot面试题集》
- 《SpringCloud面试题集》
- 《Dubbo面试题集》
- 《Redis面试题集》
- 《Kafka面试题集》
- 《MySQL面试题集》
- 《操作系统面试题集》
- 《计算机网络面试题集》
- 《数据结构面试题集》
- 《设计模式面试题集》
- 《Linux面试题集》
- 《Docker面试题集》
- 《Kubernetes面试题集》
- 《Elasticsearch面试题集》
- 《RabbitMQ面试题集》
- 《Zookeeper面试题集》
- 《MongoDB面试题集》
- 《Nginx面试题集》
- 《ActiveMQ面试题集》
- 《Tomcat面试题集》
- 直接访问链接:https://t.zsxq.com/14F2uGap7
- 微信扫码下图:
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 集群选主