zookeeper-04-基本命令

许嘉福
2023-12-01

转载:https://blog.csdn.net/hylexus/article/details/53352789

在zookeeper安装目录的bin目录下有名为 zkCli.sh 的文件,该文件可以作为客户端连接到zookeeper。

1 使用zkCli.sh连接到zookeeper

# 一般语法
./zkCli.sh

./zkCli.sh -timeout 0 -r -server ip:port

# 连接到主机h1 超时时间3秒
./zkCli.sh -timeout 3000 -server h1:2181

# 有类似如下的命令提示符就表示连接成功了
[zk: h1:2181(CONNECTED) 0] 

另外,我们在前面说过。整个zookeeper的节点结构就和linux文件系统是一致的。
都是只有一个最顶层的根节点,其下有若干子节点。

随便敲个字母就可以显示出使用帮助了:

[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 基本命令的使用

在一定角度来说zookeeper是个存储数据的东西。
所以他的操作命令大致可以分为增删改查四类了

2.1 查询操作

ls path [watch]

列出指定节点,类似于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]

列出指定节点的状态信息,或者说是元数据信息

[zk: h1:2181(CONNECTED) 11] stat /
# 节点被创建时的事务ID
cZxid = 0x0 
# 节点创建时间
ctime = Thu Jan 01 08:00:00 CST 1970
# 最近一次更新时的事务ID
mZxid = 0x0
# 最近一次更新时间
mtime = Thu Jan 01 08:00:00 CST 1970
# 该节点的子节点列表最近一次被修改的事务ID
# 添加、删除子节点会影响该值
pZxid = 0x0
# 子节点版本号
cversion = -1
# 数据版本号
dataVersion = 0
# ACL版本号
aclVersion = 0
# 创建临时节点的事务ID
# 如果是持久节点,则该值为0x0
ephemeralOwner = 0x0
# 当前节点的数据长度
dataLength = 0
# 当前节点的子节点数目
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]

可以列出指定节点的数据

格式:

get /

get /zookeeper

ls2 path [watch]

是ls的升级版,列出子节点的同时列出节点的状态信息

[zk: h1:2181(CONNECTED) 15] ls2 /
[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) 16]

2.2 创建节点

create [-s] [-e] path data acl

    s:可选,表示该节点为顺序节点
    e:可选,表示该节点为临时节点
    path:节点路径
    data:节点数据
    acl:访问控制列表
# 创建节点/node_1,数据为dataOfNode_1
[zk: h1:2181(CONNECTED) 17] create /node_1 dataOfNode_1
Created /node_1
[zk: h1:2181(CONNECTED) 18] ls /
[zookeeper, node_1]

# 创建临时节点/node_1/node_1_1 11
# 在会话结束后被删除
[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] 

# 创建顺序节点/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节点
[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 : 节点路径
    data : 新数据
    version : 版本号,要么不写,要么和上一次查询出的版本号一致。该操作会影响节点的mZxid、dataVersion和mtime属性

示例:

set /node_1 newdataOfNode_1
set /node_1 newdataOfNode_1 2

2.4 删除操作

delete 只能删除不含子节点的节点

delete path [version]

    path :要删除的节点的路径

rmr 递归删除节点

rmr path

2.5 quota

setquota 对节点增加限制(配额)

setquota -n|-b val path

    n:表示子节点的最大个数
    b:表示数据值的最大长度
    val:子节点最大个数或数据值的最大长度
    path:节点路径

最大节点数示例:

# 创建节点/node_2
[zk: h1:2181(CONNECTED) 51] create /node_2 node2
Created /node_2
# 指定其子节点最大数为2
[zk: h1:2181(CONNECTED) 52] setquota -n 2 /node_2
Comment: the parts are option -n val 2 path /node_2
# 创建第2个子节点
[zk: h1:2181(CONNECTED) 53] create /node_2/node_2_1 21
Created /node_2/node_2_1
# 创建第2个子节点
[zk: h1:2181(CONNECTED) 54] create /node_2/node_2_2 22
Created /node_2/node_2_2
# 创建第3个子节点
# 此处虽然指定了最大两个子节点,但是并没报错,而是成功创建了
# 虽然创建成功了,但是会在${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]

最大节点数警告信息:

# 此处的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

列出指定节点的quota

listquota path
[zk: h1:2181(CONNECTED) 58] listquota /node_2
absolute path is /zookeeper/quota/node_2/zookeeper_limits
# 子节点个数为2,数据长度-1表示没限制
Output quota for /node_2 count=2,bytes=-1
# 当前信息,节点数为4(超额了),数据长度为11(包含子节点的数据长度)
Output stat for /node_2 count=4,bytes=11
[zk: h1:2181(CONNECTED) 59]

delquota

删除quota,格式:

delquota [-n|-b] path

示例:

# 删除/node_2对于子节点个数限制的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文件系统的中的那个访问控制列表有点类似。

权限主要有:

CREATE : 创建子节点
READ : 获取节点数据和子节点列表
WRITE : 更新节点数据
DELETE : 删除子节点
ADMIN : 设置节点ACL的权限

与授权相关的几个概念:

shchema:权限模式,有IP和digest两种
ID:授权对象 
schema为IP时,该值为具体的IP地址
scheme为digest时,该值为 userName:base64(sha1(userName:password))
zookeeper的javaAPI提供了一个工具类org.apache.zookeeper.server.auth.DigestAuthenticationProvider 可以快速生成加密的密文
permission:权限,指的就是上面所说的五种权限
最终的组合为: schema + ID + permission

和ACL相关的命令

getAcl 获取指定节点的ACL信息

getAcl path
# 创建节点/node9,并指定其ACL:ip为192.168.161.1,权限为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(密文),权限: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 注册会话授权信息

addauth scheme auth

    schema:可取ip或digest
    auth
        schema==digest时为 userName:password
        schema==ip时为
# 用户名:hylexus,密码:123456
addauth digest hylexus:123456

其他命令

history : 列出命令历史

redo : 该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看

[zk: h1:2181(CONNECTED) 70] history
60 - ls /zookeeper
61 - get /node_2
……………………
……………………
# 重新执行编号为60的命令
[zk: h1:2181(CONNECTED) 71] redo 60
[quota]
[zk: h1:2181(CONNECTED) 72]
 类似资料: