【问题标题】:ZooKeeper max number of children per nodeZooKeeper 每个节点的最大子节点数
【发布时间】:2015-06-29 17:33:11
【问题描述】:

我正在使用 ZooKeeper 来存储分层数据。在一项测试中,我为一个节点下存储了超过 30 万个子节点。当我尝试检索所有子节点时,ZK 客户端因 ConnectionLossException 而崩溃。

重构数据可能会解决问题(例如,通过分桶,因为它减少了每个节点的子节点数量)。

不过我很想知道以下问题的答案:

  1. ZK 有一个节点可以存储的数据限制(不超过 1MB),每个节点的子节点数量是否有类似限制?
  2. 增加 Java 堆大小是否允许 ZK 横向扩展每个节点的子节点数量?
  3. 有没有办法控制这些孩子被送回客户的方式?如果孩子是分批发送的,那么网络“打嗝”可能会破坏消息并导致失败。

谢谢!

【问题讨论】:

  • 对于您的问题,我没有直接的答案,但我建议您查看 Curator 的技术说明。例如,Tech Node #4 包含一些可能对您有帮助的信息cwiki.apache.org/confluence/display/CURATOR/TN4
  • 你提供的链接信息很有趣,出现的问题和我现在的情况差不多,非常感谢分享。

标签: java apache-zookeeper


【解决方案1】:

就在一天前,Zookeeper 版本 3.4.4 存在一个问题,其中近 80 万个节点最终位于单个父节点下,并在尝试访问该父节点时导致问题。尝试了几种不同的方法来删除节点,但都没有奏效。全部命中 ConnectionLoss KeeperExceptions。

-Djute.maxbuffer java 选项在与通过 3.4.14 java 客户端(不是 3.4.4 java 客户端)使用 ZKUtil.deleteRecursive( zk, path ); 的 java8 程序一起运行时可以删除 800K 子 znode。这个 jopt 不必放在服务器端。这是纯粹客户端更改。但是不能与 3.4.14 zkCli 命令行客户端一起使用。

【讨论】:

    【解决方案2】:

    孩子的数量没有明确的限制。

    但是,有一个 限制可以从服务器发回的数据包的大小 对getChildren 的回应实际上最终成为了限制。这是 由系统属性控制,jute.maxbuffer,默认为 4MB(我 认为您可以在其中获得大约 200,000 个 znode,尽管这也取决于 关于 znode 名称的长度)。

    查看this link 了解完整讨论。

    【讨论】:

      【解决方案3】:

      通过 zookeeper 源,对子数量没有明确限制。但是childCountint 类型,最大值应该是Integer#MAX_VALUE

      【讨论】:

        猜你喜欢
        • 2013-04-23
        • 2015-03-17
        • 1970-01-01
        • 2013-02-01
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多