ZooKeeper的数据模型是一棵树,而从使用角度看,ZooKeeper就像一个内存数据库一样。在这个内存数据库中,存储了整棵树的内容,包括所有的节点路径、节点数据及其ACL信息等,ZooKeeper会定时将这个数据存储到磁盘上。接下来我们就一起来看看这棵“树”的数据结构,如下图所示。
DataTree
DataTree是ZooKeeper内存数据存储的核心,是一个“树”的数据结构,代表了内存中的一份完整的数据。DataTree不包含任何与网络、客户端连接以及请求处理等相关的业务逻辑,是一个非常独立的ZooKeeper组件。
DataNode
DataNode是数据存储的最小单元,其数据结构如上图所示。DataNode内部除了保存了节点的数据内容(data[])、ACL列表(acl)和节点状态(stat)之外,正如最基本的数据结构中对树的描述,还记录了父节点(parent)的引用和子节点列表(children)两个属性。同时,DataNode还提供了对子节点列表操作的各个接口:
nodes
DataTree用于存储所有ZooKeeper节点的路径、数据内容及其ACL信息等,底层的数据结构其实是一个典型的ConcurrentHashMap键值对结构:
在nodes这个Map中,存放了ZooKeeper服务器上所有的数据节点,可以说,对于ZooKeeper数据的所有操作,底层都是对这个Map结构的操作。nodes以数据节点的路径(path)为key,value则是节点的数据内容:DataNode。
另外,对于所有的临时节点,为了便于实时访问和及时处理,DataTree中还单独将临时节点保存起来:
ZKDatabase
ZKDatabase,正如其名字一样,是ZooKeeper的内存数据库,负责管理ZooKeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在ZooKeeper服务器启动的时候,会通过磁盘上的事务日志和快照数据文件恢复成一个完整的内存数据库。