从Paxos到ZooKeeper-四、ZooKeeper技术内幕

2023-07-10,,

本文将从系统模型、序列化与协议、客户端工作原理、会话、服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕

一、系统模型

1.1 数据模型

ZooKeeper的视图结构使用了其特有的“数据节点”概念,我们称之为ZNode。ZNode是ZooKeeper中数据的最小单元,每个ZNode上都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,我们称之为树。

1.2 节点特性

我们已知,ZooKeeper的命名空间是由一系列数据节点组成的,我们将对数据节点做详细讲解。

节点类型

在ZooKeeper中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在ZooKeeper中,节点类型可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL)和顺序节点(SEQUENTIAL)三大类,ju'ti具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:

持久节点(PERSISTENT)

数据节点被创建后,就会一直存在于ZooKeeper服务器上,直到有删除操作来主动清除这个节点。

持久顺序节点(PERSISTENT_SEQUENTIAL)

他的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在ZooKeeper中,每个父节点都会为他的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序。基于这个顺序特性,在创建子节点的时候,可以设置这个标记,那么在创建节点过程中,ZooKeeper会自动为给定节点加上一个数字后缀,作为一个新的、完整的节点名。另外需要注意的是,这个数字后缀的上限是整型的最大值。

临时节点(EPHEMERAL)

临时节点的生命周期和客户端的会话绑定在一起,也就是说,如果客户端会话失效,那么这个节点就会被自动清理掉。这里提到的客户端会话失效,而非TCP连接断开。

临时顺序节点(EPHEMERAL_SEQUENTIAL)

在临时节点基础上,添加了顺序的特性。

状态信息

每个数据节点除了存储了数据内容外,还存储了数据节点本身的一些状态信息。

状态属性 说明
czxid 即Created ZXID,表示该节点被创建时的事务ID
mzxid 即Modified ZXID,表示该节点最后一次被更新时的事务ID
ctime 即Created Time
mtime 即Modified Time
version 数据节点的版本号
cversion 子节点的版本号
aversion 节点的ACL版本号
ephemeralOwner 创建该临时节点的会话的sessionID。如果该节点是持久节点,那么这个属性值为0
dataLength 数据内容长度
numChildren 当前节点的子节点个数
pzxid 表示该节点的子节点列表最后一次被修改时的事务ID。注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid。

1.3 版本-保证分布式数据原子性操作

ZooKeeper中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化。

版本类型 说明
version 当前数据节点数据内容的版本号
cversion 当前数据节点子节点的版本号
aversion 当前数据节点ACL变更版本号

在ZooKeeper中,version属性正是用来实现乐观锁机制中的“写入校验”的。

version = setDataRequest.getVersion();
int currentVersion = nodeRecord.stat.getVersion();
if(version != -1 && version != currentVersion) {
throw new KeeperException.BadVersionException(path);
}
version = currentVersion + 1;

1.4 Watcher-数据变更的通知

在ZooKeeper中,引入了Watcher机制来实现这种分布式的通知功能。ZooKeeper允许客户端向服务端注册一个Watcher监听,当服务器的一些指定事件出发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

从图中我们可以看到,ZooKeeper的Watcher机制主要包括ke'hu'duan'xian'c客户端线程、客户端WatcherManager和ZooKeeper服务器三部分。在具体工作流程上,客户端在向ZooKeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatcherManager中。当ZooKeeper服务器端触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。

1.5 ACL--保障数据的安全

提到权限控制,我们首先看看目前应用最广泛的权限控制方式--UGO(User、Group和Others)权限控制机制。简单地讲,UGO就是针对一个文件或目录,对创建者(User)、创建者所在的组(Group)和其他用户(Other)分别配置不同的权限。从这里可以看出,UGO其实是一种粗粒度的文件系统权限控制模式,利用UGO只能对三类用户jin'xing进行权限控制,即文件的创建者、创建者所在的组以及其他所有用户,很显然,UGO无法解决下面这个场景:

用户U1创建了文件F1,希望U1所在的用户组G1拥有对F1读写和执行的权限,另一个用户组G2拥有读权限,而另一个用户U3则没有任何权限。

下面我们来看另外一种典型的权限控制方式:ACL。ACL,即访问控制列表,是一种相对来说比较新颖且更细粒度的权限管理方式。可以针对任何用户和组进行细粒度的权限控制。

ACL介绍

ZooKeeper的ACL权限控制和Unix/Linux操作系统中的ACL有一些区别,读者可以从三个方面来理解ACL机制,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme

Paxos到ZooKeeper-四、ZooKeeper技术内幕的相关教程结束。

《从Paxos到ZooKeeper-四、ZooKeeper技术内幕.doc》

下载本文的Word格式文档,以方便收藏与打印。