ZooKeeper是什么 哪些场景能够使用ZooKeeper
简介
ZooKeeper是一个开放源代码的分布式协调服务。ZooKeeper 是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。(基于zk去实现以上功能,业务实现还是要自己实现,只是利用zk可以更方便的实现以上功能)
数据模型
ZooKeeper的视图结构和标准的Unix文件系统非常类似,每个节点有“数据节点”概念,我们称之为ZNode。每个ZNode上都可以保存数据,同时还可以挂载子节点。类似数据结构中的树。ZNode 的节点路径标识方式由一系列使用斜杠(/)进行分割的。
事务性
对于每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用 ZXID 来表示。每一个 ZXID 对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。
节点类型
- 持久节点(PERSISTENT)
该数据节点被创建后,就会一直存在于ZooKeeper服务器上,直到有删除操作来主动清除这个节点。 - 持久顺序节点(PERSISTENT_SEQUENTIAL)
持久顺序节点的基本特性和持久节点是一致的,不同的是:每个父节点(添加的顺序节点的父节点)都会为它的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序。那么在创建节点过程中,ZooKeeper 会自动为给定节点名加上一个数字后缀 - 临时节点(EPHEMERAL)
临时节点的生命周期和客户端的会话绑定在一起,也就是说,如果客户端会话失效,那么这个节点就会被自动清理掉,这里提到的是客户端会话失效,而非TCP连接断开,ZooKeeper 规定了不能基于临时节点来创建子节点,即临时节点只能作为叶子节点。 - 临时顺序节点(EPHEMERAL_SEQUENTIAL)
临时顺序节点的基本特性和临时节点也是一致的,同样是在临时节点的基础上,添加了顺序的特性。
状态信息
我们可以针对 ZooKeeper 上的数据节点进行数据的写入和子节点的创建。事实上,每个数据节点除了存储了数据内容之外,还存储了数据节点本身的一些状态信息
Watcher——数据变更的通知
ZooKeeper 允许客户端代码向ZooKeeper 注册一个 Watcher 监听,当ZooKeeper 端的一些指定事件(比如节点信息变更,节点删除等)触发了这个 Watcher,那么就会向指定客户端发送一个事件通知。
ZooKeeper 的 Watcher 机制主要包括客户端线程、客户端WatchManager 和 ZooKeeper三部分。客户端在向 ZooKeeper注册 Watcher 的同时,会将 Watcher 对象存储在客户端的WatchManager中。当ZooKeeper服务器端触发Watcher事件后,会向客户端发送通知,客户端线程从WatchManager中取出对应的Watcher对象来执行。
Watcher接口
ZooKeeper接口类Watcher用于表示一个标准的事件处理器,其包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。
Watcher事件
同一个事件类型在不同的通知状态中代表的含义有所不同。
- 其中NodeDataChanged事件,对于ZooKeeper来说,无论数据内容是否变更,还是节点版本信息变更等,一旦有客户端调用了数据更新的接口,且更新成功,就会触发这个事件通知
- NodeChildrenChanged事件会在数据节点的子节点列表发生变更的时候被触发:新增子节点或删除子节点,而子节点内容的变化是不会触发这个事件的。
- AuthFailed 这个事件,它的触发条件并不是简简单单因为当前客户端会话没有权限,而是授权失败。
至此你便可以利用ZooKeeper的数据节点,Watcher数据变更的通知的特性根据需要自行实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。在后续会一一介绍以上的基本实现方案