一、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。

kamier
1.5k 声望493 粉丝