Zookeeper数据结构与监听机制
在ZooKeeper中,数据信息被保存在⼀个个数据节点上,这些节点被称为 ZNode 。 ZNode 是 Zookeeper 中最⼩数据单位,在 ZNode 下⾯⼜可以再挂 ZNode ,这样⼀层层下去就形成了⼀个层次化命名空间 ZNode 树,我们称为 ZNode Tree,它采⽤了类似⽂件系统的层级树状结构进⾏管理。⻅下图:
在 Zookeeper 中,每⼀个数据节点都是⼀个 ZNode ,上图根⽬录下有两个节点,分别是:app1 和 app2 ,其中 app1 下⾯⼜有三个⼦节点,所有 ZNode 按层次化进⾏组织,形成这么⼀颗树,ZNode 的节点路径标识⽅式和 Unix ⽂件系统路径⾮常相似,都是由⼀系列使⽤斜杠(/)进⾏分割的路径表示,开发⼈员可以向这个节点写⼊数据,也可以在这个节点下⾯创建⼦节点。
ZNode 的类型
Zookeeper 节点类型可以分为三⼤类:
-
持久性节点(Persistent)
-
临时性节点(Ephemeral)
-
顺序性节点(Sequential)
在开发中在创建节点的时候通过组合可以⽣成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的⽣命周期。
-
持久节点:是Zookeeper中最常⻅的⼀种节点类型,所谓持久节点,就是指节点被创建后会⼀直存在服务器,直到删除操作主动清除
-
持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是⼀样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后⾯加上⼀个数字后缀,来表示其顺序。
-
临时节点:就是会被⾃动清理掉的节点,它的⽣命周期和客户端会话绑在⼀起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建⼦节点。
-
临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后⾯加上数字后缀。
事务ID
在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,⼀般包括数据节点创建与删除、数据节点内容更新等操作。对于每⼀个事务请求,ZooKeeper都会为其分配⼀个全局唯⼀的事务ID,⽤ ZXID 来表示,通常是⼀个 64 位的数字。每⼀个 ZXID 对应⼀次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。
zk中的事务指的是对zk服务器状态改变的操作(create,update data,更新字节点);zk对这些事务操作都会编号,这个编号是⾃增⻓的被称为ZXID。
ZNode 的状态信息
使⽤bin/zkCli.sh 连接到zk集群
1 | cd /opt/lagou/servers/zookeeper-3.4.14/bin |
获取节点信息
1 | [zk: localhost:2181(CONNECTED) 2] get /zookeeper |
整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。数据内容是空,其他的属于状态信息。
1 | cZxid 就是 Create ZXID,表示节点被创建时的事务ID。 |
Watcher 机制
Zookeeper使⽤Watcher机制实现分布式数据的发布/订阅功能
⼀个典型的发布/订阅模型系统定义了⼀种⼀对多的订阅关系,能够让多个订阅者同时监听某⼀个主题对象,当这个主题对象⾃身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。
在 ZooKeeper 中,引⼊了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册⼀个 Watcher 监听,当服务端的⼀些指定事件触发了这个 Watcher,那么Zk就会向指定客户端发送⼀个事件通知来实现分布式的通知功能。
Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。
具体⼯作流程为:
-
客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中
-
当Zookeeper服务器触发Watcher事件后,会向客户端发送通知
-
客户端线程从WatcherManager中取出对应的Watcher对象来执⾏回调逻辑