一、節點配額概述
zookeeper中可以往節點存放數據,但是一般來說存放數據總是要有個度量的對吧,不然空間就那么大,如果某個節點將空間全占用了其它節點沒得用了,所以zookeeper提供了一個對節點配額功能,不過這個配額功能有點雞肋,當占用的空間超過了設置的大小時只會打印WARN級別的日志提醒而不是直接讓超出配額的操作失敗。既然只是在日志中打印一個警告信息,首先就是要找到日志的位置,默認情況下,日志的位置在$ZOOKEEPER/bin/zkEnv.sh中設置:
可以看到,如果不設置默認會將日志輸出在zkEnv.sh腳本所在的目錄,即將日志輸出到$ZOOKEEPER/bin/zookeeper.out文件中。
配額類型
配額分為兩種,一種是對子節點數量的限制,稱之為count限制,一種是對節點能夠存放的數據大小的限制,稱之為byte限制。
配額信息的保存位置
zookeeper的配額信息是存儲在/zookeeper/quota路徑下的,可以打開看一下:
查看更詳細的信息:
zookeeper_limits是對此節點施加的限制,即最大能夠是多少:
zookeeper_stats是節點的當前狀態,即當前已經用了多少:
配額可以通過zkCli.sh命令行工具進行相關設置,下面將相關的幾個命令進行詳細介紹。
二、quota相關命令
setquota -n|-b val path
用來設置某個節點的子節點個數和其本身的數據長度。
-n 限制此節點最大可擁有多少個子節點
-b 限制此節點能夠存儲的數據最大是多少個字節
-n 選項有點不太好理解,因為在樹形結構中的限制子節點數量一般分為有兩種情況:
1. 只算直接孩子節點的數量,孩子節點的子節點就不再算數
2. 只要是掛在這個節點下的節點都算數,是遞歸計算
那么這里的-n是指的哪種情況呢?來做一個小小的實驗驗證一下。
創建一個節點/foo,為其配額子節點數為3,然后在下面創建幾個孩子節點:
然后查看日志:
這條日志是在創建/foo/c的時候打印的,但是仔細一算好像不太對哦,/foo/a、/foo/b、/foo/c這才三個節點啊,並沒有超出限制為什么count顯示4呢?這是因為當前節點本身還占用了一個計數。
-b選項和-n選項差不多:
創建/foo/a時打印了警告日志:
listquota path
顯示指定路徑下已經設置的配置
delquota [-n|-b] path
用於刪除已經創建的quota:
需要注意的是刪除節點時並不會自動刪除綁定在特定路徑上的quota,需要手動刪除。
三、總結
1. zookeeper的quota並沒有實際的限制作用,超出了也只是打印WARN級別日志。
2. quota有子節點數量和字節大小限制兩種。
3. quota是以前綴匹配路徑,作用在指定路徑路徑及其子路徑上。
.