Zookeeper的几个概念:(接下来将从这几个概念书写Zookeeper的内部工作流程)
- 数据模型
- 节点特性
- 版本
- Watcher
- ACL
<1> 数据模型:
Zookeeper的视图很热Unix文件系统很像。但没有引入文件和文件目录相关概念;而是使用“数据节点”概念,称为ZNode;
ZNode是ZK中最小的数据单元,每个ZNode上可以保存数据,也可以挂载子节点;即形成了一种层次化空间树;
事务ID : ZK中,事务是指能够改变zk服务器状态的操作,一般包括数据节点创建与删除,数据节点内容更新和客户端会话创建与失效等操作;对于每一个事务请求,zk都会为其分配一个全局唯一的事务ID,用ZXID表示,是一个64位的数字;每一个ZXID对应一个事务操作;
<2> 节点特性:
ZK中每个数据节点都是有生命周期;具体取决于数据节点的类型;
节点类型可以分为:持久节点,临时节点,顺序节点;
在节点的创建过程中,可以组合使用,于是有以下四种组合:
(1)持久节点:该节点一旦被创建,就会一直存在于ZK服务器上,直到有删除操作来主动清除这个节点;
(2)持久顺序节点:ZK中,每个父节点会为其第一级子节点维护一份顺序,用于记录下每个节点的先后顺序。
(3)临时节点:临时节点生命周期和客户端会话绑定在一起,客户端会话失效,这个节点被自动清理掉。(客户端失效非TCP连接断开,另外不能基于临时节
点创建子节点)。
(4)临时顺序节点:特性和持久顺序节点类似;
状态信息:zk上的数据节点进行数据的写入和子节点创建两个动作;一些状态说明:
<1> czxid :Create ZXID :表示数据节点被创建时的事务ID;
<2> mzxid: Modified ZXID :表示该节点最后一次被更新时的事务;
<3> ctime : 节点创建时间。
version,cversion,aversion等状态属性后续继续介绍
<3> 版本:(保分布式数据原子性操作)
zk引入版本概念:每个数据节点都有三种类型的版本信息:
(1)version :当前结点的数据内容版本号;
(2)cversion:当前数据子节点的版本号;
(3)aversion:当前数据节点ACL变更的版本号;
以version为例:一个数据节点 /zk 被创建之后,节点的version值是0,代表 节点自创建以来被更新过 0 次;
分布式领域-锁:一个乐观锁的事务控制分为三个阶段:数据读取,写入校验,数据写入;其中写入校验是整个乐观锁控制的关键所在。在写入校验阶段,事务会检查数据在读取阶段是否有其他事务对数据进行修改,确保数据的一致性;在zk中,使用这种版本号version来实现这种。通过获取当前version和version对比,保证两个版本匹配;
<4> Watcher 和 <5> ACL 内容较多,后续章节继续介绍!