一、啟動/連接/退出/關閉/狀態
1、啟動 Zookeeper 服務器后台
./zkServer.sh start
2、連接客戶端
./zkCli.sh
3、退出客戶端
quit
4、關閉 Zookeeper 后台服務
./zkServer.sh stop
5、查看 Zookeeper 后台服務的狀態
// 我這里沒有做集群,所以顯示的模式是 standalone ,如果是集群,顯示的就是 leader
./zkServer.sh status
二、查看后台是否正常啟動
1、Linux 命令查看
ps -ef | grep zookeeper | grep -v grep
2、Zookeeper 四字命令查看
// 默認端口號是 2181,如果顯示沒有 nc 命令,使用 yum install nc 來進行安裝
echo ruok | nc Linux ip地址 zookeeper端口號
如果顯示如下則代表 zookeeper 后台成功啟動
三、Zookeeper 客戶端常用命令
登錄 zookeeper 客戶端,使用 help 命令來查看 zookeepr 的客戶端命令
1、ls path [watch] : 查看zookeeper節點,默認情況下只存在一個zookeeper節點
2、create [-s] [-e] path data acl: 創建節點, data 代表數據, acl 代表權限控制
-s:順序節點,順序是累加的,由 zookeeper 提供
-e:臨時節點,服務器斷開,然后重新連接服務器之后該節點會消失
// 查看根節點下面的子節點
[zk: localhost:2181(CONNECTED) 20] ls /
[zookeeper]
// 在根節點下創建臨時節點 znode01
[zk: localhost:2181(CONNECTED) 21] create -e /znode01 001
Created /znode01
// 在根節點下創建臨時的順序節點 znode02(順序是累加的)
[zk: localhost:2181(CONNECTED) 22] create -e -s /znode02 002
// 在根節點下創建永久節點 znode03
Created /znode020000000005
[zk: localhost:2181(CONNECTED) 23] create /znode03 003
Created /znode03
// 在根節點下創建永久的順序節點
[zk: localhost:2181(CONNECTED) 24] create -s /znode04 004
Created /znode040000000007
斷開 zookeeper 后台服務之后,再次連接,可以看到根節點下的臨時節點 znode01、znode02 已經消失了,但是由於 znode03、znode04 是持久節點,所以還繼續存在
3、get path [watch] :獲取節點的值
// 獲取根節點(/)下面的所有子節點
[zk: localhost:2181(CONNECTED) 3] ls /
// 根節點下有三個子節點 zookeeper(zookeeper 默認自帶的節點)、znode03、znode040000000007
[znode040000000007, zookeeper, znode03]
// 獲取節點 /znode03 的值
[zk: localhost:2181(CONNECTED) 4] get /znode03
// /znode03 節點的值
003
//========================下面這些是狀態體(stat)========================
// 創建節點的事務 id
cZxid = 0x16
// 創建節點的時間
ctime = Wed Sep 30 19:05:02 CST 2020
// 修改節點的 id
mZxid = 0x16
// 修改的時間
mtime = Wed Sep 30 19:05:02 CST 2020
// 父節點的 id
pZxid = 0x16
// 創建的版本
cversion = 0
// 數據的版本
dataVersion = 0
// 權限的版本
aclVersion = 0
// 是否是臨時節點
ephemeralOwner = 0x0
// 數據的長度
dataLength = 3
// 子節點的個數
numChildren = 0
4、stat path [watch]:獲取節點的狀態體
5、ls2 path [watch]
ls2 等價於 ls+stat ,ls 只會顯示出該節點下的子節點,並不會顯示出該節點的狀態體,但是 ls2 不僅僅顯示出該節點的子節點,還會顯示出該節點的狀態體信息.
6、set path data [version]:修改節點的值
[zk: localhost:2181(CONNECTED) 17] get /znode03
// 初始值為 003
003
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x16
mtime = Wed Sep 30 19:05:02 CST 2020
pZxid = 0x16
cversion = 0
// 數據版本 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
// 修改 /znode03 節點數據
[zk: localhost:2181(CONNECTED) 18] set /znode03 10086
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1c
mtime = Wed Sep 30 22:06:02 CST 2020
pZxid = 0x16
cversion = 0
// 數據版本號變成了 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 獲取當前版本的 /znode03 節點數據
[zk: localhost:2181(CONNECTED) 19] get /znode03
// 發現數據已經修改成了10086
10086
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1c
mtime = Wed Sep 30 22:06:02 CST 2020
pZxid = 0x16
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 根據版本號來修改值
[zk: localhost:2181(CONNECTED) 20] set /znode03 10001 1
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1d
mtime = Wed Sep 30 22:08:11 CST 2020
pZxid = 0x16
cversion = 0
// 修改完成后,數據版本變成了 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 獲取當前版本 /znode03 節點的數據
[zk: localhost:2181(CONNECTED) 21] get /znode03
// 數據變成了 10001
10001
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1d
mtime = Wed Sep 30 22:08:11 CST 2020
pZxid = 0x16
cversion = 0
// 此時數據版本已經變成了 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 繼續按照數據版本修改值
[zk: localhost:2181(CONNECTED) 22] set /znode03 13579 1
// 類似於樂觀鎖,因為當前版本已經是 2 了,如果繼續按照版本為 1 來修改值,提示節點的版本無效
version No is not valid : /znode03
7、刪除節點,zookeeper中有兩種刪除的方式
delete path [version]:類似於 Linux 中刪除某一個文件
rmr path:類似於遞歸刪除文件夾
// 顯示根節點下的所有子節點
[zk: localhost:2181(CONNECTED) 24] ls /
[znode040000000007, zookeeper, znode03]
// 刪除 /znode03 節點
[zk: localhost:2181(CONNECTED) 25] delete /znode03
// 刪除 /znode040000000007 節點
[zk: localhost:2181(CONNECTED) 26] delete /znode040000000007
// 可以看出 znode03、znode040000000007 節點已經刪除了
[zk: localhost:2181(CONNECTED) 27] ls /
[zookeeper]
// 創建 /testNode 節點
[zk: localhost:2181(CONNECTED) 31] create /testNode testNode
Created /testNode
[zk: localhost:2181(CONNECTED) 32] ls /
[zookeeper, testNode]
// 創建 /testNode/node1、/testNode/node2、/testNode/node3 節點
[zk: localhost:2181(CONNECTED) 33] create /testNode/node1 001
Created /testNode/node1
[zk: localhost:2181(CONNECTED) 34] create /testNode/node2 002
Created /testNode/node2
[zk: localhost:2181(CONNECTED) 35] create /testNode/node3 003
Created /testNode/node3
[zk: localhost:2181(CONNECTED) 36] ls /testNode
[node2, node3, node1]
// 刪除父節點 /testNode
[zk: localhost:2181(CONNECTED) 37] rmr /testNode
// 父節點 /testNode 已經刪除了
[zk: localhost:2181(CONNECTED) 38] ls /
四、ACL權限控制
Zookeeper 的節點有 5 種操作權限,分別是 CREATE、DELETE、READ、WRITE、ADMIN,也就是分別對應的是增、刪、查、改、管理;這 5 種權限的縮寫是 cdrwa (即每個單詞的首字母縮寫)
注:這 5 種權限種, DELETE 是對子節點的刪除權限,其它 4 種權限是指對自身節點的操作權限.
身份的認證有4種方式:
world:默認方式,代表任何人都可以訪問
auth:代表已經認證通過的用戶( cli 中可以通過 addauth digest user:pwd 來添加當前上下文中的授權用戶)
digest:即用戶名:密碼這種方式認證,這也是業務系統中最常用的
ip:使用 Ip 地址認證
使用[scheme:id:permissions]來表示acl權限
1、getAcl path:獲取某一個節點的 Acl 權限信息
// 顯示根路徑下的所有子節點
[zk: localhost:2181(CONNECTED) 10] ls /
[zookeeper, testNode]
// 獲取節點 /testNode 的 acl 權限
[zk: localhost:2181(CONNECTED) 11] getAcl /testNode
// 身份認證類型為 world,就是代表任何人都能訪問
'world,'anyone
// 擁有的權限包括 CREATE、DELETE、READ、WRITE、ADMIN
: cdrwa
2、setAcl path:設置某一個節點的 Acl 權限
// 查看根節點下的子節點
[zk: localhost:2181(CONNECTED) 10] ls /
[zookeeper, testNode]
// 獲取節點 /testNode 的 acl 權限信息
[zk: localhost:2181(CONNECTED) 11] getAcl /testNode
// 默認的權限:任何人都可以進行 cdrwa 操作
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 12] ls /
[zookeeper, testNode]
[zk: localhost:2181(CONNECTED) 13] ls /testNode
[]
// 在節點 /testNode 下創建兩個子節點 node1 node2
[zk: localhost:2181(CONNECTED) 14] create /testNode/node1 001
Created /testNode/node1
[zk: localhost:2181(CONNECTED) 15] create /testNode/node2 002
Created /testNode/node2
[zk: localhost:2181(CONNECTED) 16] ls /
[zookeeper, testNode]
[zk: localhost:2181(CONNECTED) 17] ls /testNode
[node2, node1]
// 設置節點 /testNode 的 acl 權限為 crwa,沒有 DELETE,也就是不能刪除子節點
[zk: localhost:2181(CONNECTED) 18] setAcl /testNode world:anyone:crwa
cZxid = 0x2b
ctime = Thu Oct 01 00:23:31 CST 2020
mZxid = 0x2b
mtime = Thu Oct 01 00:23:31 CST 2020
pZxid = 0x2e
cversion = 2
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2
// 獲取節點 /testNode 的 acl 權限信息,可以看到為 crwa,沒有 DELETE
[zk: localhost:2181(CONNECTED) 19] getAcl /testNode
'world,'anyone
: crwa
// 刪除 /testNode 的子節點 node1 提示無效(因為 /testNode 的權限為 crwa ,沒有 DELETE ,也就是不能刪除子節點
[zk: localhost:2181(CONNECTED) 20] delete /testNode/node1
Authentication is not valid : /testNode/node1
// 將 /testNode 節點的權限改為 cdrw
[zk: localhost:2181(CONNECTED) 21] setAcl /testNode world:anyone:cdrw
cZxid = 0x2b
ctime = Thu Oct 01 00:23:31 CST 2020
mZxid = 0x2b
mtime = Thu Oct 01 00:23:31 CST 2020
pZxid = 0x2e
cversion = 2
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2
[zk: localhost:2181(CONNECTED) 22] getAcl /testNode
'world,'anyone
: cdrw
// 刪除 /testNode 的子節點 node1
[zk: localhost:2181(CONNECTED) 23] delete /testNode/node1
// 查看 /testNode 節點下的所有子節點,可以看到子節點 node1 已經被刪除了
[zk: localhost:2181(CONNECTED) 24] ls /testNode
[node2]
五、Zookeeper 四字命令
啟動了 Zookeeper 后台服務之后,可以通過 Zookeeper 的四字命令查看 Zookeeper 的相關信息
stat 查看狀態信息
ruok 查看 zookeeper 是否啟動
dump 列出沒有處理的節點,臨時節點
conf 查看服務器配置
cons 顯示連接到服務端的信息
envi 顯示環境變量信息
mntr 查看 zk 的健康信息
wchs 展示 watch 的信息
wchc 和 wchp 分別顯示 session 的 watch 信息、 path 的 watch 信息
轉載自:https://blog.csdn.net/dandandeshangni/article/details/80558383