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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐