zookeeper常见知识点
1. 介绍 Zookeeper 的文件系统
Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得 Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为 1M。
2. 介绍 Zookeeper 四种类型的 znode
PERSISTENT-持久化目录节点
客户端与 zookeeper 断开连接后,该节点依旧存在
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺序编号
EPHEMERAL-临时目录节点
客户端与 zookeeper 断开连接后,该节点被删除
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进行顺序编号
3. 介绍 Zookeeper 的通知机制
client 端会对某个 znode 建立一个 watcher 事件 ,当该 znode 发生变化时,这些client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。
4. 介绍 Zookeeper 的主要功能有哪些
命名服务
配置管理
集群管理
分布式锁
队列管理
zk 的命名服务(文件系统)
命名服务是指通过指定的名字来 获取资源 或者 服务的地址 ,利用 zk 创建一个全局的路
径,即是 唯一 的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地
址,或者一个远程的对象等等。
6. 介绍 Zookeeper 的集群管理
所谓集群管理无在乎两点: 是否有机器退出和加入、选举 master 。对于第一点,所有机器约定在父目录下 创建临时目录节点 ,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper 的连接断开,其所创建的临时目录节点被删除, 所有其他机器都收到通知:某个兄弟目录被删除 ,于是,所有人都知道:它上船了。
新机器加入也是类似, 所有机器收到通知:新兄弟目录加入 ,highcount 又有了,对于第二点,我们稍微改变一下, 所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为 master 就好 。
7. 介绍 Zookeeper 的分布式锁
有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是 保持独占 ,另一个是 控制时序 。
对于第一类,我们将 zookeeper 上的一个 znode 看作是一把锁 ,通过 createznode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放出锁。对于第二类,/distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master 一样, 编号最小的获得锁 ,用完删除,依次方便。
8. 介绍 Zookeeper 获取分布式锁的流程
在获取分布式锁的时候在 locker 节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用 createNode 方法在 locker 下创建临时顺序节点,然后调用getChildren(“locker”)来获取 locker 下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点 path 之后,如果发现自己创建的节点在所有创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己创建的节点并非 locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到 比自己小的那个节点 ,然后对其调用 exist() 方法,同时对其注册事件监听器。之后,让这个被关注的节点删除,则客户端的 Watcher 会收到相应通知,此时再次判断自己创建的节点是否是 locker 子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。当前这个过程中还需要许多的逻辑判断。
9. 介绍 Zookeeper 的队列管理
两种类型的队列:
同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建 PERSISTENT_SEQUENTIAL 节点,创建成功时 Watcher 通知等待的队列,队列删除 序列号最小的节点 用以消费。此场景下 Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以 不必担心队列消息的丢失问题。