数据模型

在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端,执行 “ls /“ 命令显示:

  1. $ ls /
  2. $ ls /zookeeper
  3. $ ls /zookeeper/quota
  1. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 2] ls /
  2. [runoob, zookeeper]
  3. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 4] ls /zookeeper
  4. [config, quota]
  5. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 3] ls /zookeeper/quota
  6. []

我们直观的看到此时存储的数据在根目录下存在 runoob 和 zookeeper 两个节点,zookeeper 节点下存在 quota 这个节点。
ZooKeeper 数据模型 znode 结构 - 图1runoob 节点是在我们之前章节创建,并且通过 java 客户端设置值 0,现在我们在命令行终端执行 **get -s /runoob** 显示此节点的详细属性。

  1. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 9] get -s /runoob
  2. 0
  3. cZxid = 0x100000019
  4. ctime = Tue Aug 03 16:53:40 CST 2021
  5. mZxid = 0x100000019
  6. mtime = Tue Aug 03 16:53:40 CST 2021
  7. pZxid = 0x100000019
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 1
  13. numChildren = 0

其中第一行显示的 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 该节点拥有子节点的数量(只统计直接子节点的数量)

了解上面状态属性值,我们对 /runoob 节点做一次修改,执行命令 **set -s /runoob 1** ,如下图所示:

  1. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 23] set -s /runoob 1
  2. cZxid = 0x100000019
  3. ctime = Tue Aug 03 16:53:40 CST 2021
  4. mZxid = 0x10000001a
  5. mtime = Tue Aug 03 16:59:12 CST 2021
  6. pZxid = 0x100000019
  7. cversion = 0
  8. dataVersion = 1
  9. aclVersion = 0
  10. ephemeralOwner = 0x0
  11. dataLength = 1
  12. numChildren = 0

对比上面结果,可以看到 mZxid、mtime、dataVersion 都发生了变化。
/runoob 节点下,我们再添加一子节点,执行:

  1. $ create -e /runoob/child 0
  2. $ get -s /runoob
  1. [zk: 192.168.74.135:2181,192.168.74.135:2182,192.168.74.135:2183(CONNECTED) 6] get -s /runoob
  2. 1
  3. cZxid = 0x100000019
  4. ctime = Tue Aug 03 16:53:40 CST 2021
  5. mZxid = 0x10000001a
  6. mtime = Tue Aug 03 16:59:12 CST 2021
  7. pZxid = 0x100000020
  8. cversion = 3
  9. dataVersion = 1
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 1
  13. numChildren = 1

可见 /runoob 节点的 pZxid、cversion、numChildren 都发生了相应的改变。