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 信息的修改次数。