一. Zookeeper中的数据元素

130 阅读1分钟
  1. ZKDatabase 对象

image.png

  1. DataTree 节点树

image.png

  1. DataNode 数据节点

image.png

  1. 创建节点watch机制触发逻辑

image.png

  1. 删除节点触发watch机制逻辑

image.png

  1. 设置节点值触发watch机制逻辑

image.png

image.png

  1. 详细代码见zookeeper源码

` org.apache.zookeeper.server.FinalRequestProcessor#processRequest

org.apache.zookeeper.server.ZKDatabase#processTxn org.apache.zookeeper.server.DataTree#processTxn org.apache.zookeeper.server.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType) `

8.这里直接看下更新逻辑 a. FinalRequestProcessor#processRequest 部分核心逻辑

public void processRequest(Request request) {
    if (LOG.isDebugEnabled()) {
        LOG.debug("Processing request:: " + request);
    }
    // request.addRQRec(">final");
    long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK;
    if (request.type == OpCode.ping) {
        traceMask = ZooTrace.SERVER_PING_TRACE_MASK;
    }
    if (LOG.isTraceEnabled()) {
        ZooTrace.logRequest(LOG, traceMask, 'E', request, "");
    }
    ProcessTxnResult rc = null;
    synchronized (zks.outstandingChanges) {
        while (!zks.outstandingChanges.isEmpty()
                && zks.outstandingChanges.get(0).zxid <= request.zxid) {
            ChangeRecord cr = zks.outstandingChanges.remove(0);
            if (cr.zxid < request.zxid) {
                LOG.warn("Zxid outstanding "
                        + cr.zxid
                        + " is less than current " + request.zxid);
            }
            if (zks.outstandingChangesForPath.get(cr.path) == cr) {
                zks.outstandingChangesForPath.remove(cr.path);
            }
        }
        if (request.hdr != null) {
           TxnHeader hdr = request.hdr;
           Record txn = request.txn;
           // 触发节点属性更新逻辑
           rc = zks.processTxn(hdr, txn);
        }
        // do not add non quorum packets to the queue.
        if (Request.isQuorum(request.type)) {
            zks.getZKDatabase().addCommittedProposal(request);
        }
    }
    ......
    }

b.org.apache.zookeeper.server.ZKDatabase#processTxn核心逻辑

image.png

c. org.apache.zookeeper.server.DataTree#processTxn 节点数据模型对象更新

image.png

d. org.apache.zookeeper.server.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType) 触发客户端监听回调机制

image.png