zookeeper cli 常用命令解析

zookeeper CLI

1,查看所有命令

启动zookeeper并使用bin目录下的zkCli.sh连接zookeeper服务器,输入任何zookeeper不能识别的命令,zookeeper都会列出所有可供使用的命令:

[zk: 127.0.0.1:2184(CONNECTED) 105] k
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,命令解析

创建节点:
create [-s] [-e] path data acl

-s 有序节点

一个znode还可以设置为有序(sequential)节点。一个有序znode节点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。

-e 临时节点

znode节点可以是持久(persistent)节点,还可以是临时(ephemeral)节点。持久的znode只能通过调用delete来进行删除。临时的znode与之相反,当创建该节点的客户端崩溃或关闭了与ZooKeeper的连接时,这个节点就会被删除。因为临时的znode在其创建者的会话过期时被删除,所以我们现在不允许临时节点拥有子节点。

总之,znode一共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ephemeral_sequential)。

data 节点保存的数据

acl 权限相关内容,暂不考虑

创建一个持久节点

[zk: 127.0.0.1:2184(CONNECTED) 7] create /test testdata
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 8] ls /
[zookeeper, test]

创建一个临时节点

[zk: 127.0.0.1:2184(CONNECTED) 9] create -e /testephemeral testdata2
Created /testephemeral
[zk: 127.0.0.1:2184(CONNECTED) 11] ls /
[zookeeper, test, testephemeral]

ctrl+c断开与服务端连接在查看

WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[zookeeper, test]

临时节点已经被移除了

创建有序节点

[zk: 127.0.0.1:2184(CONNECTED) 4] create -s /testsquence testdata2
Created /testsquence0000000008
[zk: 127.0.0.1:2184(CONNECTED) 5] ls /
[testsquence0000000008, zookeeper, test]

它会自动在我们指定的path后面追加一个序列号。

节点状态
stat path [watch]

watch 添加监视器,后面再说

列出节点/test的状态

[zk: 127.0.0.1:2184(CONNECTED) 10] stat /test             
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

属性说明

状态属性 说明
cZxid 节点创建的事务zxid。每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
ctime znode的创建时间
mzxid znode最后修改的zxid
mtime znode最后修改时间
pZxid znode最后更新的子节点zxid
cversion znode子节点变化号,每变化一次就自增1
dataversion znode数据变化号,数据每变化一次就自增1(每次更新读取最新的值,可用于实现类似数据库乐观锁功能)
aclVersion znode访问控制列表的变化号
ephemeralOwner 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0
dataLength znode的数据长度
dataLength znode子节点数量

查询数据
get path [watch]

查询节点/test的数据

[zk: 127.0.0.1:2184(CONNECTED) 19] get /test
testdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

嗯,就是data的值加上状态信息。

列出节点

ls   path [watch]
ls2 path [watch]

列出根节点信息

[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[testsquence0000000008, zookeeper, test]
[zk: 127.0.0.1:2184(CONNECTED) 1] ls2 /
[testsquence0000000008, zookeeper, test]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x25
cversion = 15
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

ls2 想当于在ls的基础上加上了当前节点的状态信息。

设置数据
set path data [version]

data 要设置的数据

version 数据版本号,当指定的版本号与节点当前数据版本号相同时才设置

设置节点/test数据为newdata

[zk: 127.0.0.1:2184(CONNECTED) 33] set /test newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 127.0.0.1:2184(CONNECTED) 34] get /test        
newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

有没有发现dataVersion从0变成了1,这个就是和最后一个参数version关联的。

指定一个错误的version更新数据

[zk: 127.0.0.1:2184(CONNECTED) 59] set /test nnn  0
version No is not valid : /test

失败......

我们用正确的试试

[zk: 127.0.0.1:2184(CONNECTED) 61] set /test nnn  1                                   
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x2a
mtime = Wed May 08 06:46:12 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

成功了,然后dataVersion又从1变成了2

删除节点

delete path [version]
rmr path

version : 版本号,和set命令一样中的意思一样,版本相同才能删。

delete和rmr的不同之处是在有子节点的情况下delete不能删除,而rmr可以级联删除子节点。

使用delete删除/test

[zk: 127.0.0.1:2184(CONNECTED) 73] delete /test                                
[zk: 127.0.0.1:2184(CONNECTED) 74] ls /
[testsquence0000000008, zookeeper]

使用delete删除一个有子节点的试试

[zk: 127.0.0.1:2184(CONNECTED) 77] create /test tt                   
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 78] create /test/child tt
Created /test/child
[zk: 127.0.0.1:2184(CONNECTED) 80] delete /test
Node not empty: /test

是的,不能删除有子节点的

使用rmr删除有子节点的/test试试

[zk: 127.0.0.1:2184(CONNECTED) 85] rmr /test            
[zk: 127.0.0.1:2184(CONNECTED) 86] ls /
[testsquence0000000008, zookeeper]

删除成功

watch用法

Watch机制: 一个zk的节点可以被监控,包括这个目录中存储的数据的修改,子节点目录的变化,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端。

通过ls对节点/test创建一个watch

[zk: 127.0.0.1:2184(CONNECTED) 92] ls /test mywatch
[zk: 127.0.0.1:2184(CONNECTED) 94] delete /test

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/test

当删除该节点时我们收到了通知

上一篇:代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端


下一篇:kafka manager添加集群出现错误KeeperErrorCode