您好,登錄后才能下訂單哦!
啟動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
創建節點: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
當刪除該節點時我們收到了通知
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。