配额机制是 ZooKeeper 中的一项重要功能,可以帮助管理者更好地管理和保护 ZooKeeper 节点。
ZooKeeper 中的配额(quota)机制允许对节点的子节点数量和节点数据大小进行限制。这种机制可以帮助管理者控制节点的使用,防止节点过度增长导致的性能问题或资源耗尽。
ZooKeeper 中的配额机制包括两种类型的配额:
子节点数量配额:该配额限制了一个节点下可以包含的子节点数量。一旦设置了子节点数量配额,当子节点数量达到配额限制时,将无法再创建新的子节点。这有助于防止节点下的子节点过多,影响性能。
节点数据大小配额:该配额限制了一个节点数据的总大小。一旦设置了节点数据大小配额,当节点数据大小达到配额限制时,将无法再向节点写入更多数据。这有助于防止节点数据过大,占用过多存储空间。
注意:ZooKeeper 中的配额机制是针对单个节点的,而不是整个 ZooKeeper 实例。因此,需要根据实际需求在合适的节点上设置配额。
setquota 命令用来为指定的节点设置配额,语法如下:
setquota -n|-b|-N|-B val path
参数说明:
-n:表示设置子节点数量配额。
-b:表示设置节点数据大小配额。
-N:表示移除子节点数量配额。
-B:表示移除节点数据大小配额。
val:配额的值,对于 -n 选项,表示子节点数量的上限;对于 -b 选项,表示节点数据大小的上限。
path:要设置配额的节点路径。
(1)设置配额,限制节点的最大节点数,如下:
# 创建节点 /node_2 [zk: localhost:2181(CONNECTED) 10] create /node_2 node2 Created /node_2 # 设置配额,指定其子节点最大数为 2 [zk: localhost:2181(CONNECTED) 11] setquota -n 2 /node_2 # 创建第1个子节点 [zk: localhost:2181(CONNECTED) 12] create /node_2/node_2_1 21 Created /node_2/node_2_1 # 创建第2个子节点 [zk: localhost:2181(CONNECTED) 13] create /node_2/node_2_2 22 Created /node_2/node_2_2 # 创建第3个子节点 # 此处虽然指定了最大两个子节点,但是并没报错,而是成功创建了 # 虽然创建成功了,但是会在${dataDir}/zookeeper.out中记录警告信息 [zk: localhost:2181(CONNECTED) 14] create /node_2/node_2_3 23 Created /node_2/node_2_3 # 查看节点列表 [zk: localhost:2181(CONNECTED) 15] ls /node_2 [node_2_1, node_2_2, node_2_3]
最大节点数警告信息:
# 此处的zookeeper.out在zookeeper的 $dataDir目录下 tail -2 /var/zookeeper/zookeeper.out [myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=3 limit=2 [myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=4 limit=21234
(2)使用 -b 选线限制一个节点的字节数,即数据长度。如下:
[zkshell: 22] setquota -b 5 /brokers [zkshell: 23] set /brokers "I_love_zookeeper" # Notice:don't have a hard constraint,just log the warning info WARN [CommitProcWorkThread-7:DataTree@379] - Quota exceeded: /brokers bytes=4206 limit=5
(3)使用 -N 硬配额计数,如下:
[zkshell: 3] create /c1 Created /c1 [zkshell: 4] setquota -N 2 /c1 [zkshell: 5] listquota /c1 absolute path is /zookeeper/quota/c1/zookeeper_limits Output quota for /c1 count=-1,bytes=-1=;byteHardLimit=-1;countHardLimit=2 Output stat for /c1 count=2,bytes=0 [zkshell: 6] create /c1/ch-3 Count Quota has exceeded : /c1/ch-3
(4)-B 字节硬配额,如下:
[zkshell: 3] create /c2 [zkshell: 4] setquota -B 4 /c2 [zkshell: 5] set /c2 "foo" [zkshell: 6] set /c2 "foo-bar" Bytes Quota has exceeded : /c2 [zkshell: 7] get /c2 foo