Zookeeper 数据结构

  ZooKeeper提供的名称空间非常类似于标准文件系统。ZooKeeper的数据存储是基于节点的,这个节点叫做Znode,Znode的引用方式是路径引用,是由斜线(/)分隔的层级结构,让每一个Znode节点拥有唯一的路径。Zookeeper 数据结构
Znode兼具文件和目录两种特点。既像文件,又像目录一样可以作为路径标识的一部分。Znode维护着:
data:Znode存储的数据信息
ACL:记录Znode的访问权限
stat:包含Znode的各种元数据,比如事务ID、版本号、时间戳、大小等等
child:当前节点的子节点引用

把以上几类属性细化,又可以得到以下属性的细节:
cZxid:表示节点被创建时的事务 ID
mZxid:表示节点最后一次被修改时的事务 ID
ctime:表示节点创建时间
mtime:表示节点最后一次被修改的时间
pZxid:表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新
cversion:表示子节点的版本号
dataVersion:表示内容版本号
dataLength:表示数据长度
numChildren:表示子节点数
ephemeralOwner:表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0

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

实现中Zxid是一个64为的数字,它高32位是epoch用来标识Leader关系是否改变,每次一个Leader被选出来,它都会有一个新的epoch。低32位是个递增计数。

版本号
  版本号是用来记录节点数据或者是节点的子节点列表或者是权限信息的修改次数。如果一个节点的version是1,那就代表说这个节点从创建以来被修改了一次。对节点的每一个操作都将致使这个节点的版本号增加。每个节点维护着三个版本号,分别为:
(1)dataVersion:节点数据版本号
(2)cversion:子节点版本号
(3)aversion:节点所拥有的ACL版本号

它通过对这些数据的管理来让缓存生效并且令协调更新。每当Znode中的数据更新后它所维护的版本号将增加。

  ZooKeeper中的节点有两种,分别为临时节点(Ephemeral Node)和永久节点(Persistent Node)。临时节点与session同时存在,当session生命周期结束,这些临时节点也将被删除。临时节点与永久节点都可以成为顺序节点。细分一下,共有四种节点类型:
PERSISTENT-持久化目录节点:客户端与ZooKeeper断开连接后,该节点依旧存在
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点:客户端与ZooKeeper断开连接后,该节点依旧存在,只是ZooKeeper给该节点名称进行顺序编号
EPHEMERAL-临时目录节点:客户端与ZooKeeper断开连接后,该节点被删除
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:客户端与ZooKeeper断开连接后,该节点被删除,只是ZooKeeper给该节点名称进行顺序编号

ZooKeeper中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。