ZooKeeper基本结构!
ZooKeeper基本结构!
月伴飞鱼数据模型
ZooKeeper中的数据模型是一种树形结构。
具有一个固定的根节点,我们可以在根节点下创建子节点,并在子节点下继续创建下一级节点。
树中的每一层级用斜杠(/)分隔开,只能用绝对路径(如
get /work/task1
)的方式查询节点,不能使用相对路径。
为什么 ZooKeeper不能采用相对路径查找节点?
ZooKeeper 在底层实现的时候,使用了一个 hashtable。
即
hashtableConcurrentHashMap<String, DataNode> nodes
,用节点的完整路径来作为 key 存储节点数据。
节点类型
持久节点:
该数据节点会一直存储在 ZooKeeper 服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除。
如果我们想删除持久节点,就要显式调用
delete
函数进行删除操作。
临时节点:
该节点数据不会一直存储在 ZooKeeper 服务器上。
当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在 ZooKeeper 服务器上被删除。
可以利用临时节点来做服务器集群内机器运行情况的统计,将集群设置为
/servers
节点。
- 并为集群下的每台服务器创建一个临时节点
/servers/host
。当服务器下线时该节点自动被删除,最后统计临时节点个数就可以知道集群中的运行情况。
有序节点:
节点有序是说在我们创建有序节点的时候,ZooKeeper 服务器会自动使用一个单调递增的数字作为后缀。
- 追加到我们创建节点的后边。
例如一个客户端创建了一个路径为
works/task-
的有序节点。那么 ZooKeeper 将会生成一个序号并追加到该节点的路径后,最后该节点的路径为
works/task-1
。
节点数据
一个二进制数组(
byte data[]
),用来存储节点的数据、ACL 访问控制信息、子节点数据(因为临时节点不允许有子节点。所以其子节点字段为 null),除此之外每个数据节点还有一个记录自身状态信息的字段 stat。
节点状态
每个节点都有属于自己的状态信息,执行
stat /zk_test
,可以看到节点状态信息。
节点版本
每个数据节点有 3 种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化。
- ZooKeeper 的版本信息表示的是对节点数据内容、子节点信息或者是 ACL 信息的修改次数。