zookeeper 从两个纬度将ZNode 节点划分为四种类型: 持久有序型, 持久无序型, 短暂有序型, 短暂无序型. 从持久化角度来看, 当客户端断开连接后, 持久型节点不会消失, 而短暂性节点会消失; 从有序性角度来看, 有序节点创建时, 会自动为节点名称添加序号, 而无序节点创建的节点名称就是指定的节点名称.

1. 节点类型

1.1 有序性验证

  • 有序节点名称并非指定的名称, 而会被添加序号
  • 序号生成规则: 为以十位数格式的父节点节点信息中dataLength中的值
# mynodes 节点下当前拥有两个节点
[zk: localhost:2181(CONNECTED) 4] ls /mynodes
[A, B]

# 创建有序节点C, 序号为当前父节点/mynodes节点信息中的dataLength 的值, 而非从1开始. 数字是一个十位数的格式
[zk: localhost:2181(CONNECTED) 5] create -s /mynodes/C ""
Created /mynodes/C0000000002

# 查看所有节点
[zk: localhost:2181(CONNECTED) 6] ls /mynodes
[A, B, C0000000002]

1.2 持久型验证

  • 短暂型节点创建时, 需要使用使用 -e 选项
  • 测试时, 需要断开客户端连接, 重新连接.
# 创建父节点/mynodes
[zk: localhost:2181(CONNECTED) 0] create /mynodes ""
Created /mynodes

# 创建两个持久性节点, 创建两个段暂性节点
[zk: localhost:2181(CONNECTED) 1] create /mynodes/p-node-1 ""
Created /mynodes/p-node-1
[zk: localhost:2181(CONNECTED) 2] create /mynodes/p-node-2 ""
Created /mynodes/p-node-2
[zk: localhost:2181(CONNECTED) 3] create -e /mynodes/e-node-1 ""
Created /mynodes/e-node-1
[zk: localhost:2181(CONNECTED) 4] create -e /mynodes/e-node-2 ""
Created /mynodes/e-node-2

# 查看当前节点列表
[zk: localhost:2181(CONNECTED) 5] ls /mynodes
[p-node-2, e-node-2, e-node-1, p-node-1]

# 端开客户端连接
[zk: localhost:2181(CONNECTED) 6] quit

断开客户端连接后, 查看节点信息, 只剩下了持久性节点.

$ ./zkCli.sh ls /mynodes
[p-node-2, p-node-1]

2. 节点信息

ZNode 除了存储用户设置的数据之外, 还存储着一些节点的信息, 如版本号, 修改时间等信息, 称之为节点信息.

字段

描述

czxid

节点被创建时的事务id

ctime

节点上次修改的事务id

mzxid

节点上次修改的事务id

mtime

节点上次修改的时间

dataversion

节点被修改的版本号

datalengh

节点存储的数据的长度, 单位字节

aclversion

节点的ACL 被修改的版本号

ephemeralOwner

临时节点的拥有者的sessionid, 持久性节点为0

numChildren

子节点的数量

cversion

子节点变化版本号, 新增/删除子节点时会自增

pzxid

子节点点最近修改(新增/删除)的zxid

2.1 创建节点

# 创建持久化节点
[zk: localhost:2181(CONNECTED) 2] create /mynodes "mynodes"
Created /mynodes
[zk: localhost:2181(CONNECTED) 3] get /mynodes
# 节点存储数据
mynodes
# 节点创建时事务id和时间, 一旦创建,则不再改变
cZxid = 0x1e4
ctime = Sun Feb 17 15:23:44 CST 2019
# 节点修改时事务id和时间, 修改节点数据内容时变更
mZxid = 0x1e4
mtime = Sun Feb 17 15:23:44 CST 2019

# 子节点数量变更事务id, 新增或删除子节点时影响.
pZxid = 0x1e4
# 子节点变化版本号, 新增或删除子节点时影响
cversion = 0
# 节点数据版本号, 修改节点数据内容时会变更, 初始化为0
dataVersion = 0
# 节点acl权限版本号, 初始化为0
aclVersion = 0
# 持久化节点为0x0, 非持久化节点为sessionid, 如: 0x100092d5d8b0018
ephemeralOwner = 0x0
# 节点数据长度
dataLength = 7
# 子节点数量
numChildren = 0

2.2 修改节点数据

修改节点数据, 会导致 cZxid, ctime, dataVersion, dataLength 产生变更

[zk: localhost:2181(CONNECTED) 4] set /mynodes "this is mynodes"
cZxid = 0x1e4
ctime = Sun Feb 17 15:23:44 CST 2019
# 修改节点数据, 发生变更
mZxid = 0x1e6
mtime = Sun Feb 17 15:24:12 CST 2019
pZxid = 0x1e4
cversion = 0
# 发生变更
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
# 发生变更
dataLength = 15
numChildren = 0

2.3 创建子节点

新增子节点, 会导致 cversion, pZxid, numChildren 发生变化.

[zk: localhost:2181(CONNECTED) 5] create -e /mynodes/A ""
Created /mynodes/A
[zk: localhost:2181(CONNECTED) 6] get /mynodes                  
this is mynodes
cZxid = 0x1e4
ctime = Sun Feb 17 15:23:44 CST 2019
mZxid = 0x1e6
mtime = Sun Feb 17 15:24:12 CST 2019
# 发生变化
pZxid = 0x1e7
# 发生变化
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 15
# 发生变化
numChildren = 1