上一篇介紹Zookeeper的安裝,並介紹了使用ZooInspector連接Zookeeper,這里主要介紹以命令行的形式介紹Zookeeper
假如我們已經安裝了Zookeeper集群,集群中的安裝目錄都是/opt/zookeeper-3.4.14,集群地址:
# 192.168.209.133 test1
# 192.168.209.134 test2 # 192.168.209.135 test3
端口都是默認的,客戶端連接使用2182端口,節點間通信端口是2888,選舉端口是3888
zkCli
介紹Zookeeper安裝的時候,使用zkServer去啟動Zookeeper,而啟動了,我們是采用zkCli去連接Zookeeper,我們進入Zookeeper安裝的根目錄,我這里是/opt/zookeeper-3.4.14,輸入:
# zkCli.sh -server host:port # 指定連接節點,默認host=localhost,port=2181,如:zkCli.sh -server test2:2181,表示連接test2節點
./bin/zkCli.sh
可以看到已連接Zookeeper,默認連接本地的(localhost:2181)
直接輸入help命令
使用zkCli連接上Zookeeper后,就可以在zk的命令行進行操作了。整理一下,可分成4個部分來說明。
znode節點操作
znode是Zookeeper的數據節點,znode之間是類似於目錄樹的結構關系,對Zookeeper的操作一般都是對znode的操作,而對znode節點操作就是一般的crud操作
# znode節點操作部分 create [-s] [-e] path data acl # 創建一個znode節點,同時設置節點權限acl,-s表示創建有序節點,-e創建臨時節點,如創建一個/mynode節點:create /mynode hello,另外znode需要按照層級去創建,如創建/node1/node2,需要縣創建/node1再創建/node1/node2 stat path [watch] # 查看znode狀態,如數據長度,時間戳等等,同時可以注冊一個監聽器 get path [watch] # 獲取znode節點的數據,同時可以注冊一個監聽器,如:get /mynode set path data [version] # 設置znode的數據,同時可以設置一個監聽器,如:set /mynode "hello world" ls path [watch] #列出znode的子節點,同時可以設置一個監聽器,如:ls / ls2 path [watch] #列出znode的子節點,同時可以設置一個監聽器,如:ls2 /,與ls的區別是ls2還可以獲取到子節點個數等等狀態信息 delete path [version] #刪除znode節點,注意路徑為絕對路徑,且不可刪除擁有子節點的znode rmr path #遞歸刪除znode節點,與delete的區別是可以刪除擁有子節點的znode
quota配額操作
quota配額機制就是對znode做一些限制,支持節點個數和空間大小(字節數)兩種方式,不過貌似quota配額並不會阻止操作的進行,而只是拋出警告
# quota配額 setquota -n|-b val path #增加配額,-n是設置子節點的配額數量,-b是設置節點內容的長度 listquota path #列出節點配額信息 delquota [-n|-b] path #刪除節點配額
ACL權限控制
當使用zkCli連接Zookeeper時,就是和Zookeeper集群開啟了一次會話,而acl操作就是對會話權限進行控制的操作
#ACL權限控制 setAcl path acl #給已有節點賦予權限,其中acl是權限
getAcl path #查看節點的權限
# 在上面的創建節點操作中,我們也可以給節點賦予權限,如:
Zookeeper的acl
權限由[scheme : id :permissions]三部分組成,其中scheme是認證類型,id一般指的是賬號,也就是權限所針對的對象,permissions表示對節點的空權限類型,而scheme和permissions有以下可選項:
Permissions可選項,在使用時,可以使用首字母進行簡寫(crwda): CREATE:允許創建子節點; READ:允許從節點獲取數據並列出其子節點; WRITE:允許為節點設置數據; DELETE:允許刪除子節點; ADMIN:允許為節點設置權限。
Scheme可選項:
world:默認模式,所有客戶端都擁有指定的權限。world下只有一個id選項,就是anyone,通常組合寫法為world:anyone:[permissons];比如:setAcl /mynode world:anyone:crwda
auth:只有經過認證的用戶才擁有指定的權限。通常組合寫法為auth:user:password:[permissons],使用這種模式時,你需要先進行登錄,之后采用auth模式設置權限時,user和password都將使用登錄的用戶名和密碼;比如:setAcl /mynode auth:feng:123456:crwda
digest:只有經過認證的用戶才擁有指定的權限。通常組合寫法為digest
:user:BASE64(SHA1(password)):[permissons],這種形式下的密碼必須通過SHA1和BASE64進行雙重加密;比如:setAcl /mynode digest:feng:xHBaNtDKjaz0G0F0dq11735c9r8=:crwda
ip:限制只有特定IP的客戶端才擁有指定的權限。通常組成寫法為ip:182.168.0.168:[permissions];比如:setAcl /mynode ip:192.168.28.213:crwda
super:代表超級管理員,擁有所有的權限,需要修改Zookeeper啟動腳本進行配置。
# auth模式和digest模式其實是一樣的,區別可以理解為,auth模式使用的是明文密碼,而digest使用的是密文密碼(SHA1和BASE64),比如下面兩種方式是等價的
setAcl /mynode auth:feng:123456:crwda
setAcl /mynode digest:feng:xHBaNtDKjaz0G0F0dq11735c9r8=:crwda
#這里說的等級是在使用setAcl命令為znode添加權限控制時,並非在使用addauth添加認證時
一般的,權限是給znode節點設置的,當使用zkCli連接到Zookeeper開啟一個會話時,默認情況下是world認證模式,該模式下只能操作那些world認證模式權限的znode節點,要訪問某個特定模式下的節點,就需要滿足節點上設置的認證模式。
super模式用的少,一般可以忽略,ip模式即指定客戶端,比如:
setAcl /mynode ip:192.168.209.134:crwda
這個表示當我們從192.168.209.134訪問時才能訪問到/mynode節點,否則會提示Authentication is not valid
然后我們到192.168.209.134上使用zkCli連接Zookeeper,發現成功訪問到/mynode節點
對於auth模式和digest模式,就需要修改當前會話的認證模式,修改認證模式使用addauth命令:
addauth scheme auth #scheme是認證模式(貌似只能是digest),auth是認證信息,格式:user:password
例如: addauth digest feng:123456 #添加auth模式,后面攜帶的參數是user:password模式
#如果要退出認證,只需要使用close關閉連接,再使用connect重新連接就好了
簡單解釋一下acl權限的auth模式(digest模式)設置過程,假如我們開啟一個新的會話,我們有一個/mynode節點:
可以看到,/mynode節點默認模式是world:anyone:cdrwa,然后我們修改它的權限:
從上面可以看到,只有feng:123456這個用戶可以讀(r),還可以管理權限(a),其他認證都不能操作數據節點,
注意,當我們需要修改znode節點的acl時,需要確認我們當前會話已使用addauth命令添加了認證信息,否則會提示設置acl權限失敗(所以上圖第一行命令addauth就是添加認證信息)
接着,我們使用close命令關閉連接,使用connect命令重新連接,這時會話就變成了無認證狀態,使用get獲取/mynode節點數據時就會提示認證錯誤:
接着我們添加認證信息,然后再使用get命令就可能獲取到數據了
總結:acl權限控制可以理解為,在創建znode節點時或者使用setAcl命令為已存在的znode添加Scheme模式(world,auth,digest,ip,super)和權限(crdwa),Scheme模式作為匹配條件,當客戶端連接Zookeeper的會話滿足Scheme模式的條件,就會具有此znode節點上設置的權限
其他命令操作
history #查看當前會話中使用過的命令,每個命令會攜帶一個編號 redo cmdno #重新執行命令,cmdno是命令編號,可以使用history查看 printwatches [on|off] #是否輸出 watch 事件,如果使用on或者off則表示設置
sync path #會強制客戶端所連接的服務器狀態與leader的狀態同步,這樣在讀取 path 的值就是最新的值了
quit #直接退出當前的zkCli命令行
close #關閉連接,但不會退出當前zkCli命令行
connect host:port #打開連接