在上一篇博客中,簡單的介紹了zookeeper的原理,概念和經常使用的場景。zookeeper是分佈式系統應用,大數據雲計算平臺中至關關鍵的服務,應用很是普遍,所以掌握經常使用的使用命令是有必要的。本片博客簡單的介紹了zkCli的使用,因爲zookeeper相似文件系統的特性,所以,zkCli的操做也相似文件系統中的經常使用操做: 增刪改查、資源管理、權限控制等等。本文就是從這些方面進行介紹。node
創建會話鏈接
zkCli.sh -timeout 0 -r -server ip:port
1
-timeout:指定當前會話的超時時間。zookeeper依靠與客戶端之間的心跳判斷一個會話是否有效,timeout指服務器若是在timeout指定的時間內沒有收到客戶端的心跳包,就認爲這個客戶端失效。單位毫秒。
-r:read-only。zookeeper的只讀模式指zookeeper的服務器若是和集羣中半數或半數以上的服務器失去鏈接之後,該服務器就不在處理客戶端的請求了,但有時候任然但願這種故障發生時,機器能夠向外提供讀服務,這種狀況下就可使用只讀模式。
-server: 表示想要鏈接的服務器地址和端口。服務器
zkClient經常使用命令
使用以下命令進入client交互界面分佈式
zkCli.sh -timeout 5000 -r -server master:2181
1
進入界面後開始使用zkClient,按h zkClient的使用幫助:大數據
[zk: slave2:2181(CONNECTED) 26] h
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
可知,zkClient經常使用的操做和文件系統大體相同,主要包括查看、新增、修改、刪除、配額、權限控制等,下面咱們分別從這幾個方面進行說明。ui
查
zkClient的查詢值得是查詢節點的數據和節點的狀態。主要有使用stat列出節點的狀態;使用get得到節點的數據;使用ls列出節點的子節點列表;使用ls2同時列出子節點的列表和節點的狀態;雲計算
stat
獲取節點的狀態,使用方法:stat path.net
[zk: slave2:2181(CONNECTED) 3] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
在zookeeper中,每一次對數據節點的寫操做(如建立一個節點)被認爲是一次事務,對於每個事務系統都會分配一個惟一的id來標識這個事務,cZxid就表示事務id,表示該節點是在哪一個事務中建立的;
ctime:表示節點建立的時間;
mZxid:最後一次更新時的事務id;
mtime:最後一次更新時的時間;
pZxid: 表示該節點的子節點列表最後一次被修改的事務的id(爲當前節點添加子節點,從當前節點的子節點中刪除一個或多個子節點都會引發節點的子節點的列表的改變,而修改節點的數據內容則不在此列);
cversion = -1,dataVersion = 0,aclVersion = 0在第一篇博客中已經有過介紹,分別表示子節點列表的版本,數據內容的版本,acl版本;
ephemeralOwner:用於臨時節點,表示建立該臨時節點的事務id,若是當前節點是永久節點,這個值是固定的,爲0;
datalength表示當前節點存放的數據的長度;
numChildren表示當前節點擁有的子節點的個數;日誌
ls
獲取節點的子節點列表,使用方法:ls pathserver
[zk: slave2:2181(CONNECTED) 24] ls /
[node2, zookeeper, node1]
1
2
3
get
獲取節點的數據,其結果是當前節點的值和stat該路徑的值放在一塊兒。使用方法:get pathblog
[zk: slave2:2181(CONNECTED) 25] get /node1
4545
cZxid = 0x300000012
ctime = Sat Apr 08 09:15:54 CST 2017
mZxid = 0x300000015
mtime = Sat Apr 08 09:20:07 CST 2017
pZxid = 0x300000016
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ls2
獲取節點的子節點列表以及stat該路徑:ls2 path
[zk: slave2:2181(CONNECTED) 30] ls2 /node1
[dfd]
cZxid = 0x300000012
ctime = Sat Apr 08 09:15:54 CST 2017
mZxid = 0x300000015
mtime = Sat Apr 08 09:20:07 CST 2017
pZxid = 0x300000016
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
增
zkClient的增長只有一個命令,那就是建立新的節點。使用方法:
create [-s] [-e] path data acl
-s表示建立順序節點
-e表示建立臨時節點
acl表示建立的節點路徑
data表示建立的節點的數據內容
建立一個普通的節點
[zk: slave2:2181(CONNECTED) 35] create /node1 1222
Created /node1
[zk: slave2:2181(CONNECTED) 36] ls2 /node1
[]
cZxid = 0x30000001a
ctime = Sat Apr 08 09:32:53 CST 2017
mZxid = 0x30000001a
mtime = Sat Apr 08 09:32:53 CST 2017
pZxid = 0x30000001a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
建立一個臨時節點
[zk: slave2:2181(CONNECTED) 1] create -e /node 122
[zk: slave2:2181(CONNECTED) 3] ls2 /
[node, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000020
cversion = 14
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
退出當前會話,再次運行ls命令查看,結果以下:
[zk: slave2:2181(CONNECTED) 0] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000021
cversion = 15
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: slave2:2181(CO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
發現建立的臨時節點node消失了,正如上一篇博客中所提到的那樣,zookeeper的臨時節點在客戶端失聯後會自動被刪除。
建立一個順序節點
[zk: slave2:2181(CONNECTED) 1] create -s /node1 123
Created /node10000000008
1
2
3
發現建立的順序節點的名稱和咱們起的名字不太同樣,後面加了字串,再次運行上述命令:
[zk: slave2:2181(CONNECTED) 2] create -s /node1 123
Created /node10000000009
[zk: slave2:2181(CONNECTED) 6] ls /
[node10000000008, zookeeper, node10000000009]
1
2
3
4
5
發現新增了一個節點,且節點的名稱進行自增了。利用zk的順序節點的性質,能夠製做分佈式的主鍵生成器。完成命名服務。
改
zkClien提供了一個修改命令:set path data [version]
修改一個普通節點的數據內容:
[zk: slave1:2181(CONNECTED) 6] get /node1
123
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000002
mtime = Sat Apr 08 17:20:33 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: slave1:2181(CONNECTED) 7] set /node1 12344
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000003
mtime = Sat Apr 08 17:21:07 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
修改數據內容的同時,注意dataversion變了,mZxid和mtime也變了增長了。無論每次修改的值是否和以前同樣,其dataversion都會加1
修改的同時,加入dataversion校驗:
[zk: slave1:2181(CONNECTED) 8] set /node1 12331 2
version No is not valid : /node1
[zk: slave1:2181(CONNECTED) 9] set /node1 12331 1
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000005
mtime = Sat Apr 08 17:23:57 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
可知,增長了version校驗以後,那麼version就必須和修改以前的dataversion相同,不然拋出異常。
刪
刪除節點
delete path [version]
1
[zk: slave1:2181(CONNECTED) 17] stat /node1
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000005
mtime = Sat Apr 08 17:23:57 CST 2017
pZxid = 0x400000008
cversion = 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: slave1:2181(CONNECTED) 18] delete /node1 1
version No is not valid : /node1
[zk: slave1:2181(CONNECTED) 19] delete /node1 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version和修改時的version意義是同樣的,也是用於校驗。
注意這個命令中的node必須是沒有子節點的,不然拋出異常:
[zk: slave1:2181(CONNECTED) 23] ls /node1
[node11]
[zk: slave1:2181(CONNECTED) 24] delete /node1
Node not empty: /node1
1
2
3
4
5
那麼如何刪除含有子節點的節點呢? zookeeper提供了另一個命令:rmr path
[zk: slave1:2181(CONNECTED) 26] ls /node1
[node11]
[zk: slave1:2181(CONNECTED) 27] rmr /node1
[zk: slave1:2181(CONNECTED) 28] ls /node1
Node does not exist: /node1
1
2
3
4
5
6
配額
設置配額
zookeeper提供相似文件系統的配額功能,不一樣的是zk的配額用於限制節點的數據內容和子節點的個數:setquota -n|-b val path
-n表示限制子節點的個數 val表示個數 path表示想要進行設置的那個node;下面的例子是對/test這個節點的子節點個數進行限制,最多爲3個子節點
1
[zk: slave1:2181(CONNECTED) 36] setquota -n 3 /test
Comment: the parts are option -n val 3 path /test
1
2
3
那麼進行了配額限制以後,再添加子節點試試
[zk: slave1:2181(CONNECTED) 41] create /test/node1 123452
Created /test/node1
[zk: slave1:2181(CONNECTED) 42] create /test/node2 123452
Created /test/node2
[zk: slave1:2181(CONNECTED) 43] create /test/node3 123452
Created /test/node3
[zk: slave1:2181(CONNECTED) 44] create /test/node4 123452
Created /test/node4
1
2
3
4
5
6
7
8
9
爲何還能夠繼續添加呢?你們可能感到奇怪,明明設置的配額中子節點的數目爲3,可是咱們在/node1建立了多於3的節點,爲何不抱錯?實際上配額超限了以後,zookeeper只會在日誌中進行警告記錄,而不會拋出異常 。日誌記錄以下:
2017-04-08 17:44:39,427 [myid:1] - WARN [CommitProcessor:1:DataTree@
301] - Quota exceeded: /test count=9 limit=3
1
2
上述日誌表示:超出了配額的限制,咱們對節點限制了只能有3個子節點,可是如今有8個子節點
-b表示限制數據值的長度 val表示長度 path表示想要進行設置的那個node; 下面的例子是對node進行數據長度的配額限制
1
[zk: slave1:2181(CONNECTED) 15] setquota -b 4 /node2
Comment: the parts are option -b val 4 path /node2
1
2
3
修改節點的數據長度,使之超出配額,看看會發什麼狀況:
[zk: slave1:2181(CONNECTED) 16] set /node2 1234567
cZxid = 0x400000028
ctime = Sat Apr 08 17:52:38 CST 2017
mZxid = 0x40000002c
mtime = Sat Apr 08 17:53:20 CST 2017
pZxid = 0x400000028
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
同-n限額同樣,並無報錯,只是在日誌中作了相應的記錄:
2017-04-08 17:53:20,889 [myid:1] - WARN [CommitProcessor:1:DataTree@
347] - Quota exceeded: /node2 bytes=7 limit=4
1
2
上述日誌表示:超出了配額的限制,咱們對節點限制了數據長度爲4,可是如今數據長度爲7。
查看配額
[zk: slave1:2181(CONNECTED) 25] listquota /node2
absolute path is /zookeeper/quota/node2/zookeeper_limits
Output quota for /node2 count=-1,bytes=-1
Output stat for /node2 count=1,bytes=7
1
2
3
4
5
第一行表示,對子節點數目沒有限制,對數據的長度沒有限制
第二行表示,子節點數目和/node2一共有1個,數據長度爲7,數據長度爲本身的長度加上全部的子節點的數據長度
刪除配額 [zk: slave1:2181(CONNECTED) 30] delquota -n /node2 [zk: slave1:2181(CONNECTED) 31] delquota -b /node2 1 2 3 歷史記錄的查看和從新執行 [zk: slave1:2181(CONNECTED) 33] history 23 - delquota -b /node2 24 - setquota -n 3 /node2 25 - listquota /node2 26 - ls /node2 27 - get /node2 28 - create /node2/dfd 3434 29 - listquota /node2 30 - delquota -n /node2 31 - delquota -b /node2 32 - h 33 - history [zk: slave1:2181(CONNECTED) 34] redo 26 [dfd] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 打開新的鏈接和關閉 connect slave1:2181 close 1 2 最後 另外還有一個重要的客戶端命令,那就是對節點的ACL進行設置,因爲ACL的重要性,咱們將在下一篇進行說明和聯繫。