一、Zookeeper数据结构
1.1 DataTree
每次zookeeper服务启动时,会将快照文件的数据反序列化到DataTree中,再结合日志文件将数据还原到最新状态,DataTree的主要源码如下
public class DataTree {
private static final Logger LOG = LoggerFactory.getLogger(DataTree.class);
// 存储节点数据,key为节点路径,value为DataNode节点信息
private final ConcurrentHashMap<String, DataNode> nodes =
new ConcurrentHashMap<String, DataNode>();
// 略
}
从上面可以看到,nodes是一个HashMap
- key是String类型,代表的是
节点路径
,比如"/app1"、"/app1/data1"等 - value是DataNode类型,代表
节点信息
1.2 DataNode
DataNode代表的是zookeeper的节点,也就是znode,其源码如下
public class DataNode implements Record {
// 父节点
DataNode parent;
// 节点数据
byte data[];
// 节点的访问控制列表值
Long acl;
// 节点持久化到磁盘的状态信息
public StatPersisted stat;
// 子节点路径列表
private Set<String> children = null;
}
- parent:代表当前节点的父节点
- data[]:节点数据
- acl:节点的访问控制列表值
- stat:节点持久化到磁盘的状态信息
- children:子节点路径列表,比如/app1/data1、/app1/data2等
1.3 StatPersisted
这里看下节点持久化到磁盘的状态信息有哪些,StatPersisted的源码如下
public class StatPersisted implements Record {
private long czxid;
private long mzxid;
private long ctime;
private long mtime;
private int version;
private int cversion;
private int aversion;
private long ephemeralOwner;
private long pzxid;
}
- czxid:创建节点的事务ID,即创建事务的zxid。
- mzxid:最后修改节点的事务ID,即最后一次修改事务的zxid。
- ctime:节点的创建时间戳。
- mtime:节点的最后修改时间戳。
- version:节点的数据版本号,每次更新节点时会自增。
- cversion:子节点的变更版本号,当创建、删除或修改子节点时会自增。
- aversion:节点ACL(访问控制列表)的变更版本号,当节点的ACL发生变化时会自增。
- ephemeralOwner:如果该节点是临时节点,则表示创建者的会话ID;如果节点是持久节点,则为0。
- pzxid:父节点的最后一次修改的事务ID。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。