zookeeper cli 常用命令解析

zookeeper CLI

1,查看所有命令

啓動zookeeper並使用bin目錄下的zkCli.sh連接zookeeper服務器,輸入任何zookeeper不能識別的命令,zookeeper都會列出所有可供使用的命令:

[zk: 127.0.0.1:2184(CONNECTED) 105] k
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

2,命令解析

創建節點:
create [-s] [-e] path data acl

-s 有序節點

一個znode還可以設置爲有序(sequential)節點。一個有序znode節點被分配唯一個單調遞增的整數。當創建有序節點時,一個序號會被追加到路徑之後。

-e 臨時節點

znode節點可以是持久(persistent)節點,還可以是臨時(ephemeral)節點。持久的znode只能通過調用delete來進行刪除。臨時的znode與之相反,當創建該節點的客戶端崩潰或關閉了與ZooKeeper的連接時,這個節點就會被刪除。因爲臨時的znode在其創建者的會話過期時被刪除,所以我們現在不允許臨時節點擁有子節點。

總之,znode一共有4種類型:持久的(persistent)、臨時的(ephemeral)、持久有序的(persistent_sequential)和臨時有序的(ephemeral_sequential)。

data 節點保存的數據

acl 權限相關內容,暫不考慮

創建一個持久節點

[zk: 127.0.0.1:2184(CONNECTED) 7] create /test testdata
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 8] ls /
[zookeeper, test]

創建一個臨時節點

[zk: 127.0.0.1:2184(CONNECTED) 9] create -e /testephemeral testdata2
Created /testephemeral
[zk: 127.0.0.1:2184(CONNECTED) 11] ls /
[zookeeper, test, testephemeral]

ctrl+c斷開與服務端連接在查看

WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[zookeeper, test]

臨時節點已經被移除了

創建有序節點

[zk: 127.0.0.1:2184(CONNECTED) 4] create -s /testsquence testdata2
Created /testsquence0000000008
[zk: 127.0.0.1:2184(CONNECTED) 5] ls /
[testsquence0000000008, zookeeper, test]

它會自動在我們指定的path後面追加一個序列號。

節點狀態
stat path [watch]

watch 添加監視器,後面再說

列出節點/test的狀態

[zk: 127.0.0.1:2184(CONNECTED) 10] stat /test             
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

屬性說明

狀態屬性 說明
cZxid 節點創建的事務zxid。每次修改ZooKeeper狀態都會收到一個zxid形式的時間戳,也就是ZooKeeper事務ID。事務ID是ZooKeeper中所有修改總的次序。每個修改都有唯一的zxid,如果zxid1小於zxid2,那麼zxid1在zxid2之前發生。
ctime znode的創建時間
mzxid znode最後修改的zxid
mtime znode最後修改時間
pZxid znode最後更新的子節點zxid
cversion znode子節點變化號,每變化一次就自增1
dataversion znode數據變化號,數據每變化一次就自增1(每次更新讀取最新的值,可用於實現類似數據庫樂觀鎖功能)
aclVersion znode訪問控制列表的變化號
ephemeralOwner 如果是臨時節點,這個是znode擁有者的session id。如果不是臨時節點則是0
dataLength znode的數據長度
dataLength znode子節點數量

查詢數據
get path [watch]

查詢節點/test的數據

[zk: 127.0.0.1:2184(CONNECTED) 19] get /test
testdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

嗯,就是data的值加上狀態信息。

列出節點

ls   path [watch]
ls2 path [watch]

列出根節點信息

[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[testsquence0000000008, zookeeper, test]
[zk: 127.0.0.1:2184(CONNECTED) 1] ls2 /
[testsquence0000000008, zookeeper, test]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x25
cversion = 15
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

ls2 想當於在ls的基礎上加上了當前節點的狀態信息。

設置數據
set path data [version]

data 要設置的數據

version 數據版本號,當指定的版本號與節點當前數據版本號相同時才設置

設置節點/test數據爲newdata

[zk: 127.0.0.1:2184(CONNECTED) 33] set /test newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 127.0.0.1:2184(CONNECTED) 34] get /test        
newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

有沒有發現dataVersion從0變成了1,這個就是和最後一個參數version關聯的。

指定一個錯誤的version更新數據

[zk: 127.0.0.1:2184(CONNECTED) 59] set /test nnn  0
version No is not valid : /test

失敗......

我們用正確的試試

[zk: 127.0.0.1:2184(CONNECTED) 61] set /test nnn  1                                   
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x2a
mtime = Wed May 08 06:46:12 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

成功了,然後dataVersion又從1變成了2

刪除節點

delete path [version]
rmr path

version : 版本號,和set命令一樣中的意思一樣,版本相同才能刪。

delete和rmr的不同之處是在有子節點的情況下delete不能刪除,而rmr可以級聯刪除子節點。

使用delete刪除/test

[zk: 127.0.0.1:2184(CONNECTED) 73] delete /test                                
[zk: 127.0.0.1:2184(CONNECTED) 74] ls /
[testsquence0000000008, zookeeper]

使用delete刪除一個有子節點的試試

[zk: 127.0.0.1:2184(CONNECTED) 77] create /test tt                   
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 78] create /test/child tt
Created /test/child
[zk: 127.0.0.1:2184(CONNECTED) 80] delete /test
Node not empty: /test

是的,不能刪除有子節點的

使用rmr刪除有子節點的/test試試

[zk: 127.0.0.1:2184(CONNECTED) 85] rmr /test            
[zk: 127.0.0.1:2184(CONNECTED) 86] ls /
[testsquence0000000008, zookeeper]

刪除成功

watch用法

Watch機制: 一個zk的節點可以被監控,包括這個目錄中存儲的數據的修改,子節點目錄的變化,一旦變化可以通知設置監控的客戶端,這個功能是zookeeper對於應用最重要的特性,通過這個特性可以實現的功能包括配置的集中管理,集羣管理,分佈式鎖等等。一個Watch事件是一個一次性的觸發器,當被設置了Watch的數據發生了改變的時候,則服務器將這個改變發送給設置了Watch的客戶端。

通過ls對節點/test創建一個watch

[zk: 127.0.0.1:2184(CONNECTED) 92] ls /test mywatch
[zk: 127.0.0.1:2184(CONNECTED) 94] delete /test

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/test

當刪除該節點時我們收到了通知

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章