在了解 ZK 底層原理之前,咱們先簡單了解常用的 ZK 命令硫眯,熟悉常用 ZK 命令有利于排查相關問題或了解基于 ZK 自研系統(tǒng)等場景垫蛆。比如在開發(fā)的時候,發(fā)現(xiàn)有些Dubbo服務無法被調用刹前,這有可能是服務沒有注冊到ZK或者斷開連接;也有可能公司有自研的系統(tǒng)使用 ZK 作為配置中心雌桑,熟悉 ZK 命令就能知道是如何做到服務發(fā)現(xiàn)注冊和配置動態(tài)更新喇喉。
話不多說,咱們先來了解常見的 ZK 命令吧校坑!
命令查找:help
實際上拣技,ZK并沒有help命令,你可以隨意敲一兩個字符也會這樣顯示耍目,只不過基于使用Linux的習慣膏斤,姑且認為輸入help能打印出ZK支持的命令吧。
查找目錄下的節(jié)點:ls
ls [-s] [-w] [-R] path
- -s:查看節(jié)點狀態(tài)(其效果和stat命令一樣)
- -w:監(jiān)聽子節(jié)點變化
- -R:查看所有節(jié)點
ls 命令可以查看指定目錄下的節(jié)點邪驮,使用可選的參數(shù)莫辨,能夠更加詳細的看到節(jié)點的相關信息
查看節(jié)點狀態(tài):stat
stat [-w] path
stat / 等價于 ls -s /
和 ls 命令相似的,加上-w參數(shù)添加監(jiān)聽
添加節(jié)點:create
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
- -s:有序節(jié)點
- -e:臨時節(jié)點
- -c:容器的節(jié)點類型
- -t ttl:TTL節(jié)點毅访,設置節(jié)點存活時間
- path:指定要創(chuàng)建節(jié)點的路徑
- data:節(jié)點存儲的數(shù)據(jù)
- acl:訪問權限相關沮榜,默認是 world(關于這部分的使用,請繼續(xù)往下關注ACL部分的內容)
在ZK 3.5版本之后喻粹,新增了容器和TTL節(jié)點蟆融,分別是使用 -c
和-t
創(chuàng)建。所以讀者們要注意你當前使用的版本守呜,如果版本低于3.5的型酥,是沒有容器和TTL節(jié)點。
特別說明一下容器節(jié)點和TTL節(jié)點的使用:
容器節(jié)點和持久節(jié)點相似查乒,但區(qū)別是ZK啟動是有單獨線程掃描所有容器節(jié)點弥喉,當發(fā)現(xiàn)容器節(jié)點的子節(jié)點數(shù)量為 0 時,會自動刪除該節(jié)點玛迄。-c 和 -s / -e / -t 參數(shù)都是互斥档桃,不能同時執(zhí)行
TTL節(jié)點實際上就是設置一個有存活時間的節(jié)點,過了存活時間的節(jié)點會自動“消失”憔晒。-t 和 -e 參數(shù)是互斥的藻肄,不能同時執(zhí)行
另外關于 TTL節(jié)點
的使用,需要特別注意的是拒担,如果使用默認的配置文件啟動zk嘹屯,想創(chuàng)建有存活時間的節(jié)點,比如執(zhí)行 create -t 10 /test 是會報KeeperErrorCode = Unimplemented for XXX
這樣的錯誤从撼。解決辦法是需要在ZK啟動前州弟,先在配置文件加上extendedTypesEnabled=true
然后重啟ZK(集群部署的話,所有ZK都需要修改配置文件再重啟)
配置后重啟低零,執(zhí)行 create -t 10 /test 這樣的命令就不會報錯啦
查找節(jié)點:get
get [-s] [-w] path
-s:查看節(jié)點狀態(tài)(其效果和stat命令一樣)
-w:監(jiān)聽子節(jié)點變化
例子:get -s /demo
修改節(jié)點:set
set [-s] [-v version] path data
-s:查看節(jié)點狀態(tài)(其效果和stat命令一樣)
-v version:當前更新操作的版本號婆翔;用于樂觀鎖,每次更新都根據(jù) version 判斷版本
例子:先查詢節(jié)點版本號掏婶,模擬并發(fā)下修改同一節(jié)點
get -s /demo 可知當前 dataVersion = 1
客戶端1:set -v 1 /demo demo-data1
客戶端2:set -v 1 /demo demo-data2
客戶端1比客戶端2先執(zhí)行啃奴,客戶端2再執(zhí)行的話,這時顯示報錯
刪除節(jié)點:delete
delete [-v version] path
-v version:和 set 命令相似雄妥,-v 參數(shù)用于判斷當前操作的版本
例子:先創(chuàng)建一個delNode節(jié)點最蕾,然后刪除
增刪改查節(jié)點權限:getAcl、setAcl
在前面使用create命令的時候老厌,有一個acl參數(shù)是設置節(jié)點權限的瘟则,那么我們應該怎么設置?
舉個例子:create /testAcl demo world:anyone:crwda
這行命令的意思是枝秤,創(chuàng)建 testAcl 這個節(jié)點醋拧,節(jié)點值為demo,其權限策略是所有人都可以執(zhí)行 crwda 操作淀弹。那么接下來丹壕,咱們先看下 ACL 是什么東東?
ACL 全稱是Access Control List
垦页,也就是訪問控制列表雀费,ACL可以設置節(jié)點的操作權限。那么控制權限的粒度是怎樣呢痊焊?
對于節(jié)點 ACL 權限控制盏袄,是通過使用:scheme:id:perm
來標識(也就是例子中的格式 -> world:anyone:crwda),其含義是:
- 權限模式(Scheme):授權的策略
- 授權對象(ID):授權的對象
- 權限(Permission):授予的權限
Scheme 有哪些授權策略薄啥?
world:默認方式辕羽,相當于所有人都能訪問
auth:授權的用戶才能訪問
digest:賬號密碼都正確鑒權的用戶才能訪問
ip:指定某ip的才能訪問
ID 授權對象有哪些?
IP:具體的 IP 地址或 IP 段
World:只有“anyOne”這一個Id
Digest:自定義垄惧,格式為username:BASE64(SHA-1(username:password))
Permission 權限有哪些刁愿?
CREATE: c 可以創(chuàng)建子節(jié)點
DELETE: d 可以刪除子節(jié)點(僅下一級節(jié)點)
READ: r 可以讀取節(jié)點數(shù)據(jù)及顯示子節(jié)點列表
WRITE: w 可以設置節(jié)點數(shù)據(jù)
ADMIN: a 可以設置節(jié)點訪問控制列表權限
根據(jù)上面的參數(shù)可知,我們可以通過給所有人到逊、特定的賬號密碼铣口、特定的 ip 設置節(jié)點權限滤钱,這樣能夠更加方面地管理節(jié)點的訪問。
值得注意的是脑题,節(jié)點可以設置多種授權策略件缸,但對于上下節(jié)點而言,權限的設置只對當前節(jié)點有效叔遂。換言之他炊,權限不存在繼承關系,即使節(jié)點被設置權限已艰,但不會影響上下節(jié)點原來的權限痊末!
上面執(zhí)行了 create /testAcl demo world:anyone:crwda 命令給節(jié)點設置權限,那怎么看節(jié)點的權限咧哩掺?
很簡單凿叠,執(zhí)行getAcl 節(jié)點路徑
就可以查看對應節(jié)點的權限,比如 getAcl /testAcl疮丛,執(zhí)行結果如下
[zk: localhost:2181(CONNECTED) 25] getAcl /testAcl
'world,'anyone
: cdrwa
除了在執(zhí)行create命令創(chuàng)建節(jié)點的時候設置權限幔嫂,還可以通過setAcl
指定節(jié)點設置權限,比如我想指定/testAcl這個節(jié)點只可以通過特定 IP操作誊薄,并且限制執(zhí)行權限為crdw履恩,那么可以執(zhí)行 setAcl /testAcl ip:127.0.0.1:crwd
,再次執(zhí)行 getAcl /testAcl 結果如下:
[zk: localhost:2181(CONNECTED) 27] getAcl /testAcl
'ip,'127.0.0.1
: cdrw
ZK 的命令還有部分沒有演示呢蔫,這并不阻礙咱們學習ZK的原理切心,先掌握常見的命令,如果日后有其他場景的話片吊,再根據(jù)特定的命令學習就可以啦绽昏。
【小彩蛋】下載Zookeeper可視化客戶端
無意中發(fā)現(xiàn)有 Zookeeper的客戶端,感興趣的讀者可以玩一下~ 友情提醒俏脊,可能在節(jié)點數(shù)量很多的時候全谤,打開很慢,甚至卡死爷贫,所以這個可視化工具可以在自己本地玩玩认然,不建議應用在生產(chǎn)上哈。這也側面的說明漫萄,學會 ZK 命令的重要性(認真臉.jpg)
下載鏈接:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
解壓縮后卷员,進入ZooInspector的build目錄,執(zhí)行 java -jar zookeeper-dev-ZooInspector.jar
就可以啟動工具腾务。
連接上 ZK 后毕骡,就可以看到節(jié)點的信息和節(jié)點的ACL,具體玩法,可以再自己摸索哈~
好了未巫,以上是 ZK 常見命令的基本使用和可視化工具的基本使用窿撬。
參考資料:
《從Paxos到Zookeeper分布式一致性原理與實踐》
如果覺得文章不錯的話,麻煩點個贊哈橱赠,你的鼓勵就是我的動力尤仍!對于文章有哪里不清楚或者有誤的地方,歡迎在評論區(qū)留言~