首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在动物园管理员建议请求阶段时,跟随节点对磁盘的刷新请求是吗?

在动物园管理员建议请求阶段时,跟随节点对磁盘的刷新请求是吗?
EN

Stack Overflow用户
提问于 2018-10-06 10:38:54
回答 1查看 129关注 0票数 4

我看过动物园管理员的源代码,它在集群里有很奇怪的操作。我们都知道,当写入动物园管理员集群节点时,流程步骤如下:

  1. 领导向所有跟随者和自己发送建议请求。
  2. 当跟随者收到建议请求时,将其压缩
  3. 当领导者收到最多的ack响应,然后发送提交请求。
  4. 跟随者和领导者都做出了承诺

问题在于步骤2,当跟随者收到建议请求时,requst被同步到zk日志(请参阅列表代码),提交请求只写入内存。但是在同步到磁盘时间之前和之后,重新启动所有节点,未实现的请求是最新的请求吗?

代码语言:javascript
复制
 //  the follower receive the proposal request method , forword to syncProcessor
 public void FollowerZooKeeperServer#logRequest(TxnHeader hdr, Record txn) {
            Request request = new Request(null, hdr.getClientId(), hdr.getCxid(),
                    hdr.getType(), null, null);
            request.hdr = hdr;
            request.txn = txn;
            request.zxid = hdr.getZxid();
            if ((request.zxid & 0xffffffffL) != 0) {
                pendingTxns.add(request);
            }
            syncProcessor.processRequest(request);
        }



 // the SyncRequestProcessor operation , after tx log commit to disk , it response the ack request. Was it ok ?
private void flush(LinkedList<Request> toFlush)
        throws IOException, RequestProcessorException
    {
        if (toFlush.isEmpty())
            return;

        zks.getZKDatabase().commit();
        while (!toFlush.isEmpty()) {
            Request i = toFlush.remove();
            if (nextProcessor != null) {
                nextProcessor.processRequest(i);
            }
        }
        if (nextProcessor != null && nextProcessor instanceof Flushable) {
            ((Flushable)nextProcessor).flush();
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 17:44:58

答案是肯定的。

在tx日志提交到磁盘之后,假设txid为N,则认为写入是接受的。如果重新启动所有节点,则txid每个节点的使用将是N。在选举成功后,N将被视为已提交。

--我想困扰你的是,客户机实际上没有收到写的响应,但是写的是提交的。这是可以接受的,因为动物园管理员集群的状态保持一致,只有客户端遇到超时,其中超时意味着请求是否已提交都是未知的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52678196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档