ZooKeeper每个节点的最大子节点数

时间:2015-04-22 07:54:36

标签: java apache-zookeeper

我使用ZooKeeper来存储分层数据。在一次测试中,我在一个节点下存储了超过300K的孩子。当我试图检索所有孩子时,ZK客户端由于ConnectionLossException而崩溃。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

通过动物园管理员的资料,孩子人数没有明确限制。但是childCountint类型,最大值应该是Integer#MAX_VALUE

答案 2 :(得分:0)

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

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

查看this link进行完整的讨论。