文章目录
系统模型
数据模型
zk引入了ZNode,类似于Unix文件系统的树结构。ZNode是ZooKeeper中数据的最小但愿,每个ZNode上都可以保存数据,同时还可以挂载子节点。
节点类型
根据是否具备持久和顺序的特性,zk节点分为四种节点类型,持久代表一经在zk服务器创建,则不会自动删除,顺序表示每次创建节点都会在节点名后面加一个递增数字后缀来标志顺序,同时顺序节点下不允许有子节点
在Zookeeper中的定义如下:
public enum CreateMode {
/**
* 数据节点一旦被创建,会一直存在于zk服务器,直到有删除操作来主动清除
*/
PERSISTENT (0, false, false),
/**
* 具备持久节点的特性,同时zk会在顺序节点的父节点中维护一份顺序表,在顺序节点创建是,自动为节点添加一个单调递增顺序后缀,用来标志创建顺序
*/
PERSISTENT_SEQUENTIAL (2, false, true),
/**
* 当创建节点的机器断开与zk的连接时,节点会被移除
*/
EPHEMERAL (1, true, false),
/**
* 具备临时节点的特性,同时zk会在顺序节点的父节点中维护一份顺序表,在顺序节点创建是,自动为节点添加一个单调递增顺序后缀,用来标志创建顺序
*/
EPHEMERAL_SEQUENTIAL (3, true, true);
private boolean ephemeral;
private boolean sequential;
private int flag;
CreateMode(int flag, boolean ephemeral, boolean sequential) {
this.flag = flag;
this.ephemeral = ephemeral;
this.sequential = sequential;
}
}
节点状态信息
对于zk的每个数据节点,除了数据内容外,还有一些额外的状态信息,可参照zk的Stat类:
ublic class Stat implements Record {
// created zxid,表示该数据节点被创建时的事务ID
private long czxid;
// modified zxid,表示该节点最后一次被更新时的事务ID
private long mzxid;
// created time,表示节点被创建的时间
private long ctime;
// modified time,表示该节点最后一次被更新的时间
private long mtime;
// 数据节点的版本号,每次变更数据节点信息都会生成一个新的版本号,用来标志这次改动
private int version;
// 子节点的版本号,标志当前节点作为父节点变更子节点的次数
private int cversion;
// 节点的ACL版本号
private int aversion;
// 创建该临时节点的会话的sessionID,如果该节点是持久节点,属性值为0
private long ephemeralOwner;
// 数据内容的长度
private int dataLength;
// 子节点个数
private int numChildren;
// 表示该节点的子节点列表最后一次被修改的事务ID,只有子节点列表变更才会变更pzxid,子节点内容变更不会。
private long pzxid;
}
节点版本
zk引入数据节点版本的概念,来保证分布式数据的原子操作,版本号可以表示对应版本操作的变更次数,实际内容值可能不会发生变化。可以基于版本号而非数据内容来实现乐观锁&#x