日期:2014-05-16 浏览次数:20486 次
zookeeper 存储基本都是在SyncRequestProcessor 单个线程完成的
public DataTree() {
/* Rather than fight it, let root have an alias */
nodes.put("", root);
nodes.put(rootZookeeper, root);
/** add the proc node and quota node */
root.addChild(procChildZookeeper);
nodes.put(procZookeeper, procDataNode);
procDataNode.addChild(quotaChildZookeeper);
nodes.put(quotaZookeeper, quotaDataNode);
}
会有3个节点 /、/zookeeper、/zookeeper/quota 内容为空
注意DataTree维护了两个数据结构
一个是ConcurrentHashMap<String, DataNode> nodes,所有的节点都可以在这查到
一个是DataNode,DataNode包含了Set<String> children,含有父子关系
也就是说通过DataNode可以遍历到子node的路径(索引),然后通过索引去nodes查到node实例
【详见ZKDatabase.loadDataBase--->FileTxnSnapLog.restore】
首先会加载多个snapshot到内存数中
怎么会有多个snapshot不理解?
加载committedlog
系统会产生多个committedlog,以事务的序号作为后缀名,比如1-50个事务放在log.1, 51-100放在log.51,......
文件名中后缀序号就是文件中第一个序号
由于snapshot和committedlog并非完全同步,通常情况下,committedlog信息会多于snapshot,比如snapshot记录到了第80条事务,
但committedlog 可能记录了150条事务,因此在加载的时候,就应该联合snapshot和committedlog