https://www.cnblogs.com/dream-to-pku/p/9513188.html
1.原理:zookeeper = 文件系统 + 通知机制(与客户端交互)
1)zk其实就是一个文件系统
每个子目录项其实就是一个znode,只不过znode中可以存储数据
四种类型的znode:
- 1、PERSISTENT--持久化目录节点
- 客户端与zookeeper断开连接后,该节点依旧存在
- 2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
- 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
- 3、EPHEMERAL-临时目录节点
- 客户端与zookeeper断开连接后,该节点被删除
- 4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
- 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
2)通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)等,zookeeper会通知客户端。
2.zk的使用场景
1、命名服务(持久化目录节点)
在zookeeper的文件系统里创建一个目录,即有唯一的path,在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现。
2、配置管理(持久化目录节点)
把配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。
3、集群管理(临时性顺序编号节点)
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
4、分布式锁(临时性顺序编号节点)
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占(创建znode,只有一个系统能成功创建),另一个是控制时序(临时性顺序增加节点,序号最小的获取得到锁)。
5、队列管理
两种类型的队列:
- 1、 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
- 2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。