博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

zk的事件,状态,节点

Posted on 2021-03-31 14:44  bw_0927  阅读(393)  评论(0)    收藏  举报

 

ZooKeeper client 可以对某个znode设置watcher,以便当节点发生变化时,client能够获得相应的Event通知。若不设置watcher,则不能收到通知。


以ZooKeeper的C Client为例,可以在调用以下3个函数,get某个节点的数据或状态时,同时设置watcher标志。

zoo_exists   // 节点是否存在。若设置watcher,节点被删除时,收到ZOO_DELETED_EVENT; 节点被创建时,收到ZOO_CREATED_EVENT。

zoo_get  // 获取节点数据。若设置watcher,节点数据改变时,收到ZOO_CHANGED_EVENT。

zoo_get_children  //获取孩子节点列表。若设置watcher,孩子节点数改变时,收到ZOO_CHILD_EVENT。

注意:

watcher不能监听到孙节点

1. 设置一次Watcher(不能重复设置,只相当于设置一次)只能收到一次Event通知,之后若节点再发生变化,不会再次收到通知,因此每次收到Event后,需要对节点重新设置Watcher

2. zoo_exists可以对尚未创建的节点设置watcher,节点创建时发送CREATED_EVENT;反之,节点删除时发送DELETED_EVENT。

3. zoo_get,zoo_get_children不能对尚未创建的节点设置watcher,创建之前设置的watcher在节点创建后是无效的。

(但节点创建后,若通过zoo_esixts设置watcher,之前zoo_get设置的watcher似乎变得有效)

4. zoo_get, zoo_get_children对存在的节点设置watcher后,若节点被删除,watcher将失效,也就是说节点被重新创建后,之前设置的watcher将变得无效
————————————————

 

https://www.jianshu.com/p/cbe5f0dd6cca

znode节点类型

 

 

每个znode都有不同的生命周期,而生命周期长短取决于znode的节点类型。Zoookeeper提供了4种节点类型。
 
主节点是临时的话,就不能构建其子节点

znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了

 

Znode客户端操作

 
客户端对于znode的相关操作

znode状态信息

每个znode数据节点中除了可以存储业务数据外,其本身还存储了数据节点相关的一些状态信息。共包含以下几种状态信息。

znode状态信息解释
cZxid create ZXID,即该数据节点被创建时的事务id
ctime create time,即该节点的创建时间
mZxid modified ZXID,即该节点最终一次更新时的事务id
mtime modified time,即该节点最后一次的更新时间
pZxid 该节点的子节点列表最后一次修改时的事务id,只有子节点列表变更才会更新pZxid,子节点内容变更不会更新
cversion 子节点版本号,当前节点的子节点每次变化时值增加1
dataVersion 数据节点内容版本号,节点创建时为0,每更新一次节点内容(不管内容有无变化)该版本号的值增加1
aclVersion 节点的ACL版本号,表示该节点ACL信息变更次数
ephemeralOwner 创建该临时节点的会话的sessionId;如果当前节点为持久节点,则ephemeralOwner=0
dataLength 数据节点内容长度
numChildren 当前节点的子节点个数
  • zxid(事务id)说明:Zookeeper中每个变化都会产生一个全局唯一的zxid。通过它可确定更新操作的先后顺序。例如,zxid1小于zxid2,则说明zxid1操作先执行,zxid2后执行; zxid对于整个Zookeeper都是唯一的,即使操作的是不同的znode。

  • dataVersion说明:每一个znode都有一个数据版本号,每次对znode做更新操作时值自增。ZooKeeper中一些更新操作,例如setData和delete根据版本号有条件地执行。多个客户端对同一个znode进行更新操作时,因为数据版本号,才能保证更新操作的先后顺序性。例如,客户端A正在对znode节点做更新操作,此时如果另一个客户端B同时更新了这个znode,则A的版本号已经过期,那么A调用setData不会成功。

     
    dataVersion作用

     

ACL(Access Control List,访问控制列表 )

ZooKeeper提供了一套完善的ACL权限控制机制保障数据安全性。

  • 对于身份认证,提供了以下几种方式。
身份认证方式解释
world 默认方式,所有用户都可无条件访问,组合形式为:world:anyone:[permissions]
digest 用户名:密码认证方式,最常用,组合形式为:digest:username:BASE64(SHA1(password)):[permissions]
ip 对指定ip进行限制,组合形式为:ip:127.0.0.1:[permissions]
auth 认证登录形式,需要用户获取权限后才可访问,组合形式为 auth:userpassword:[permissions]
  • 对于znode权限,提供了以下5种操作权限。
权限简写解释
CREATE C 允许授权对象在当前节点下创建子节点
DELETE D 允许授权对象在当前节点下删除子节点
WRITE W 允许授权对象在当前节点进行更新操作
READ R 允许授权对象在当前节点获取节点内容或获取子节点列表
ADMIN A 允许授权对象对当前节点进行ACL相关的设置操作


作者:Java花园
链接:https://www.jianshu.com/p/cbe5f0dd6cca
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。