文章目录
1 、ZK数据模型
ZooKeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为“数据节点”或ZNode
,每个znode可以存储数据,还可以挂载子节点,因此可以称之为“树”。
需要注意的是
创建znode时,每个znode都必须指定值,如果没有值,节点是不能创建成功的。
在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据 ; 且通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化。 其数据模型可用下图进行表示:
2 、ZK节点类型
持久(persistent)节点:
(1) session断开后,数据不会丢失
(2)可以创建子节点
临时(ephemeral)节点:
(1)session断开后,数据会丢失
(2)不可以创建子节点
持久顺序(PERSISTENT_SEQUENTIAL)节点:
(1)、(2)同持久节点
(3)创建顺序节点时会默认设置顺序标识,即znode名称后会附加一个值 — 顺序号 ,顺序号是一个单调递增的计数器,由父节点维护
临时顺序(EPHEMERAL_SEQUENTIAL)节点: —> ZK实现分布式锁的基础。
(1)、(2)同临时节点,(3)同持久顺序节点
3 、ZK节点属性
4、 ZK watch机制
所谓watch机制,简单点理解就是某个客户端(watcher)可以对ZK中的Node进行监听(watch),当这个节点相关的数据发生变化时,ZK服务器会让监听这个节点的客户端(watcher)感知到它监听的节点具体发生了什么变化(触发客户端的监听事件)。
需要注意的是
:原生客户端中ZK的watch 是一次性的,触发后立即销毁 —> 但 Apache Curator将其改造成了可以永久监听。
下图是可进行watch操作的命令:
4.1 NodeCreated — 监听的节点(还未创建)被创建时触发
4.2 NodeDataChanged — 监听节点的数据发生改变时触发
当然也可以用如下的方式(或者其他方式)进行监听:
4.3 NodeDeleted — 监听的节点被删除时触发
测试如下:
4.4 NodeChildrenChanged — 监听的节点创建、删除子节点时触发(ls、ls2命令)
测试如下:
总结:
- Is/ls2为父节点设置watch ,创建子节点会触发 NodeChildrenChanged
- Is/ls2为父节点设置watch ,删除子节点会触发 NodeChildrenChanged
但要格外注意:★★★★★
Is/ls2为父节点设置watch ,修改子节点不触发事件
验证如下:
由此可知,我们想监听子节点数据的变化,只能直接监听那个子节点,即
end