文件系统数据结构
zookeeper维护一个类似文件系统的数据结构
监听通知机制
基本命令
创建zookeeper节点命令
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
中括号为可选项,没有则默认创建持久化节点
-s: 顺序节点
-e: 临时节点
-c: 容器节点
-t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用
(-Dzookeeper.extendedTypesEnabled=true, znode.container.checkIntervalMs : (Java system property only) New in 3.5.1: The time interval in milliseconds for each check of candidate container and ttl nodes. Default is “60000”.)
创建持久化节点
create /node data
查看节点
get /node
修改节点数据
set /node data_new
查看节点数据
查看节点状态信息
stat /node
Stat
cZxid:创建znode的事务ID(Zxid的值)。
mZxid:最后修改znode的事务ID。
pZxid:最后添加或删除子节点的事务ID(子节点列表发生变化才会发生改变)。
ctime:znode创建时间。
mtime:znode最近修改时间。
dataVersion:znode的当前数据版本。
cversion:znode的子节点结果集版本(一个节点的子节点增加、删除都会影响这个 版本)。
aclVersion:表示对此znode的acl版本。
ephemeralOwner:znode是临时znode时,表示znode所有者的 session ID。 如果 znode不是临时znode,则该字段设置为零。
dataLength:znode数据字段的长度。
numChildren:znode的子znode的数量。
查看节点状态信息同时查看数据
get -s /node
根据状态数据中的版本号有并发修改数据实现乐观锁的功能
比如: 客户端首先获取版本信息, get -s /node
/node 当前的数据版本是 1 , 这时客户端 用 set 命令修改数据的时候可以把版本号带上,如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用 以前的版本号去修改,将会导致修改失败,报如下错误
创建子节点
这里要注意,zookeeper是以节点组织数据的,没有相对路径这么一说,所以,所 有的节点一定是以 / 开头
create /node/sub_node
查看子节点
ls /
查找根节点下面的所有子节点
ls -R /
创建临时节点
create -e /temp_node
临时节点不能创建子节点
创建序号节点
创建父目录,单纯为了分类,非必须
create /seq_node seq_node
创建顺序节点,顺序节点将在seq_node目录下面,顺序递增
create -s /seq_node/ 0
也可以在序号节点前面带一个前缀
create -s /seq_node/x 1
创建临时顺序节点
create -s -e /temp_seq_node
创建容器节点
容器节点用来容纳子节点,若没有子节点,容器节点表现跟持久化节点一样
create -c /container
如果给容器节点创建子节点,后续又把子节点删除,那么容器节点也会被zookeeper删除,当然不是立即删除,而是在一个时间段内被删除
节点监听
针对节点的监听(一次性),一旦时间触发,对应的注册立即被删除
// 注册监听的同时获取数据
get -w /node
针对目录的监听(一次性),目录变化,会触发事件
# 监听目录
ls -w /node
递归子目录监听,对每个目录下的监听(一次性)
# 监听子目录
ls -R -w /node