1. 程式人生 > 程式設計 >zookeeper客戶端命令詳解

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種操作許可權:CREATEREADWRITEDELETEADMIN 對應的就是增、查、改、刪、管理許可權,這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
複製程式碼