15.4 ZooKeeper的特性

15.4.1 ZooKeeper的数据模型

ZooKeeper拥有一个层次的命名空间,这和分布式的文件系统非常相似。唯一不同的地方是命名空间中的每个节点可以有和它自身或它的子节点相关联的数据。这就好像是一个文件系统,只不过文件系统中的文件还可以具有目录的功能。另外,指向节点的路径必须使用规范的绝对路径来表示,并且以斜线“/”来分隔。需要注意的是,在ZooKeeper中不允许使用相对路径。

1.Znode

ZooKeeper目录树中的每一个节点对应着一个Znode。每个Znode维护着一个属性结构,它包含数据的版本号(dataVersion)、时间戳(ctime、mtime)等状态信息。ZooKeeper正是使用节点的这些特性来实现它的某些特定功能的。每当Znode的数据改变时,它相应的版本号将会增加。每当客户端检索数据时,它将同时检索数据的版本号。并且如果一个客户端执行了某个节点的更新或删除操作,它也必须提供要被操作的数据的版本号。如果所提供的数据版本号与实际的不匹配,那么这个操作将会失败。

Znode是客户端要访问的ZooKeeper的主要实体,它包含以下几个主要特征:

(1)Watches

客户端可以在节点上设置watch(我们称之为监视器)。当节点的状态发生改变时(数据的增、删、改等操作)将会触发watch对应的操作。当watch被触发时,Zookeeper将会向客户端发送且仅发送一个通知,因为watch只能被触发一次。

(2)数据访问

ZooKeeper中的每个节点上存储的数据需要被原子性的操作。也就是说,读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。

(3)临时节点

ZooKeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。ZooKeeper临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然也可以手动删除。另外,需要注意的是,ZooKeeper的临时节点不允许拥有子节点。相反,永久节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才被删除。

(4)顺序节点(唯一性保证)

当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,它的格式为“%010d”(10位数字,没有数值的数据位用0填充,例如0000000001)。当计数值大于232-1时,计数器将会溢出。

2.ZooKeeper中的时间

ZooKeeper中有多种记录时间的形式,其中包括如下几个主要属性:

(1)Zxid

致使ZooKeeper节点状态改变的每一个操作都将使节点接收到一个zxid格式的时间戳,并且这个时间戳是全局有序的。也就是说,每一个对节点的改变都将产生一个唯一的zxid。如果zxid1的值小于zxid2的值,那么zxid1所对应的事件发生在zxid2所对应的事件之前。实际上,ZooKeeper的每个节点维护着三个zxid值,分别为:cZxid、mZxid和pZxid。cZxid是节点的创建时间所对应的Zxid格式时间戳,mZxid是节点的修改时间所对应的Zxid格式时间戳。

(2)版本号

对节点的每一个操作都将致使这个节点的版本号增加。每个节点维护着三个版本号,它们分别为:version(节点数据版本号)、cversion(子节点版本号)、avevsion(节点所拥有的ACL的版本号)。

3.节点属性结构

通过上面的介绍,我们可以了解到,一个节点自身拥有表示其状态的许多重要属性,表15-4给出了详细的介绍:

15.4 ZooKeeper的特性 - 图1