目录
- ZKDatabase
- 1. 创建FileTxnSnapLog
- 数据结构
- 构造函数
- 2. 创建ZKDatabase
- 数据结构
- 构造函数
- 3. 加载日志数据
- SnapLog.deserialize()
- DataTree
- deserialize()
ZKDatabase
在上一篇文章中提到ZKDatabase,它是zookeeper的内存数据库,负责管理会话、DataTree存储和事务日志。在zookeeper服务器启动的时候,它会将磁盘上的事务日志和快照数据文件恢复成一个完整的内存数据库;在zookeeper服务器运行期间,它会定时向磁盘dump快照数据。为此,在继续往下了解zookeeper之前我们需要先对它有所了解。
以上就是Zookeeper服务器启动时加载数据的过程,接下来具体分析第1/2/6步。
1. 创建FileTxnSnapLog
它是Zookeeper管理事务日志和快照日志的工具类
数据结构
构造函数
FileTxnSnapLog初始化过程主要做了两件事:
- 创建并清理事务日志和快照日志目录
- 创建事务日志和快照日志工具类
2. 创建ZKDatabase
数据结构
构造函数
3. 加载日志数据
完成内存数据库的初始化之后,zookeeper就可以开始从磁盘中恢复数据了:
- 首先从快照文件开始加载,如第1步
- 接着通过事务日志来更新增量数据,如第4步的
fastForwardFromEdits()
方法
SnapLog.deserialize()
该方法详细介绍了zookeeper是如何读取快照文件的数据的:
- 首先根据文件名降序排列,获取排在前面的至多100个有效文件
- 对这些文件逐个进行反序列化,并将数据存放到dt和sessionsWithTimeouts中
DataTree
DataTree是内存中的一份完整的数据,从前面的过程分析可知它是内存数据存储的核心,是一个树的数据结构,它的数据结构如下:
其中,DataNode是数据存储的最小单元,它包含了数据内容data、ACL列表acl、节点状态stat、子节点列表children。
deserialize()
在内存数据库进行初始化时调用该方法将文件中的数据反序列化成DataTree的数据
至此,ZKDatabase的初始化介绍到此为止。