1、数据模型
ZooKeeper的视图结构和标准的Unix文件系统非常类似,但没有引入传统文件系统中目录和文件等相关概念,而是使用了其特有的“数据节点”概念,我们称之为 ZNode。 ZNode是Zookeeper中数据的最小单元,每个 ZNode上都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,我们称之为树。
树
在 ZooKeeper中,每一个数据节点都被称为一个 ZNode,所有ZNode按层次化结构进行组织,形成一棵树。 ZNode的节点路径标识方式和Unix文件系统路径非常相似,都是由一系列使用斜杠()进行分割的路径表示,开发人员可以向这个节点中写入数据,也可以在节点下面创建子节点。
事务ID
事务是对物理和抽象的应用状态上的操作集合。在现在的计算机科学中,狭义上的事务通常指的是数据库事务,一般包含了一系列
对数据库有序的读写操作,这些数据库事务具有所谓的ACID特性,即原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
在 ZooKeeper中,事务是指能够改变 ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求, ZooKeeper都会为其分配一个全局唯一的事务ID,
用ZXID来表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出 ZooKeeper处理这些更新操作请求的全局顺序。
2、节点特性
在上一节中,我们已经了解到, ZooKeeper的命名空间是由一系列数据节点组成的,在本节中,我们将对数据节点做详细讲解。
2.1、节点类型
在 ZooKeeper中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在 ZooKeeper中,节点类型可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL)和顺序节点(SEQUENTIAL)三大类,具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:
持久节点(PERSISTENT)
持久节点是 ZooKeeper中最常见的一种节点类型。所谓持久节点,是指该数据节点被创建后,就会一直存在于 ZooKeeper服务器上,直到有删除操作来主动清除这个节点。
持久顺序节点(PERSISTENT SEQUENTIAL)
持久顺序节点的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在ZooKeeper中,每个父节点都会为它的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序。基于这个顺序特性,在创建子节点的时候,可以设置这个标记,那么在创建节点过程中, ZooKeeper会自动为给定节点名加上一个数字后缀,作为一个新的、完整的节点名。另外需要注意的是,这个数字后缀的上限是整型的最大值。
临时节点(EPHEMERAL)
和持久节点不同的是,临时节点的生命周期和客户端的会话绑定在一起,也就是说,如果客户端会话失效,那么这个节点就会被自动清理掉。注意,这里提到的是客户端会话失效,而非TCP连接断开。另外, ZooKeeper规定了不能基于临时节点来创建子节点,即临时节点只能作为叶子节点。
临时顺序节点(EPHEMERAL SEQUENTIAL)
临时顺序节点的基本特性和临时节点也是一致的,同样是在临时节点的基础上,添加了顺序的特性。
2.2、状态信息
每个数据节点除了存储了数据内容之外,还存储了数据节点本身的一些状态信息。
[zk: localhost:2181(CONNECTED) 5] get /zk_test
test_data
cZxid = 0x4000092ec
ctime = Thu Mar 07 10:34:59 CST 2019
mZxid = 0x4000092ec
mtime = Thu Mar 07 10:34:59 CST 2019
pZxid = 0x4000092ec
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
| 状态属性 | 说明 |
| cZxid | 数据节点创建时的事务ID |
| ctime | 数据节点创建时的时间 |
| mZxid | 数据节点最后一次更新时的事务ID |
| mtime | 数据节点最后一次更新时的时间 |
| pZxid | 数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容变更)时的事务ID |
| cversion | 子节点的版本号 |
| dataVersion | 数据节点的版本号 |
| aclVersion | 数据节点的ACL版本号 |
| ephemeralOwner | 如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为0 |
| dataLength | 数据内容的长度 |
| numChildren | 数据节点当前的子节点个数 |
3、版本——保证分布式数据原子性操作
ZooKeeper中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化,下表中对这三类版本信息分别进行了说明。
| 版本类型 | 说明 |
|---|---|
| version | 当前数据节点内容的版本号 |
| cversion | 当前数据节点子节点的版本号 |
| aversion | 当前数据节点ACL变更版本号 |
ZooKeeper中的版本概念和传统意义上的软件版本有很大的区别,他表示的是对数据节点的数据内容、子节点列表,或是节点ACL信息的修改次
在一个数据节点被创建完毕之后,节点的 version值是0,表示的含义是“当前节点自从创建之后,被更新过0次”。如果现在对该节点的
数据内容进行更新操作,那么随后, version的值就会变成1。同时需要注意的是,在上文中提到的关于 verslon的说明,其表示的是对数据节点数据内容的变更次数,强调的是变更次数,因此即使前后两次变更并没有使得数据内容的值发生变化, version的值依然会变更。
本文深入解析ZooKeeper的数据模型,包括ZNode的层次结构、事务ID的作用及节点类型,如持久节点、临时节点和顺序节点的特性。同时,探讨了节点状态信息与版本控制机制,确保分布式环境下的数据一致性。
1904

被折叠的 条评论
为什么被折叠?



