掌握zookeeper命令,看這篇文章就夠了
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
66套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
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
#?啟動(dòng)服務(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
#?啟動(dòng)服務(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:配置單元時(shí)間。單元時(shí)間是ZooKeeper的時(shí)間計(jì)算單元,其他的時(shí)間間隔都是使用tickTime的倍數(shù)來(lái)表示的。
initLimit:節(jié)點(diǎn)的初始化時(shí)間。該參數(shù)用于Follower(從節(jié)點(diǎn))的啟動(dòng),并完成與Leader(主節(jié)點(diǎn))進(jìn)行數(shù)據(jù)同步的時(shí)間。Follower節(jié)點(diǎn)在啟動(dòng)過(guò)程中,會(huì)與Leader節(jié)點(diǎn)建立連接并完成對(duì)數(shù)據(jù)的同步,從而確定自己的起始狀態(tài)。Leader節(jié)點(diǎn)允許Follower節(jié)點(diǎn)在initLimit時(shí)間內(nèi)完成這項(xiàng)工作。該參數(shù)默認(rèn)值為10,表示是參數(shù)tickTime值的10倍。
syncLimit:心跳最大延遲周期。該參數(shù)用于配置Leader節(jié)點(diǎn)和Follower節(jié)點(diǎn)之間進(jìn)行心跳檢測(cè)的最大延時(shí)時(shí)間。在ZK集群運(yùn)行的過(guò)程中,Leader節(jié)點(diǎn)會(huì)通過(guò)心跳檢測(cè)來(lái)確定Follower節(jié)點(diǎn)是否存活。如果Leader節(jié)點(diǎn)在syncLimit時(shí)間內(nèi)無(wú)法獲取到Follower節(jié)點(diǎn)的心跳檢測(cè)響應(yīng),那么Leader節(jié)點(diǎn)就會(huì)認(rèn)為該Follower節(jié)點(diǎn)已經(jīng)脫離了和自己的同步。該參數(shù)默認(rèn)值為5,表示是參數(shù)tickTime值的5倍。
dataDir:是zookeeper持久化數(shù)據(jù)存放的目錄。myid文件處于此目錄下。
dataLogDir:日志目錄選項(xiàng),如果沒(méi)有設(shè)置該參數(shù),默認(rèn)將使用和dataDir相同的設(shè)置。
clientPort:zookeeper監(jiān)聽(tīng)客戶(hù)端連接的端口,默認(rèn)是2181。
zookeeper cli
使用 brew 安裝,已經(jīng)把 zookeeper bin 目錄下的命令添加的系統(tǒng)中,因此在終端直接執(zhí)行?zkCli,就創(chuàng)建了一個(gè) zk 客戶(hù)端,連接 zk 服務(wù)。
使用壓縮包安裝,可以執(zhí)行:
$?bin/zkCli.sh?-server?127.0.0.1:2181
輸入 help 命令(其實(shí)輸入任何 zkCli 不能識(shí)別的命令,都會(huì)列出所有的命令),查看可用的命令:
對(duì) znode 進(jìn)行增刪改查
創(chuàng)建節(jié)點(diǎn) create
create [-s] [-e] [-c] [-t ttl] path [data] [acl]?-s?創(chuàng)建有序節(jié)點(diǎn)
如果在創(chuàng)建znode時(shí),我們使用排序標(biāo)志的話(huà),ZooKeeper會(huì)在我們指定的 znode 名字后面增加一個(gè)數(shù)字。我們繼續(xù)加入相同名字的znode時(shí),這個(gè)數(shù)字會(huì)不斷增加。這個(gè)序號(hào)的計(jì)數(shù)器是由這些排序znode的父節(jié)點(diǎn)來(lái)維護(hù)的。
-e?創(chuàng)建臨時(shí)節(jié)點(diǎn)
znode有兩種類(lèi)型:ephemeral 和 persistent。在創(chuàng)建znode時(shí),我們指定znode的類(lèi)型,并且在之后不會(huì)再被修改。當(dāng)創(chuàng)建znode的客戶(hù)端的session結(jié)束后,ephemeral類(lèi)型的znode將被刪除。persistent類(lèi)型的znode在創(chuàng)建以后,就與客戶(hù)端沒(méi)什么聯(lián)系了,除非主動(dòng)去刪除它,否則他會(huì)一直存在。Ephemeral znode沒(méi)有任何子節(jié)點(diǎn)。acl?在下面的《 ACL 操作》中詳細(xì)介紹。
使用方法:
普通節(jié)點(diǎn)
[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é)點(diǎn)
[zk:?localhost:2181(CONNECTED)?4]?create?-s?/mynode?hello
Created?/mynode0000000004
[zk:?localhost:2181(CONNECTED)?6]?create?-s?/mynode?world
Created?/mynode0000000005
臨時(shí)節(jié)點(diǎn)
[zk:?localhost:2181(CONNECTED)?7]?create?-e?/temp?hello
Created?/temp
退出 zkCli,然后再重新打開(kāi)它,/temp 節(jié)點(diǎn)已經(jīng)被刪除了。
列出節(jié)點(diǎn) ls
ls [-s] [-w] [-R] path-w?添加一個(gè) watch(監(jiān)視器),如果該節(jié)點(diǎn)發(fā)生變化,watch 可以使客戶(hù)端得到通知。watch 只能被觸發(fā)一次。如果要一直獲得 znode 的創(chuàng)建和刪除的通知,那么就需要不斷的在znode上開(kāi)啟觀察模式。如果在該 path 下節(jié)點(diǎn)發(fā)生變化,會(huì)產(chǎn)生?NodeChildrenChanged?事件,刪除節(jié)點(diǎn),會(huì)產(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é)點(diǎn),然后在它下面添加(刪除)子節(jié)點(diǎn),就會(huì)觸發(fā)該 watch。在其他節(jié)點(diǎn)下創(chuàng)建子節(jié)點(diǎn),不會(huì)觸發(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)聽(tīng)父節(jié)點(diǎn),刪除子節(jié)點(diǎn),產(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)聽(tīng)子節(jié)點(diǎn),刪除子節(jié)點(diǎn),產(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é)點(diǎn)之后,觸發(fā)了 watch,WatchedEvent 的類(lèi)型是?NodeChildrenChanged。之后再刪除 subnode2 節(jié)點(diǎn),也出發(fā)了 watch。
獲取節(jié)點(diǎn)信息 get
get [-s] [-w] path-w?添加一個(gè) watch(監(jiān)視器),如果節(jié)點(diǎn)內(nèi)容發(fā)生改變,會(huì)產(chǎn)生?NodeDataChanged?事件;如果刪除節(jié)點(diǎn),會(huì)產(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)聽(tīng)父節(jié)點(diǎn),刪除子節(jié)點(diǎn),產(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)聽(tīng)子節(jié)點(diǎn),刪除子節(jié)點(diǎn),產(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
每一個(gè)對(duì)znode樹(shù)的更新操作,都會(huì)被賦予一個(gè)全局唯一的ID,我們稱(chēng)之為zxid(ZooKeeper Transaction ID)。更新操作的ID按照發(fā)生的時(shí)間順序升序排序。例如,z1大于z2,那么z1的操作就早于z2操作。
每個(gè) znode 的狀態(tài)信息包含以下內(nèi)容:
czxid,創(chuàng)建(create)該 znode 的 zxid
mzxid,最后一次修改(modify)該 znode 的 zxid
pzxid,最后一次修改該 znode?子節(jié)點(diǎn)的 zxid
ctime,創(chuàng)建該 znode 的時(shí)間
mtime,最后一次修改該 znode 的時(shí)間
dataVersion,該節(jié)點(diǎn)內(nèi)容的版本,每次修改內(nèi)容,版本都會(huì)增加
cversion,該節(jié)點(diǎn)子節(jié)點(diǎn)的版本
aclVersion,該節(jié)點(diǎn)的 ACL 版本
ephemeralOwner,如果該節(jié)點(diǎn)是臨時(shí)節(jié)點(diǎn)(ephemeral node),會(huì)列出該節(jié)點(diǎn)所在客戶(hù)端的 session id;如果不是臨時(shí)節(jié)點(diǎn),該值為 0
dataLength,該節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)長(zhǎng)度
numChildren,該節(jié)點(diǎn)子節(jié)點(diǎn)的個(gè)數(shù)
檢查狀態(tài) stat
stat [-w] path-w?添加一個(gè) watch(監(jiān)視器),如果節(jié)點(diǎn)內(nèi)容發(fā)生改變,會(huì)產(chǎn)生?NodeDataChanged?事件;如果刪除節(jié)點(diǎn),會(huì)產(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é)點(diǎn) set
set [-s] [-v version] path data?
修改已經(jīng)存在的節(jié)點(diǎn)的值
使用方法
[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é)點(diǎn)值之后,mZxid、mtime、dataVersion 都發(fā)生了變化。
刪除節(jié)點(diǎn) deleteall
deleteall path [-b batch size]?
使用方法
[zk:?localhost:2181(CONNECTED)?34]?delete?/mynode
刪除 /mynode,不會(huì)返回任何內(nèi)容。如果有子節(jié)點(diǎn)的時(shí)候,都會(huì)刪除。
刪除節(jié)點(diǎn) delete
delete [-v version] path
調(diào)用delete和set操作時(shí),如果指定znode版本號(hào),需要與當(dāng)前的版本號(hào)匹配。如果版本號(hào)不匹配,操作將會(huì)失敗。失敗的原因可能是在我們提交之前,該znode已經(jīng)被修改過(guò)了,版本號(hào)發(fā)生了增量變化。如果不指定版本號(hào),就是直接操作最新版本的 znode。
使用方法
[zk:?localhost:2181(CONNECTED)?15]?create?/mynode?hello
Created?/mynode
[zk:?localhost:2181(CONNECTED)?16]?delete?/mynode
如果要?jiǎng)h除的節(jié)點(diǎn)有子節(jié)點(diǎn),不能刪除
[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 就是方括號(hào)里面最后的數(shù)字,每次執(zhí)行命令都會(huì)自增。
[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)
語(yǔ)法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
打開(kāi)連接 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ù)。缺省的時(shí)候,會(huì)連接本地的 2181 端口。
退出連接 quit
quit
直接退出當(dāng)前的 zkCli 命令行。
強(qiáng)制同步 sync
sync pathsync方法會(huì)強(qiáng)制客戶(hù)端所連接的服務(wù)器狀態(tài)與leader的狀態(tài)同步,這樣在讀取 path 的值就是最新的值了。
ACL 操作
一個(gè)znode中不僅包含了存儲(chǔ)的數(shù)據(jù),還有?ACL(Access Control List)。znode的創(chuàng)建時(shí),可以給它設(shè)置一個(gè)ACL(Access Control List),來(lái)決定誰(shuí)可以對(duì)znode做哪些操作。
ACL 具有以下特點(diǎn):
ZooKeeper的權(quán)限控制是基于每個(gè)znode節(jié)點(diǎn)的,需要對(duì)每個(gè)節(jié)點(diǎn)設(shè)置權(quán)限
每個(gè)znode支持設(shè)置多種權(quán)限控制方案和多個(gè)權(quán)限
子節(jié)點(diǎn)不會(huì)繼承父節(jié)點(diǎn)的權(quán)限,客戶(hù)端無(wú)權(quán)訪問(wèn)某節(jié)點(diǎn),但可能可以訪問(wèn)它的子節(jié)點(diǎn)
ACL Permissions
| ACL 權(quán)限 | ACL 簡(jiǎn)寫(xiě) | 允許的操作 |
|---|---|---|
| CREATE | c | 創(chuàng)建子節(jié)點(diǎn) |
| READ | r | 獲取節(jié)點(diǎn)的數(shù)據(jù)和它的子節(jié)點(diǎn) |
| WRITE | w | 設(shè)置節(jié)點(diǎn)的數(shù)據(jù) |
| DELETE | d | 刪除子節(jié)點(diǎn) (僅下一級(jí)節(jié)點(diǎn)) |
| ADMIN | a | 設(shè)置 ACL 權(quán)限 |
權(quán)限相關(guān)命令
| 命令 | 語(yǔ)法 | 描述 |
|---|---|---|
| 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)證用戶(hù) |
| create | create [-s] [-e] path data acl | 創(chuàng)建節(jié)點(diǎn)時(shí)指明 ACL 權(quán)限 |
ACL Schemes
ZooKeeper內(nèi)置了一些權(quán)限控制方案,可以用以下方案為每個(gè)節(jié)點(diǎn)設(shè)置權(quán)限:
| 方案 | 描述 |
|---|---|
| world | 只有一個(gè)用戶(hù):anyone,代表所有人(默認(rèn)) |
| ip | 使用IP地址認(rèn)證 |
| auth | 使用已添加認(rèn)證的用戶(hù)認(rèn)證 |
| digest | 使用“用戶(hù)名:密碼”方式認(rèn)證 |
ACL是由鑒權(quán)方式、鑒權(quán)方式的ID和一個(gè)許可(permession)的集合組成。例如,我們想通過(guò)一個(gè)ip地址為10.0.0.1的客戶(hù)端訪問(wèn)一個(gè)znode。那么,我們需要為znode設(shè)置一個(gè)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)情況下時(shí) 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é)點(diǎn)數(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é)點(diǎn):
#使用IP非?192.168.100.1?的機(jī)器
[zk:?localhost:2181(CONNECTED)?0]?get?/node2
Authentication?is?not?valid?:?/node2?#沒(méi)有權(quán)限
[zk:?localhost:2181(CONNECTED)?1]?delete?/node2?#刪除成功(因?yàn)樵O(shè)置DELETE權(quán)限僅對(duì)下一級(jí)子節(jié)點(diǎn)有效,并不包含此節(jié)點(diǎn))
auth 方案
設(shè)置方式
addauth?digest?:?#添加認(rèn)證用戶(hù)
setAcl??auth::
示例:
[zk:?localhost:2181(CONNECTED)?22]?create?/mynode1?hello
Created?/mynode1
[zk:?localhost:2181(CONNECTED)?23]?addauth?digest?admin:admin?#添加認(rèn)證用戶(hù)
[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)證用戶(hù),可以直接讀取數(shù)據(jù),斷開(kāi)會(huì)話(huà)重連需要重新addauth添加認(rèn)證用戶(hù)
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)過(guò)SHA1及BASE64處理的密文,在SHELL中可以通過(guò)以下命令計(jì)算:
echo?-n?:?|?openssl?dgst?-binary?-sha1?|?openssl?base64
先來(lái)算一個(gè)密文密碼:
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
#沒(méi)有權(quán)限
Authentication?is?not?valid?:?/mynode2
[zk:?localhost:2181(CONNECTED)?12]?addauth?digest?admin:admin?#添加認(rèn)證用戶(hù)
[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é)點(diǎn)時(shí)指定 ACL
#添加?admin?用戶(hù)
[zk:?localhost:2181(CONNECTED)?2]?addauth?digest?admin:admin
#創(chuàng)建節(jié)點(diǎn)時(shí)賦予權(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
#斷開(kāi)會(huì)話(huà)重連需要重新addauth添加認(rèn)證用戶(hù)
[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é)點(diǎn)沒(méi)有權(quán)限時(shí),竟然可以使用 delete
[zk:?localhost:2181(CONNECTED)?25]?rmr?/mynode
Authentication?is?not?valid?:?/mynode
[zk:?localhost:2181(CONNECTED)?26]?delete?/mynode
zookeeper quota
zookeeper quota 機(jī)制支持節(jié)點(diǎn)個(gè)數(shù)(namespace)和空間大?。╞ytes)的設(shè)置。
zookeeper quota 保存在?/zookeeper/quota?節(jié)點(diǎn)下,可以設(shè)置該節(jié)點(diǎn)的 ACL 權(quán)限,以防其他人修改。
語(yǔ)法:listquota path
setquota -n|-b val pathdelquota [-n|-b] path
使用方法:
#?目前還沒(méi)有任何設(shè)置
[zk:?localhost:2181(CONNECTED)?9]?ls?/zookeeper/quota
[]
#?還沒(méi)有為?/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這個(gè)path下的znode?count個(gè)數(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é)點(diǎn)數(shù)超出了限制,也不會(huì)看到提示信息,zookeeper 只會(huì)在日志中提醒一下。
使用 listquota 列出了節(jié)點(diǎn)的設(shè)置的 quota,和節(jié)點(diǎn)實(shí)際的容量。
[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客戶(hù)端所有的命令介紹完畢!
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:
http://blog.csdn.net/feixiang2039/article/details/79810102


??? ?
感謝點(diǎn)贊支持下哈?
