ZooKeeper提供的名称空间非常类似于标准文件系统。ZooKeeper的数据存储是基于节点的,这个节点叫做Znode,Znode的引用方式是路径引用,是由斜线(/)分隔的层级结构,让每一个Znode节点拥有唯一的路径。
Znode兼具文件和目录两种特点。既像文件,又像目录一样可以作为路径标识的一部分。Znode维护着:data
:Znode存储的数据信息ACL
:记录Znode的访问权限stat
:包含Znode的各种元数据,比如事务ID、版本号、时间戳、大小等等child
:当前节点的子节点引用
把以上几类属性细化,又可以得到以下属性的细节:cZxid
:表示节点被创建时的事务 IDmZxid
:表示节点最后一次被修改时的事务 IDctime
:表示节点创建时间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生命周期结束,这些临时节点也将被删除。临时节点和永久节点的作用:
-
持久节点
:通过持久节点保存一些应用数据,即使ZNode的创建者崩断开连接,数据也不会丢失。例如在主-从模式中,需要保存从节点的任务分配情况,即使分配任务的主节点已经崩溃 -
临时节点
:临时节点可以用作选主,成功创建临时节点的为Master,Follower监听临时节点,当Master挂掉,临时节点被删除会触发新的Master选举
临时节点与永久节点都可以成为顺序节点。细分一下,共有四种节点类型:
PERSISTENT-持久化目录节点:客户端与ZooKeeper断开连接后,该节点依旧存在
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点:客户端与ZooKeeper断开连接后,该节点依旧存在,只是ZooKeeper给该节点名称进行顺序编号
EPHEMERAL-临时目录节点:客户端与ZooKeeper断开连接后,该节点被删除
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:客户端与ZooKeeper断开连接后,该节点被删除,只是ZooKeeper给该节点名称进行顺序编号