zookeeper客戶端命令詳解
ZooKeeper 是一個分散式的,開放原始碼的分散式應用程式協調服務,是 Google 的 Chubby一個開源的實現。它提供了簡單原始的功能,分散式應用可以基於它實現更高階的服務,比如分散式同步, 配置管理, 叢集管理, 命名管理,佇列管理。它被設計為易於程式設計,使用檔案系統目錄樹作為資料模型
特點
1、 最終一致性: client 不論連線到哪個 Server,展示給它都是同一個檢視,這是 ZooKeeper最重要的效能
2、 可靠性:具有簡單、健壯、良好的效能,如果訊息 m 被到一臺伺服器接受,那麼它將被所有的伺服器接受
3、 實時性: ZooKeeper 保證客戶端將在一個時間間隔範圍內獲得伺服器的更新資訊,或者伺服器失效的資訊 但由於網路延時等原因, ZooKeeper 不能保證兩個客戶端能同時得到剛更新的資料,如果需要最新資料,應該在 讀資料之前呼叫 sync()介面
4、 等待無關:慢的或者失效的 client 不得幹預快速的 client 的請求,使得每個client 都能有效的等待
5、 原子性:更新只能成功或者失敗,沒有中間狀態
6、 順序性:包括全域性有序和偏序兩種:全域性有序是指如果在一臺伺服器上訊息 a 在訊息 b前釋出,則在所有Server 上訊息 a 都將在訊息 b 前被髮布;偏序是指如果一個訊息 b 在訊息 a 後被同一個傳送者釋出, a 必將排在b 前面
常用命令解析
help
檢視客戶端幫助命令
[zk: localhost:2181(CONNECTED) 8] help
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和-e分別指定節點特性:順序或臨時節點,acl是許可權控制
[zk: localhost:2181(CONNECTED) 11] create /name my
Created /name
複製程式碼
讀取
ls path [watch]
[zk: localhost:2181(CONNECTED) 38] ls /
[zookeeper,name,dubbo]
複製程式碼
get path [watch]
[zk: localhost:2181(CONNECTED) 39] get /name
my
cZxid = 0xe17
ctime = Thu Oct 31 15:07:37 CST 2019
mZxid = 0xe17
mtime = Thu Oct 31 15:07:37 CST 2019
pZxid = 0xe17
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
複製程式碼
詳細資訊
- my:節點的值,如果值則空一行
- cZxid :建立節點的事務id
- ctime : 節點的建立時間
- mZxid :修改節點的事務id
- mtime :修改節點的時間
- pZxid :子節點的id
- cversion : 子節點的版本
- dataVersion : 當前節點資料的版本
- aclVersion :許可權的版本
- ephemeralOwner :判斷是否是臨時節點
- dataLength : 資料的長度
- numChildren :子節點的數量
更新
set path data [version]
[zk: localhost:2181(CONNECTED) 45] set /name mingyu
cZxid = 0xe17
ctime = Thu Oct 31 15:07:37 CST 2019
mZxid = 0xe27
mtime = Thu Oct 31 15:26:13 CST 2019
pZxid = 0xe17
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
# 版本號更新,因為/name節點的版本號是2了所以執行版本號為1時,更新失敗
[zk: localhost:2181(CONNECTED) 46] set /name my 1
version No is not valid : /name
# 更新成功
[zk: localhost:2181(CONNECTED) 47] set /name my 2
cZxid = 0xe17
ctime = Thu Oct 31 15:07:37 CST 2019
...
複製程式碼
刪除
delete path [version]
[zk: localhost:2181(CONNECTED) 55] delete /name
# 刪除不是當前版本號的節點
[zk: localhost:2181(CONNECTED) 60] delete /name 0
version No is not valid : /name
複製程式碼
除了版本號不一致不能進行刪除外,如果要刪除的節點有子節點也是不能進行刪除的
[zk: localhost:2181(CONNECTED) 75] delete /name
Node not empty: /name
複製程式碼
watch通知
通過help命令檢視帶有watch選項的命令,可以對當前操作節點增加監聽操作的
帶有watch選項的命令:stat,get,ls,ls2
stat 設定監聽
[zk: localhost:2181(CONNECTED) 82] stat /test watch
Node does not exist: /test
[zk: localhost:2181(CONNECTED) 83] create /test test
Created /test
WATCHER::
# NodeCreated表示建立節點,路徑是:/test
WatchedEvent state:SyncConnected type:NodeCreated path:/test
複製程式碼
get 設定監聽
[zk: localhost:2181(CONNECTED) 84] get /test watch
test
cZxid = 0xe39
ctime = Thu Oct 31 16:12:12 CST 2019
mZxid = 0xe39
mtime = Thu Oct 31 16:12:12 CST 2019
pZxid = 0xe39
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 85] set /test 1
WATCHER::cZxid = 0xe39
# NodeDataChanged 節點資料改變,路徑是:/test
WatchedEvent state:SyncConnected type:NodeDataChanged path:/testctime = Thu Oct
31 16:12:12 CST 2019
mZxid = 0xe3a
mtime = Thu Oct 31 16:14:25 CST 2019
pZxid = 0xe39
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
複製程式碼
ls 設定監聽
[zk: localhost:2181(CONNECTED) 86] ls /test watch
[]
[zk: localhost:2181(CONNECTED) 87] create /test/date date
WATCHER::Created /test/date
# NodeChildrenChanged 子節點發生改變,路徑是:/test
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test
複製程式碼
ls2
ls命令和stat命令的整合
[zk: localhost:2181(CONNECTED) 88] ls2 /test watch
[date]
cZxid = 0xe39
ctime = Thu Oct 31 16:12:12 CST 2019
mZxid = 0xe3a
mtime = Thu Oct 31 16:14:25 CST 2019
pZxid = 0xe3b
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 1
複製程式碼
利用ls2命令給/test節點加上監聽
# 對子節點的資料進行修改不會觸犯watch監聽
[zk: localhost:2181(CONNECTED) 89] set /test/date 1
cZxid = 0xe3b
ctime = Thu Oct 31 16:18:09 CST 2019
mZxid = 0xe3c
mtime = Thu Oct 31 16:21:46 CST 2019
pZxid = 0xe3b
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
# 只有建立子節點和刪除子節點時會觸發watch監聽
[zk: localhost:2181(CONNECTED) 94] delete /test/date
WATCHER::
# NodeDeleted 節點刪除,路徑:/test/date
WatchedEvent state:SyncConnected type:NodeDeleted path:/test/date
複製程式碼
acl 許可權
zookeeper使用ACL許可權控制機制來保障資料安全
zookeeper中的節點有5種操作許可權:CREATE
、READ
、WRITE
、DELETE
、ADMIN
對應的就是增、查、改、刪、管理許可權,這5種許可權簡寫為crwda
注:這5種許可權中,delete是指對子節點的刪除許可權,其它4種許可權指對自身節點的操作許可權
許可權模式:Scheme
ip
ip模式通過ip地址粒度來進行許可權控制,例如配置了:ip:192.168.1.100即表示許可權控制都是針對這個ip地址的,同時也支援按網段分配,比如:192.168.1.*
Digest
Digest是最常用的許可權控制模式,類似於username:password
形成的許可權標識來進行許可權配置,zookeeper會對形成的許可權標識先後進行兩次編碼處理,分別是SHA-1加密演演算法,BASE64編碼。
World
World是一種最開放的許可權控制模式,這種許可權控制方式幾乎沒有任何作用,資料節點的訪問許可權對所有使用者開放,即所有使用者都可以在不進行任何許可權校驗的情況下操作ZooKeeper上的資料。World模式也可以看作是一種特殊的Digest模式,它只有一個許可權標識,即world:anyone 預設許可權
Super
Super模式是一種特殊的Digest模式,在Super模式下,超級使用者可以對任意ZooKeeper上的資料節點進行任何操作
通過help名稱檢視帶有acl關鍵字的名,包括:getAcl,setAcl,create
使用:[scheme:id:permissions]
來表示acl許可權
world模式
格式:world:anyone:permissions
查詢許可權
getAcl path
[zk: localhost:2181(CONNECTED) 96] getAcl /name
'world,'anyone
: cdrwa
複製程式碼
world:認證方式,anyone:任何人,cdrwa:許可權
所以我們可以對/name節點進行任何操作
設定許可權
setAcl path acl
[zk: localhost:2181(CONNECTED) 123] setAcl /acl world:anyone:cw
cZxid = 0xe4e
ctime = Thu Oct 31 17:01:41 CST 2019
mZxid = 0xe4e
mtime = Thu Oct 31 17:01:41 CST 2019
pZxid = 0xe4e
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
複製程式碼
對/name節點增加create和write許可權,我們測試一下
# 因為沒有讀的許可權,所以get提示沒許可權
[zk: localhost:2181(CONNECTED) 124] get /acl
Authentication is not valid : /acl
# 改節點資料的時候操作正常
[zk: localhost:2181(CONNECTED) 125] set /acl my
cZxid = 0xe4e
ctime = Thu Oct 31 17:01:41 CST 2019
mZxid = 0xe52
mtime = Thu Oct 31 17:03:45 CST 2019
pZxid = 0xe4e
cversion = 0
dataVersion = 1
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
複製程式碼
Digest模式
格式: scheme:username:password:permissions
Digest模式中 scheme 分為兩種:digest和auto
scheme:digest
# 設定許可權
[zk: localhost:2181(CONNECTED) 135] setAcl /acl digest:name:my:cr
cZxid = 0xe56
ctime = Thu Oct 31 17:29:12 CST 2019
mZxid = 0xe56
mtime = Thu Oct 31 17:29:12 CST 2019
pZxid = 0xe56
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
# 獲取許可權,密碼沒加密
[zk: localhost:2181(CONNECTED) 136] getAcl /acl
'digest,'name:my
: cr
複製程式碼
scheme:auto
使用 addauth scheme auth 命令增加
# 使用auto 設定許可權
[zk: localhost:2181(CONNECTED) 153] addauth digest a:a
# 獲取許可權,password加密了
[zk: localhost:2181(CONNECTED) 4] getAcl /cmy
'digest,'a:mDmPUap4qvYwm+PZOtJ/scGyHLY=
: crw
複製程式碼
ip
格式:ip:Ip-address:permissions
# 設定許可權
[zk: localhost:2181(CONNECTED) 9] setAcl /ip ip:192.168.1.1:cr
cZxid = 0xe6a
ctime = Thu Oct 31 17:50:29 CST 2019
mZxid = 0xe6a
mtime = Thu Oct 31 17:50:29 CST 2019
pZxid = 0xe6a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
# 檢視許可權
[zk: localhost:2181(CONNECTED) 10] getAcl /ip
'ip,'192.168.1.1
: cr
複製程式碼