ZooKeeper 数据模型 znode 结构详解
在 zookeeper 中存储的数据是由 znode 组成的,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端,执行 "ls /" 命令显示:
$ ls / $ ls /zookeeper $ ls /zookeeper/quota
我们直观的看到此时存储的数据在根目录下存在 codebaoku 和 zookeeper 两个节点,zookeeper 节点下存在 quota 这个节点。
codebaoku 节点是在我们之前章节创建,并且通过 java 客户端设置值 0,现在我们在命令行终端执行 get /codebaoku 显示此节点的属性。
$ get /codebaoku
其中第一行显示的 0 是该节点的 value 值。
Znode 的状态属性
cZxid | 创建节点时的事务ID |
---|---|
ctime | 创建节点时的时间 |
mZxid | 最后修改节点时的事务ID |
mtime | 最后修改节点时的时间 |
pZxid | 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid) |
cversion | 子节点版本号,子节点每次修改版本号加1 |
dataversion | 数据版本号,数据每次修改该版本号加1 |
aclversion | 权限版本号,权限每次修改该版本号加1 |
ephemeralOwner | 创建该临时节点的会话的sessionID。(**如果该节点是持久节点,那么这个属性值为0)** |
dataLength | 该节点的数据长度 |
numChildren | 该节点拥有子节点的数量(只统计直接子节点的数量) |
了解上面状态属性值,我们对 /codebaoku 节点做一次修改,执行命令 set /codebaoku 1 ,如下图所示:
$ set /codebaoku 1
对比上面结果,可以看到 mZxid、mtime、dataVersion 都发生了变化。
在 /codebaoku 节点下,我们再添加一子节点,执行:
$ create -e /codebaoku/child 0 $ get /codebaoku
提示:更多命令使用后面章节会详解介绍。
执行完终端命令行显示:
可见 /codebaoku 节点的 pZxid、cversion、numChildren 都发生了相应的改变。
客户端与服务端之间的连接是基于 TCP 长连接,client 端连接 server 端默认的 2181 端口,也就是 session 会话。从第一次连接建立开始,客户端开始会话的生命周期,客户端向服务端的ping包请求,每个会话都可以设置一个超时时间。1. Session 的创建: sessionID 会话ID,用来唯一标识一个会话,每次客户端创建会话的时候,zookeeper 都会为其分配一个全局唯一的 sessionID。