Pre
前面我们梳理了Zk的核心功能 , ZooKeeper 作为一个分布式协调服务,提供了在分布式环境下一致性问题的解决方案 。
今天 我们再来回顾下基础知识
基本分为三大模块:
- 数据模型
- Watch 监控
- ACL 权限控制
数据模型
概述
通过 ZooKeeper 提供的 create 命令来创建几个节点,分别是:“/locks”“/servers”“/works”:
代码语言:javascript复制create /locks
create /servers
create /works
最终在 ZooKeeper 服务器上会得到一个具有层级关系的数据结构,如下图所示,这个数据结构就是 ZooKeeper 中的数据模型
ZooKeeper 中的数据模型是一种树形结构,类似文件目录, 有一个根文件夹,下面还有很多子文件夹。
ZooKeeper 的数据模型具有一个固定的根节点(/),我们可以在根节点下创建子节点,并在子节点下继续创建下一级节点。
ZooKeeper 树中的每一层级用斜杠(/)分隔开,且只能用绝对路径(如“get /servers/ap1
”)的方式查询 ZooKeeper 节点,而不能使用相对路径。
znode 节点类型与特性
持久节点
ZooKeeper 中的数据节点也分为持久节点、临时节点和有序节点 。 新版本中增加了 容器节点 和 TTL节点,这里我们关注下 持久节点、临时节点和有序节点 。
持久节点在 ZooKeeper 最为常用的,几乎所有业务场景中都会包含持久节点的创建。
之所以叫作持久节点是因为一旦将节点创建为持久节点,该数据节点会一直存储在 ZooKeeper 服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除。
如果我们想删除持久节点,就要显式调用 delete 函数进行删除操作。
临时节点
临时节点是指,如果将节点创建为临时节点,那么该节点数据不会一直存储在 ZooKeeper 服务器上。当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在 ZooKeeper 服务器上被删除。同样,我们可以像删除持久节点一样主动删除临时节点。
在平时的开发中,我们可以利用临时节点的这一特性来做服务器集群内机器运行情况的统计,将集群设置为“/servers”节点,并为集群下的每台服务器创建一个临时节点“/servers/ap1”,当服务器下线时该节点自动被删除,最后统计临时节点个数就可以知道集群中的运行情况。
有序节点
有序节点并不算是一种单独种类的节点,而是在之前提到的持久节点和临时节点特性的基础上,增加了一个节点有序的性质。所谓节点有序是说在我们创建有序节点的时候,ZooKeeper 服务器会自动使用一个单调递增的数字作为后缀,追加到我们创建节点的后边。
例如一个客户端创建了一个路径为 works/task- 的有序节点,那么 ZooKeeper 将会生成一个序号并追加到该节点的路径后,最后该节点的路径为 works/task-1。通过这种方式我们可以直观的查看到节点的创建顺序。
节点小结
上述这几种数据节点虽然类型不同,但 ZooKeeper 中的每个节点都维护有这些内容:一个二进制数组(byte data[]),用来存储节点的数据、ACL 访问控制信息、子节点数据(因为临时节点不允许有子节点,所以其子节点字段为 null),除此之外每个数据节点还有一个记录自身状态信息的字段 stat。
节点的状态结构
每个节点都有属于自己的状态信息 ,执行 stat /nodeName
,可以看到控制台输出了一些信息,这些就是节点状态信息。
[zk: localhost:2181(CONNECTED) 6] stat /artisan-persist
cZxid = 0xa
ctime = Mon Nov 16 23:07:37 CST 2020
mZxid = 0xb
mtime = Mon Nov 16 23:08:55 CST 2020
pZxid = 0xa
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: localhost:2181(CONNECTED) 7]
每一个节点都有一个自己的状态属性,记录了节点本身的一些信息,这些属性如下
在 ZooKeeper 中为数据节点引入了版本的概念,每个数据节点有 3 种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化。
ZooKeeper 的版本信息表示的是对节点数据内容、子节点信息或者是 ACL 信息的修改次数。
行了,退下了