[TOC]
在zookeeper安裝目錄的bin目錄下有名為 zkCli.sh
的文件蝎宇,該文件可以作為客戶端連接到zookeeper弟劲。
1 使用zkCli.sh連接到zookeeper
# 一般語(yǔ)法
./zkCli.sh -timeout 0 -r -server ip:port
# 連接到主機(jī)h1 超時(shí)時(shí)間3秒
./zkCli.sh -timeout 3000 -server h1:2181
# 有類似如下的命令提示符就表示連接成功了
[zk: h1:2181(CONNECTED) 0]
另外,我們?cè)谇懊嬲f(shuō)過(guò)夫啊。整個(gè)zookeeper的節(jié)點(diǎn)結(jié)構(gòu)就和linux文件系統(tǒng)是一致的函卒。
都是只有一個(gè)最頂層的根節(jié)點(diǎn),其下有若干子節(jié)點(diǎn)撇眯。
隨便敲個(gè)字母就可以顯示出使用幫助了:
[zk: h1:2181(CONNECTED) 1] h
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
2 基本命令的使用
在一定角度來(lái)說(shuō)zookeeper是個(gè)存儲(chǔ)數(shù)據(jù)的東西报嵌。
所以他的操作命令大致可以分為增刪改查四類了
2.1 查詢操作
- ls path [watch]
列出指定節(jié)點(diǎn),類似于linux的ls命令
[zk: h1:2181(CONNECTED) 8] ls /
[zookeeper]
[zk: h1:2181(CONNECTED) 9] ls /zookeeper
[quota]
[zk: h1:2181(CONNECTED) 10] ls /zookeeper/quota
[]
[zk: h1:2181(CONNECTED) 11]
- stat path [watch]
列出指定節(jié)點(diǎn)的狀態(tài)信息,或者說(shuō)是元數(shù)據(jù)信息
[zk: h1:2181(CONNECTED) 11] stat /
# 節(jié)點(diǎn)被創(chuàng)建時(shí)的事務(wù)ID
cZxid = 0x0
# 節(jié)點(diǎn)創(chuàng)建時(shí)間
ctime = Thu Jan 01 08:00:00 CST 1970
# 最近一次更新時(shí)的事務(wù)ID
mZxid = 0x0
# 最近一次更新時(shí)間
mtime = Thu Jan 01 08:00:00 CST 1970
# 該節(jié)點(diǎn)的子節(jié)點(diǎn)列表最近一次被修改的事務(wù)ID
# 添加熊榛、刪除子節(jié)點(diǎn)會(huì)影響該值
pZxid = 0x0
# 子節(jié)點(diǎn)版本號(hào)
cversion = -1
# 數(shù)據(jù)版本號(hào)
dataVersion = 0
# ACL版本號(hào)
aclVersion = 0
# 創(chuàng)建臨時(shí)節(jié)點(diǎn)的事務(wù)ID
# 如果是持久節(jié)點(diǎn),則該值為0x0
ephemeralOwner = 0x0
# 當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)長(zhǎng)度
dataLength = 0
# 當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)目
numChildren = 1
[zk: h1:2181(CONNECTED) 12] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: h1:2181(CONNECTED) 13]
- get path [watch]
可以列出指定節(jié)點(diǎn)的數(shù)據(jù)
get /
get /zookeeper
- ls2 path [watch]
是ls的升級(jí)版锚国,列出子節(jié)點(diǎn)的同時(shí)列出節(jié)點(diǎn)的狀態(tài)信息
[zk: h1:2181(CONNECTED) 15] ls2 /
[zookeeper] # 子節(jié)點(diǎn)列表
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: h1:2181(CONNECTED) 16]
2.2 創(chuàng)建節(jié)點(diǎn)
create [-s] [-e] path data acl
s:可選,表示該節(jié)點(diǎn)為順序節(jié)點(diǎn)
e:可選玄坦,表示該節(jié)點(diǎn)為臨時(shí)節(jié)點(diǎn)
path:節(jié)點(diǎn)路徑
data:節(jié)點(diǎn)數(shù)據(jù)
acl:訪問(wèn)控制列表
# 創(chuàng)建節(jié)點(diǎn)/node_1,數(shù)據(jù)為dataOfNode_1
[zk: h1:2181(CONNECTED) 17] create /node_1 dataOfNode_1
Created /node_1
[zk: h1:2181(CONNECTED) 18] ls /
[zookeeper, node_1]
# 創(chuàng)建臨時(shí)節(jié)點(diǎn)/node_1/node_1_1 11
# 在會(huì)話結(jié)束后被刪除
[zk: h1:2181(CONNECTED) 20] create -e /node_1/node_1_1 11
Created /node_1/node_1_1
[zk: h1:2181(CONNECTED) 21] ls /node_1
[node_1_1]
[zk: h1:2181(CONNECTED) 22]
# 創(chuàng)建順序節(jié)點(diǎn)/node_1/node_1_2
[zk: h1:2181(CONNECTED) 22] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000001
[zk: h1:2181(CONNECTED) 23] create -s /node_1/node_1_3 13
Created /node_1/node_1_30000000002
[zk: h1:2181(CONNECTED) 26] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000003
[zk: h1:2181(CONNECTED) 27] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000004
[zk: h1:2181(CONNECTED) 28] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000005
[zk: h1:2181(CONNECTED) 29]
# 目前的/node_1節(jié)點(diǎn)
[zk: h1:2181(CONNECTED) 29] ls /node_1
[node_1_20000000005, node_1_1, node_1_30000000002, node_1_20000000001, node_1_20000000003, node_1_20000000004]
2.3 修改操作
set path data [version]
path : 節(jié)點(diǎn)路徑
data : 新數(shù)據(jù)
version : 版本號(hào)血筑,要么不寫,要么和上一次查詢出的版本號(hào)一致
該操作會(huì)影響節(jié)點(diǎn)的mZxid煎楣、dataVersion和mtime屬性
set /node_1 newdataOfNode_1
set /node_1 newdataOfNode_1 2
2.4 刪除操作
- delete
只能刪除不含子節(jié)點(diǎn)的節(jié)點(diǎn)
delete path [version]
path :要?jiǎng)h除的節(jié)點(diǎn)的路徑
- rmr
可以遞歸刪除節(jié)點(diǎn)
rmr path
2.5 quota
- setquota
對(duì)節(jié)點(diǎn)增加限制(配額)
setquota -n|-b val path
n:表示子節(jié)點(diǎn)的最大個(gè)數(shù)
b:表示數(shù)據(jù)值的最大長(zhǎng)度
val:子節(jié)點(diǎn)最大個(gè)數(shù)或數(shù)據(jù)值的最大長(zhǎng)度
path:節(jié)點(diǎn)路徑
最大節(jié)點(diǎn)數(shù)示例
# 創(chuàng)建節(jié)點(diǎn)/node_2
[zk: h1:2181(CONNECTED) 51] create /node_2 node2
Created /node_2
# 指定其子節(jié)點(diǎn)最大數(shù)為2
[zk: h1:2181(CONNECTED) 52] setquota -n 2 /node_2
Comment: the parts are option -n val 2 path /node_2
# 創(chuàng)建第2個(gè)子節(jié)點(diǎn)
[zk: h1:2181(CONNECTED) 53] create /node_2/node_2_1 21
Created /node_2/node_2_1
# 創(chuàng)建第2個(gè)子節(jié)點(diǎn)
[zk: h1:2181(CONNECTED) 54] create /node_2/node_2_2 22
Created /node_2/node_2_2
# 創(chuàng)建第3個(gè)子節(jié)點(diǎn)
# 此處雖然指定了最大兩個(gè)子節(jié)點(diǎn)豺总,但是并沒報(bào)錯(cuò),而是成功創(chuàng)建了
# 雖然創(chuàng)建成功了择懂,但是會(huì)在${dataDir}/zookeeper.out中記錄警告信息
[zk: h1:2181(CONNECTED) 55] create /node_2/node_2_3 23
[zk: h1:2181(CONNECTED) 56] ls /node_2
[node_2_1, node_2_2, node_2_3]
最大節(jié)點(diǎn)數(shù)警告信息
# 此處的zookeeper.out在zookeeper的 $dataDir目錄下
tail -2 /var/zookeeper/zookeeper.out
[myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=3 limit=2
[myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=4 limit=2
- listquota
列出指定節(jié)點(diǎn)的quota
listquota path
[zk: h1:2181(CONNECTED) 58] listquota /node_2
absolute path is /zookeeper/quota/node_2/zookeeper_limits
# 子節(jié)點(diǎn)個(gè)數(shù)為2,數(shù)據(jù)長(zhǎng)度-1表示沒限制
Output quota for /node_2 count=2,bytes=-1
# 當(dāng)前信息喻喳,節(jié)點(diǎn)數(shù)為4(超額了),數(shù)據(jù)長(zhǎng)度為11(包含子節(jié)點(diǎn)的數(shù)據(jù)長(zhǎng)度)
Output stat for /node_2 count=4,bytes=11
[zk: h1:2181(CONNECTED) 59]
- delquota
刪除quota
delquota [-n|-b] path
# 刪除/node_2對(duì)于子節(jié)點(diǎn)個(gè)數(shù)限制的quota
[zk: h1:2181(CONNECTED) 64] delquota -n /node_2
[zk: h1:2181(CONNECTED) 65] listquota /node_2
absolute path is /zookeeper/quota/node_2/zookeeper_limits
# -1表示不做限制
Output quota for /node_2 count=-1,bytes=-1
Output stat for /node_2 count=4,bytes=11
[zk: h1:2181(CONNECTED) 66]
2.6 ACL
此處的ACL(Access Control List)和Linux文件系統(tǒng)的中的那個(gè)訪問(wèn)控制列表有點(diǎn)類似。
權(quán)限主要有:
- CREATE : 創(chuàng)建子節(jié)點(diǎn)
- READ : 獲取節(jié)點(diǎn)數(shù)據(jù)和子節(jié)點(diǎn)列表
- WRITE : 更新節(jié)點(diǎn)數(shù)據(jù)
- DELETE : 刪除子節(jié)點(diǎn)
- ADMIN : 設(shè)置節(jié)點(diǎn)ACL的權(quán)限
與授權(quán)相關(guān)的幾個(gè)概念:
- shchema:權(quán)限模式,有IP和digest兩種
- ID:授權(quán)對(duì)象
- schema為IP時(shí)困曙,該值為具體的IP地址
- scheme為digest時(shí)表伦,該值為
userName:base64(sha1(userName:password))
- zookeeper的javaAPI提供了一個(gè)工具類
org.apache.zookeeper.server.auth.DigestAuthenticationProvider
可以快速生成加密的密文
- permission:權(quán)限谦去,指的就是上面所說(shuō)的五種權(quán)限
最終的組合為: schema + ID + permission
和ACL相關(guān)的命令
- getAcl
獲取指定節(jié)點(diǎn)的ACL信息
getAcl path
# 創(chuàng)建節(jié)點(diǎn)/node9,并指定其ACL:ip為192.168.161.1,權(quán)限為create,read,write,delete,damin
[zk: h1:2181(CONNECTED) 22] create /node9 data9 ip:192.168.161.1:crwda
Created /node9
[zk: h1:2181(CONNECTED) 23] getAcl /node9
'ip,'192.168.161.1
: cdrwa
# schema為digest,用戶名為hylexus,密碼為123(密文),權(quán)限:create,read,write,admin,delete
[zk: h1:2181(CONNECTED) 26] create /node10 data10 digest:hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=:crwad
Created /node10
[zk: h1:2181(CONNECTED) 27] getAcl /node10
'digest,'hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=
: cdrwa
[zk: h1:2181(CONNECTED) 28]
- setAcl
setAcl path acl
setAcl /node_3 digest:hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=:crwad
setAcl /node_4 ip:192.168.161.1:crawd
- addauth
注冊(cè)會(huì)話授權(quán)信息
addauth scheme auth
schema:可取ip或digest
auth
schema==digest時(shí)為 userName:password
schema==ip時(shí)為
# 用戶名:hylexus,密碼:123456
addauth digest hylexus:123456
其他命令
history : 列出命令歷史
redo : 該命令可以重新執(zhí)行指定命令編號(hào)的歷史命令,命令編號(hào)可以通過(guò)history查看
[zk: h1:2181(CONNECTED) 70] history
60 - ls /zookeeper
61 - get /node_2
……………………
……………………
# 重新執(zhí)行編號(hào)為60的命令
[zk: h1:2181(CONNECTED) 71] redo 60
[quota]
[zk: h1:2181(CONNECTED) 72]