日期:2014-05-16  浏览次数:20456 次

zookeeper存储之实现分析


zookeeper 存储基本都是在SyncRequestProcessor 单个线程完成的


1) 初始化


1.1)DataTree初始化

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实例


1.2)加载snapshot 和 committedlog中的事务到内存树

【详见ZKDatabase.loadDataBase--->FileTxnSnapLog.restore】

  • 首先会加载多个snapshot到内存数中

           怎么会有多个snapshot不理解?

  •  加载committedlog

           系统会产生多个committedlog,以事务的序号作为后缀名,比如1-50个事务放在log.1, 51-100放在log.51,......

           文件名中后缀序号就是文件中第一个序号


            由于snapshotcommittedlog并非完全同步,通常情况下,committedlog信息会多于snapshot,比如snapshot记录到了第80条事务,

            但committedlog 可能记录了150条事务,因此在加载的时候,就应该联合snapshot和committedlog


<