掌握zookeeper命令,看這篇文章就夠了
點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
zookeeper使用
安裝與配置
使用安裝包安裝
#?下載
$?wget?https://downloads.apache.org/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz
$?tar?-zxvf?apache-zookeeper-3.6.0-bin.tar.gz
$?cd?apache-zookeeper-3.6.0-bin
#?配置
$?cp?conf/zoo_sample.cfg?conf/zoo.cfg
#?編輯配置文件,下面介紹
$?vi?conf/zoo.cfg
#?啟動服務(wù)端
$?bin/zkServer.sh?start
#?查看狀態(tài)
$?bin/zkServer.sh?status
#?停止
$?bin/zkServer.sh?stop
#?重啟
$?bin/zkServer.sh?restart
#?用?jps?查看狀態(tài)
$?jps
46193?QuorumPeerMain
Homebrew 安裝 zookeeper
$?brew?install?zookeeper
#?啟動服務(wù)
$?brew?services?start?zookeeper
#?停止服務(wù)
$?brew?services?stop?zookeeper
#?配置文件位置?
$?ls?/usr/local/etc/zookeeper
defaults?????????log4j.properties?zoo.cfg??????????zoo_sample.cfg
配置文件
下面是配置文件的內(nèi)容:
#?The?number?of?milliseconds?of?each?tick
tickTime=2000
#?The?number?of?ticks?that?the?initial
#?synchronization?phase?can?take
initLimit=10
#?The?number?of?ticks?that?can?pass?between
#?sending?a?request?and?getting?an?acknowledgement
syncLimit=5
#?the?directory?where?the?snapshot?is?stored.
#?do?not?use?/tmp?for?storage,?/tmp?here?is?just
#?example?sakes.
dataDir=/tmp/zookeeper/data
dataLogDir=/tmp/zookeeper/log
#?the?port?at?which?the?clients?will?connect
clientPort=2181
tickTime:配置單元時間。單元時間是ZooKeeper的時間計算單元,其他的時間間隔都是使用tickTime的倍數(shù)來表示的。
initLimit:節(jié)點的初始化時間。該參數(shù)用于Follower(從節(jié)點)的啟動,并完成與Leader(主節(jié)點)進(jìn)行數(shù)據(jù)同步的時間。Follower節(jié)點在啟動過程中,會與Leader節(jié)點建立連接并完成對數(shù)據(jù)的同步,從而確定自己的起始狀態(tài)。Leader節(jié)點允許Follower節(jié)點在initLimit時間內(nèi)完成這項工作。該參數(shù)默認(rèn)值為10,表示是參數(shù)tickTime值的10倍。
syncLimit:心跳最大延遲周期。該參數(shù)用于配置Leader節(jié)點和Follower節(jié)點之間進(jìn)行心跳檢測的最大延時時間。在ZK集群運行的過程中,Leader節(jié)點會通過心跳檢測來確定Follower節(jié)點是否存活。如果Leader節(jié)點在syncLimit時間內(nèi)無法獲取到Follower節(jié)點的心跳檢測響應(yīng),那么Leader節(jié)點就會認(rèn)為該Follower節(jié)點已經(jīng)脫離了和自己的同步。該參數(shù)默認(rèn)值為5,表示是參數(shù)tickTime值的5倍。
dataDir:是zookeeper持久化數(shù)據(jù)存放的目錄。myid文件處于此目錄下。
dataLogDir:日志目錄選項,如果沒有設(shè)置該參數(shù),默認(rèn)將使用和dataDir相同的設(shè)置。
clientPort:zookeeper監(jiān)聽客戶端連接的端口,默認(rèn)是2181。
zookeeper cli
使用 brew 安裝,已經(jīng)把 zookeeper bin 目錄下的命令添加的系統(tǒng)中,因此在終端直接執(zhí)行?zkCli,就創(chuàng)建了一個 zk 客戶端,連接 zk 服務(wù)。
使用壓縮包安裝,可以執(zhí)行:
$?bin/zkCli.sh?-server?127.0.0.1:2181
輸入 help 命令(其實輸入任何 zkCli 不能識別的命令,都會列出所有的命令),查看可用的命令:
對 znode 進(jìn)行增刪改查
創(chuàng)建節(jié)點 create
create [-s] [-e] [-c] [-t ttl] path [data] [acl]?-s?創(chuàng)建有序節(jié)點
如果在創(chuàng)建znode時,我們使用排序標(biāo)志的話,ZooKeeper會在我們指定的 znode 名字后面增加一個數(shù)字。我們繼續(xù)加入相同名字的znode時,這個數(shù)字會不斷增加。這個序號的計數(shù)器是由這些排序znode的父節(jié)點來維護的。
-e?創(chuàng)建臨時節(jié)點
znode有兩種類型:ephemeral 和 persistent。在創(chuàng)建znode時,我們指定znode的類型,并且在之后不會再被修改。當(dāng)創(chuàng)建znode的客戶端的session結(jié)束后,ephemeral類型的znode將被刪除。persistent類型的znode在創(chuàng)建以后,就與客戶端沒什么聯(lián)系了,除非主動去刪除它,否則他會一直存在。Ephemeral znode沒有任何子節(jié)點。acl?在下面的《 ACL 操作》中詳細(xì)介紹。
使用方法:
普通節(jié)點
[zk:?localhost:2181(CONNECTED)?3]?create?/mynode?hello
Created?/mynode
[zk:?localhost:2181(CONNECTED)?4]?create?/mynode/subnode?world
Created?/mynode/subnode
[zk:?localhost:2181(CONNECTED)?9]?get?/mynode
hello
[zk:?localhost:2181(CONNECTED)?10]?get?/mynode/subnode
world
有序節(jié)點
[zk:?localhost:2181(CONNECTED)?4]?create?-s?/mynode?hello
Created?/mynode0000000004
[zk:?localhost:2181(CONNECTED)?6]?create?-s?/mynode?world
Created?/mynode0000000005
臨時節(jié)點
[zk:?localhost:2181(CONNECTED)?7]?create?-e?/temp?hello
Created?/temp
退出 zkCli,然后再重新打開它,/temp 節(jié)點已經(jīng)被刪除了。
列出節(jié)點 ls
ls [-s] [-w] [-R] path-w?添加一個 watch(監(jiān)視器),如果該節(jié)點發(fā)生變化,watch 可以使客戶端得到通知。watch 只能被觸發(fā)一次。如果要一直獲得 znode 的創(chuàng)建和刪除的通知,那么就需要不斷的在znode上開啟觀察模式。如果在該 path 下節(jié)點發(fā)生變化,會產(chǎn)生?NodeChildrenChanged?事件,刪除節(jié)點,會產(chǎn)生?NodeDeleted?事件。
使用方法:
[zk:?localhost:2181(CONNECTED)?12]?ls?/
[mynode,?mynode0000000003,?mynode0000000004,?test,?zookeeper]
[zk:?localhost:2181(CONNECTED)?13]?ls?-s?/
[mynode,?mynode0000000003,?mynode0000000004,?test,?zookeeper]
cZxid?=?0x0
ctime?=?Thu?Jan?01?08:00:00?CST?1970
mZxid?=?0x0
mtime?=?Thu?Jan?01?08:00:00?CST?1970
pZxid?=?0x300000053
cversion?=?7
dataVersion?=?0
aclVersion?=?0
ephemeralOwner?=?0x0
dataLength?=?0
numChildren?=?5
[zk:?localhost:2181(CONNECTED)?2]?ls?/mynode
[subnode]
使用?-w?查看 /mynode 節(jié)點,然后在它下面添加(刪除)子節(jié)點,就會觸發(fā)該 watch。在其他節(jié)點下創(chuàng)建子節(jié)點,不會觸發(fā)該 watch。
[zk:?localhost:2181(CONNECTED)?20]?ls?-w?/mynode
[subnode]
[zk:?localhost:2181(CONNECTED)?21]?create?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeChildrenChanged?path:/mynode
Created?/mynode/subnode2
#?監(jiān)聽父節(jié)點,刪除子節(jié)點,產(chǎn)生?NodeChildrenChanged事件
[zk:?localhost:2181(CONNECTED)?22]?ls?-w?/mynode
[subnode,?subnode2]
[zk:?localhost:2181(CONNECTED)?23]?delete?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeChildrenChanged?path:/mynode
#?監(jiān)聽子節(jié)點,刪除子節(jié)點,產(chǎn)生?NodeDeleted?事件
[zk:?localhost:2181(CONNECTED)?51]?create?/mynode/subnode2
Created?/mynode/subnode2
[zk:?localhost:2181(CONNECTED)?52]?ls?-w?/mynode/subnode2
[]
[zk:?localhost:2181(CONNECTED)?53]?delete?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeDeleted?path:/mynode/subnode2
從上面的操作可以看到,在 /mynode 下添加了 subnode2 節(jié)點之后,觸發(fā)了 watch,WatchedEvent 的類型是?NodeChildrenChanged。之后再刪除 subnode2 節(jié)點,也出發(fā)了 watch。
獲取節(jié)點信息 get
get [-s] [-w] path-w?添加一個 watch(監(jiān)視器),如果節(jié)點內(nèi)容發(fā)生改變,會產(chǎn)生?NodeDataChanged?事件;如果刪除節(jié)點,會產(chǎn)生?NodeDeleted?事件。
使用方法
[zk:?localhost:2181(CONNECTED)?20]?ls?-w?/mynode
[subnode]
[zk:?localhost:2181(CONNECTED)?21]?create?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeChildrenChanged?path:/mynode
Created?/mynode/subnode2
#?監(jiān)聽父節(jié)點,刪除子節(jié)點,產(chǎn)生?NodeChildrenChanged事件
[zk:?localhost:2181(CONNECTED)?22]?ls?-w?/mynode
[subnode,?subnode2]
[zk:?localhost:2181(CONNECTED)?23]?delete?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeChildrenChanged?path:/mynode
#?監(jiān)聽子節(jié)點,刪除子節(jié)點,產(chǎn)生?NodeDeleted?事件
[zk:?localhost:2181(CONNECTED)?51]?create?/mynode/subnode2
Created?/mynode/subnode2
[zk:?localhost:2181(CONNECTED)?52]?ls?-w?/mynode/subnode2
[]
[zk:?localhost:2181(CONNECTED)?53]?delete?/mynode/subnode2
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeDeleted?path:/mynode/subnode2
每一個對znode樹的更新操作,都會被賦予一個全局唯一的ID,我們稱之為zxid(ZooKeeper Transaction ID)。更新操作的ID按照發(fā)生的時間順序升序排序。例如,z1大于z2,那么z1的操作就早于z2操作。
每個 znode 的狀態(tài)信息包含以下內(nèi)容:
czxid,創(chuàng)建(create)該 znode 的 zxid
mzxid,最后一次修改(modify)該 znode 的 zxid
pzxid,最后一次修改該 znode?子節(jié)點的 zxid
ctime,創(chuàng)建該 znode 的時間
mtime,最后一次修改該 znode 的時間
dataVersion,該節(jié)點內(nèi)容的版本,每次修改內(nèi)容,版本都會增加
cversion,該節(jié)點子節(jié)點的版本
aclVersion,該節(jié)點的 ACL 版本
ephemeralOwner,如果該節(jié)點是臨時節(jié)點(ephemeral node),會列出該節(jié)點所在客戶端的 session id;如果不是臨時節(jié)點,該值為 0
dataLength,該節(jié)點存儲的數(shù)據(jù)長度
numChildren,該節(jié)點子節(jié)點的個數(shù)
檢查狀態(tài) stat
stat [-w] path-w?添加一個 watch(監(jiān)視器),如果節(jié)點內(nèi)容發(fā)生改變,會產(chǎn)生?NodeDataChanged?事件;如果刪除節(jié)點,會產(chǎn)生?NodeDeleted?事件。
與 get 的區(qū)別是,不回列出 znode 的值。
使用方法
[zk:?localhost:2181(CONNECTED)?56]?stat?/mynode
cZxid?=?0x30000004c
ctime?=?Sun?Apr?05?15:48:14?CST?2020
mZxid?=?0x30000005e
mtime?=?Sun?Apr?05?16:09:32?CST?2020
pZxid?=?0x300000067
cversion?=?16
dataVersion?=?2
aclVersion?=?0
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
修改節(jié)點 set
set [-s] [-v version] path data?
修改已經(jīng)存在的節(jié)點的值
使用方法
[zk:?localhost:2181(CONNECTED)?57]?set?/mynode?hello
[zk:?localhost:2181(CONNECTED)?58]?ls?/mynode
[]
[zk:?localhost:2181(CONNECTED)?59]?stat?/mynode
cZxid?=?0x30000004c
ctime?=?Sun?Apr?05?15:48:14?CST?2020
mZxid?=?0x300000068
mtime?=?Sun?Apr?05?16:20:34?CST?2020
pZxid?=?0x300000067
cversion?=?16
dataVersion?=?3
aclVersion?=?0
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
可以看到,在修改節(jié)點值之后,mZxid、mtime、dataVersion 都發(fā)生了變化。
刪除節(jié)點 deleteall
deleteall path [-b batch size]?
使用方法
[zk:?localhost:2181(CONNECTED)?34]?delete?/mynode
刪除 /mynode,不會返回任何內(nèi)容。如果有子節(jié)點的時候,都會刪除。
刪除節(jié)點 delete
delete [-v version] path
調(diào)用delete和set操作時,如果指定znode版本號,需要與當(dāng)前的版本號匹配。如果版本號不匹配,操作將會失敗。失敗的原因可能是在我們提交之前,該znode已經(jīng)被修改過了,版本號發(fā)生了增量變化。如果不指定版本號,就是直接操作最新版本的 znode。
使用方法
[zk:?localhost:2181(CONNECTED)?15]?create?/mynode?hello
Created?/mynode
[zk:?localhost:2181(CONNECTED)?16]?delete?/mynode
如果要刪除的節(jié)點有子節(jié)點,不能刪除
[zk:?localhost:2181(CONNECTED)?33]?create?/mynode/sub?sub
Created?/mynode/sub
[zk:?localhost:2181(CONNECTED)?34]?delete?/mynode
Node?not?empty:?/mynode
其他指令
歷史記錄 history
history?列出最近的10條歷史記錄
[zk:?localhost:2181(CONNECTED)?7]?history
0?-?history
1?-?create?/mynode?hello
2?-?ls?/
3?-?set?/mynode?worold
4?-?get?/mynode
5?-?stat?/mynode
6?-?rmr?/mynode
7?-?history
重復(fù)之前的命令 redo
redo cmdno?根據(jù) cmdno 重復(fù)之前的命令,cmdno 就是方括號里面最后的數(shù)字,每次執(zhí)行命令都會自增。
[zk:?localhost:2181(CONNECTED)?5]?create?/mynode?hello
Created?/mynode
[zk:?localhost:2181(CONNECTED)?6]?rmr?/mynode
[zk:?localhost:2181(CONNECTED)?7]?redo?5
Created?/mynode
是否輸出 watch 事件(printwatches)
語法printwatches on|off
使用方法
[zk:?localhost:2181(CONNECTED)?43]?printwatches
printwatches?is?on
[zk:?localhost:2181(CONNECTED)?44]?ls?/mynode?1
[sub]
[zk:?localhost:2181(CONNECTED)?45]?create?/mynode/child?child
WATCHER::
WatchedEvent?state:SyncConnected?type:NodeChildrenChanged?path:/mynode
Created?/mynode/child
如果設(shè)置?printwatches off?,就看不到上面的 WATCHER 事件了。
關(guān)閉連接 close
close
[zk:?localhost:2181(CONNECTED)?50]?close
[zk:?localhost:2181(CLOSED)?51]
[zk:?localhost:2181(CLOSED)?52]?ls?/
Not?connected
打開連接 connect
connect host:port
[zk:?localhost:2181(CLOSED)?52]?connect
[zk:?localhost:2181(CONNECTING)?53]
WATCHER::
WatchedEvent?state:SyncConnected?type:None?path:null
[zk:?localhost:2181(CONNECTED)?53]
指定 host:port 可以連接遠(yuǎn)程的 zk 服務(wù)。缺省的時候,會連接本地的 2181 端口。
退出連接 quit
quit
直接退出當(dāng)前的 zkCli 命令行。
強制同步 sync
sync pathsync方法會強制客戶端所連接的服務(wù)器狀態(tài)與leader的狀態(tài)同步,這樣在讀取 path 的值就是最新的值了。
ACL 操作
一個znode中不僅包含了存儲的數(shù)據(jù),還有?ACL(Access Control List)。znode的創(chuàng)建時,可以給它設(shè)置一個ACL(Access Control List),來決定誰可以對znode做哪些操作。
ACL 具有以下特點:
ZooKeeper的權(quán)限控制是基于每個znode節(jié)點的,需要對每個節(jié)點設(shè)置權(quán)限
每個znode支持設(shè)置多種權(quán)限控制方案和多個權(quán)限
子節(jié)點不會繼承父節(jié)點的權(quán)限,客戶端無權(quán)訪問某節(jié)點,但可能可以訪問它的子節(jié)點
ACL Permissions
| ACL 權(quán)限 | ACL 簡寫 | 允許的操作 |
|---|---|---|
| CREATE | c | 創(chuàng)建子節(jié)點 |
| READ | r | 獲取節(jié)點的數(shù)據(jù)和它的子節(jié)點 |
| WRITE | w | 設(shè)置節(jié)點的數(shù)據(jù) |
| DELETE | d | 刪除子節(jié)點 (僅下一級節(jié)點) |
| ADMIN | a | 設(shè)置 ACL 權(quán)限 |
權(quán)限相關(guān)命令
| 命令 | 語法 | 描述 |
|---|---|---|
| getAcl | getAcl [-s] path | 讀取ACL權(quán)限 |
| setAcl | setAcl [-s] [-v version] [-R] path acl | 設(shè)置ACL權(quán)限 |
| addauth | addauth scheme auth | 添加認(rèn)證用戶 |
| create | create [-s] [-e] path data acl | 創(chuàng)建節(jié)點時指明 ACL 權(quán)限 |
ACL Schemes
ZooKeeper內(nèi)置了一些權(quán)限控制方案,可以用以下方案為每個節(jié)點設(shè)置權(quán)限:
| 方案 | 描述 |
|---|---|
| world | 只有一個用戶:anyone,代表所有人(默認(rèn)) |
| ip | 使用IP地址認(rèn)證 |
| auth | 使用已添加認(rèn)證的用戶認(rèn)證 |
| digest | 使用“用戶名:密碼”方式認(rèn)證 |
ACL是由鑒權(quán)方式、鑒權(quán)方式的ID和一個許可(permession)的集合組成。例如,我們想通過一個ip地址為10.0.0.1的客戶端訪問一個znode。那么,我們需要為znode設(shè)置一個ACL,鑒權(quán)方式使用IP鑒權(quán)方式,鑒權(quán)方式的ID為10.0.0.1,只允許讀權(quán)限。那么 ACL 的格式就是:ip:10.0.0.1:w
world 方案
設(shè)置方式:setAcl
默認(rèn)情況下時 world 方法,任何人有所有權(quán)限:
[zk:?localhost:2181(CONNECTED)?6]?getAcl?/mynode
'world,'anyone
:?cdrwa
[zk:?localhost:2181(CONNECTED)?7]?setAcl?/mynode?world:anyone:cdr
cZxid?=?0x54a
ctime?=?Tue?Apr?03?09:26:36?CST?2018
mZxid?=?0x54a
mtime?=?Tue?Apr?03?09:26:36?CST?2018
pZxid?=?0x54a
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
[zk:?localhost:2181(CONNECTED)?15]?set?/mynode?hello
Authentication?is?not?valid?:?/mynode
可以看出,在修改權(quán)限為 cdr 之后,不能再設(shè)置節(jié)點數(shù)據(jù)了。注意 aclVersion 也發(fā)生了變化。
IP 方案
設(shè)置方式:setAcl :可以是具體IP也可以是IP/bit格式,即IP轉(zhuǎn)換為二進(jìn)制,匹配前bit位,如192.168.0.0/16匹配192.168.*.*
[zk:?localhost:2181(CONNECTED)?19]?create?/mynode?hello
Created?/mynode
[zk:?localhost:2181(CONNECTED)?20]?setAcl?/mynode?ip:192.168.1.250:cdrwa
cZxid?=?0x552
ctime?=?Tue?Apr?03?09:38:58?CST?2018
mZxid?=?0x552
mtime?=?Tue?Apr?03?09:38:58?CST?2018
pZxid?=?0x552
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
[zk:?localhost:2181(CONNECTED)?21]?getAcl?/mynode
'ip,'192.168.1.250
:?cdrwa
使用其他電腦方法方法該節(jié)點:
#使用IP非?192.168.100.1?的機器
[zk:?localhost:2181(CONNECTED)?0]?get?/node2
Authentication?is?not?valid?:?/node2?#沒有權(quán)限
[zk:?localhost:2181(CONNECTED)?1]?delete?/node2?#刪除成功(因為設(shè)置DELETE權(quán)限僅對下一級子節(jié)點有效,并不包含此節(jié)點)
auth 方案
設(shè)置方式
addauth?digest?:?#添加認(rèn)證用戶
setAcl??auth::
示例:
[zk:?localhost:2181(CONNECTED)?22]?create?/mynode1?hello
Created?/mynode1
[zk:?localhost:2181(CONNECTED)?23]?addauth?digest?admin:admin?#添加認(rèn)證用戶
[zk:?localhost:2181(CONNECTED)?24]?setAcl?/mynode1?auth:admin:cdrwa
cZxid?=?0x554
ctime?=?Tue?Apr?03?09:44:32?CST?2018
mZxid?=?0x554
mtime?=?Tue?Apr?03?09:44:32?CST?2018
pZxid?=?0x554
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
[zk:?localhost:2181(CONNECTED)?25]?getAcl?/mynode1
'digest,'admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=
:?cdrwa
[zk:?localhost:2181(CONNECTED)?26]?get?/mynode1
hello?#剛才已經(jīng)添加認(rèn)證用戶,可以直接讀取數(shù)據(jù),斷開會話重連需要重新addauth添加認(rèn)證用戶
cZxid?=?0x554
ctime?=?Tue?Apr?03?09:44:32?CST?2018
mZxid?=?0x554
mtime?=?Tue?Apr?03?09:44:32?CST?2018
pZxid?=?0x554
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
digest 方案
設(shè)置方式
setAcl??digest:::
這里的密碼是經(jīng)過SHA1及BASE64處理的密文,在SHELL中可以通過以下命令計算:
echo?-n?:?|?openssl?dgst?-binary?-sha1?|?openssl?base64
先來算一個密文密碼:
echo?-n?admin:admin?|?openssl?dgst?-binary?-sha1?|?openssl?base64
x1nq8J5GOJVPY6zgzhtTtA9izLc=
示例:
[zk:?localhost:2181(CONNECTED)?8]?create?/mynode2?hello
Created?/mynode2
#使用是上面算好的密文密碼添加權(quán)限:
[zk:?localhost:2181(CONNECTED)?9]?setAcl?/mynode2?
digest:admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=:cdrwa
cZxid?=?0x55a
ctime?=?Tue?Apr?03?13:17:12?CST?2018
mZxid?=?0x55a
mtime?=?Tue?Apr?03?13:17:12?CST?2018
pZxid?=?0x55a
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
[zk:?localhost:2181(CONNECTED)?10]?getAcl?/mynode2
'digest,'admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=
:?cdrwa
[zk:?localhost:2181(CONNECTED)?11]?get?/mynode2
#沒有權(quán)限
Authentication?is?not?valid?:?/mynode2
[zk:?localhost:2181(CONNECTED)?12]?addauth?digest?admin:admin?#添加認(rèn)證用戶
[zk:?localhost:2181(CONNECTED)?13]?get?/mynode2
hello??#成功讀取數(shù)據(jù)
cZxid?=?0x55a
ctime?=?Tue?Apr?03?13:17:12?CST?2018
mZxid?=?0x55a
mtime?=?Tue?Apr?03?13:17:12?CST?2018
pZxid?=?0x55a
cversion?=?0
dataVersion?=?0
aclVersion?=?1
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
創(chuàng)建節(jié)點時指定 ACL
#添加?admin?用戶
[zk:?localhost:2181(CONNECTED)?2]?addauth?digest?admin:admin
#創(chuàng)建節(jié)點時賦予權(quán)限
[zk:?localhost:2181(CONNECTED)?3]?create?/mynode?hello?auth:admin:cdrwa
Created?/mynode
[zk:?localhost:2181(CONNECTED)?4]?getAcl?/mynode
'digest,'admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=
:?cdrwa
[zk:?localhost:2181(CONNECTED)?5]?close
[zk:?localhost:2181(CLOSED)?6]?connect
[zk:?localhost:2181(CONNECTING)?7]
WATCHER::
WatchedEvent?state:SyncConnected?type:None?path:null
#斷開會話重連需要重新addauth添加認(rèn)證用戶
[zk:?localhost:2181(CONNECTED)?7]?get?/mynode
Authentication?is?not?valid?:?/mynode
[zk:?localhost:2181(CONNECTED)?8]?addauth?digest?admin:admin
[zk:?localhost:2181(CONNECTED)?9]?get?/mynode
hello
cZxid?=?0x56c
ctime?=?Tue?Apr?03?15:00:27?CST?2018
mZxid?=?0x56c
mtime?=?Tue?Apr?03?15:00:27?CST?2018
pZxid?=?0x56c
cversion?=?0
dataVersion?=?0
aclVersion?=?0
ephemeralOwner?=?0x0
dataLength?=?5
numChildren?=?0
注意了!使用 rmr 刪除節(jié)點沒有權(quán)限時,竟然可以使用 delete
[zk:?localhost:2181(CONNECTED)?25]?rmr?/mynode
Authentication?is?not?valid?:?/mynode
[zk:?localhost:2181(CONNECTED)?26]?delete?/mynode
zookeeper quota
zookeeper quota 機制支持節(jié)點個數(shù)(namespace)和空間大小(bytes)的設(shè)置。
zookeeper quota 保存在?/zookeeper/quota?節(jié)點下,可以設(shè)置該節(jié)點的 ACL 權(quán)限,以防其他人修改。
語法:listquota path
setquota -n|-b val pathdelquota [-n|-b] path
使用方法:
#?目前還沒有任何設(shè)置
[zk:?localhost:2181(CONNECTED)?9]?ls?/zookeeper/quota
[]
#?還沒有為?/mynode?設(shè)置?quota
[zk:?localhost:2181(CONNECTED)?10]?listquota?/mynode
absolute?path?is?/zookeeper/quota/mynode/zookeeper_limits
quota?for?/mynode?does?not?exist.
#?-n表示設(shè)置znode?count限制,這里表示/mynode這個path下的znode?count個數(shù)限制為3(包括/mynode本身)
[zk:?localhost:2181(CONNECTED)?11]?setquota?-n?3?/mynode
Comment:?the?parts?are?option?-n?val?3?path?/mynode
[zk:?localhost:2181(CONNECTED)?12]?create?/mynode/sub1?hello
Created?/mynode/sub1
[zk:?localhost:2181(CONNECTED)?9]?listquota?/mynode
absolute?path?is?/zookeeper/quota/mynode/zookeeper_limits
Output?quota?for?/mynode?count=3,bytes=-1
Output?stat?for?/mynode?count=2,bytes=6
注意,即使節(jié)點數(shù)超出了限制,也不會看到提示信息,zookeeper 只會在日志中提醒一下。
使用 listquota 列出了節(jié)點的設(shè)置的 quota,和節(jié)點實際的容量。
[zk:?localhost:2181(CONNECTED)?20]?delquota?-n?/mynode
[zk:?localhost:2181(CONNECTED)?21]?listquota?/mynode
absolute?path?is?/zookeeper/quota/mynode/zookeeper_limits
Output?quota?for?/mynode?count=-1,bytes=-1
Output?stat?for?/mynode?count=2,bytes=6
刪除 quota 之后,count 也變成了 -1
至此,Zookeeper客戶端所有的命令介紹完畢!
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
http://blog.csdn.net/feixiang2039/article/details/79810102


??? ?
感謝點贊支持下哈?
