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

bgibtngc  于 2022-12-09  发布在  Apache
关注(0)|答案(3)|浏览(272)

我正在使用ZooKeeper来存储分层数据。在一个测试中,我在一个节点下存储了超过300 K的子节点。当我试图检索所有子节点时,ZK客户端由于ConnectionLossException而崩溃。
对数据进行重构可能会解决该问题(例如,通过分组,因为它减少了每个节点的子节点数)。
然而,我很想知道以下问题的答案:

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

f87krz0w1#

对孩子的数量没有明确的限制。
但是,对于服务器响应getChildren时返回的数据包的大小是有限制的,这是由系统属性jute.maxbuffer控制的,默认值为4MB(我认为您可以得到大约200,000个znode,尽管这也取决于znode名称的长度)。
请查看this link以了解完整的讨论。

zsohkypk

zsohkypk2#

就在一天前,Zookeeper 3.4.4版出现了一个问题,将近800K个节点最终都在一个父节点下,并且在尝试访问该父节点时导致问题。尝试了几种不同的方法来删除节点,但都没有成功。所有方法都遇到了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命令行客户端。

5ktev3wc

5ktev3wc3#

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

相关问题