Zookeeper常用节点命令

1 新增节点

create [-s] [-e] path data #其中-s 为有序节点,-e 临时节点

创建持久化节点并写入数据:

[zk: localhost:2181(CONNECTED) 0] create /hadoop "123456"
Created /hadoop
[zk: localhost:2181(CONNECTED) 1] get /hadoop
123456
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0x2
mtime = Sat Apr 11 19:15:47 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

 退出客户端在查看,是否能查到:

[zk: localhost:2181(CONNECTED) 3] quit
Quitting...
2020-04-11 19:29:52,410 [myid:] - INFO  [main:[email protected]] - Session: 0x17168d                                                                       c8c420000 closed
2020-04-11 19:29:52,412 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread                                                                       @519] - EventThread shut down for session: 0x17168dc8c420000
[root@iZ1la3d1xbmukrZ bin]# ./zkCli.sh
Connecting to localhost:2181
2020-04-11 19:29:54,955 [myid:] - INFO  [main:[email protected]] - Client environm                                                                       ent:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on                                                                        03/23/2017 10:13 GMT
2020-04-11 19:29:54,958 [myid:] - INFO  [main:[email protected]] - Client environm                                                                       ent:host.name=iZ1la3d1xbmukrZ
2020-04-11 19:29:54,958 [myid:] - INFO  [main:[email protected]] - Client environm                                                                       ent:java.version=1.8.0_131
2020-04-11 19:29:54,960 [myid:] - INFO  [main:[email protected]] - Client environm                                                                       ent:java.vendor=Oracle Corporation
2020-04-11 19:29:54,961 [myid:] - INFO  [main:[email protected]] - Client environm                                                                       ent:java.home=/home/zookeeper/jdk1.8.0_131/jre
2020-04-11 19:29:54,961 [myid:] - INFO  [main:[email protected]] - Client environm 
[zk: localhost:2181(CONNECTED) 0] get /hadoop
123456
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0x2
mtime = Sat Apr 11 19:15:47 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

创建持久化有序节点,此时创建的节点名为指定节点名 + 自增序号:

[zk: localhost:2181(CONNECTED) 1] create -s /a "a"
Created /a0000000001
[zk: localhost:2181(CONNECTED) 2] get /a0000000001
a
cZxid = 0x5
ctime = Sat Apr 11 19:35:03 CST 2020
mZxid = 0x5
mtime = Sat Apr 11 19:35:03 CST 2020
pZxid = 0x5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
[zk: localhost:2181(CONNECTED) 3] create -s /b "b"
Created /b0000000002

 创建临时节点,临时节点会在会话过期后被删除:

Created /b0000000002
[zk: localhost:2181(CONNECTED) 4] create -e /tmp "tmp"
Created /tmp
[zk: localhost:2181(CONNECTED) 5] quit
Quitting...
2020-04-11 20:25:24,342 [myid:] - INFO  [main:[email protected]] - Session: 0x17168dc8c420001 closed
2020-04-11 20:25:24,344 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x17168dc8c420001
[root@iZ1la3d1xbmukrZ bin]# ./zkCli.sh
WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0] get /tmp
Node does not exist: /tmp
[zk: localhost:2181(CONNECTED) 1]

创建临时有序节点,临时节点会在会话过期后被删除:

[zk: localhost:2181(CONNECTED) 2] create -s -e /aa 'aaa'
Created /aa0000000004
[zk: localhost:2181(CONNECTED) 3] create -s -e /bb 'nnn'
Created /bb0000000005
[zk: localhost:2181(CONNECTED) 4]

2 更新节点
更新节点的命令是 set ,可以直接进行修改,如下:

[zk: localhost:2181(CONNECTED) 4] get /hadoop
123456
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0x2
mtime = Sat Apr 11 19:15:47 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] set /hadoop "3456"
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0xc
mtime = Sat Apr 11 20:27:51 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 6] get /hadoop
3456
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0xc
mtime = Sat Apr 11 20:27:51 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 7]

可以基于版本号进行更改,此时类似于乐观锁机制,当你传入的数据版本号(dataVersion) 和当前节点的数据版本号不符合时,zookeeper 会拒绝本次修改:

[zk: localhost:2181(CONNECTED) 7] set /hadoop "345" 1
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0xd
mtime = Sat Apr 11 20:29:15 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 8] set /hadoop "345" 3
version No is not valid : /hadoop
[zk: localhost:2181(CONNECTED) 9]

3 删除节点
​ 删除节点的语法如下:

delete path [version]

和更新节点数据一样,也可以传入版本号,当你传入的数据版本号 (dataVersion),当前节点的数据版本号不符合时,zookeeper 不会执行删除操作。

[zk: localhost:2181(CONNECTED) 9] delete /hadoop 3
version No is not valid : /hadoop
[zk: localhost:2181(CONNECTED) 10] delete /hadoop 2
[zk: localhost:2181(CONNECTED) 11] get /hadoop
Node does not exist: /hadoop
[zk: localhost:2181(CONNECTED) 12]

要想删除某个节点及其所有后代节点,可以使用递归删除,命令为 rmr

[zk: localhost:2181(CONNECTED) 2] create /tmp "123"
Created /tmp
[zk: localhost:2181(CONNECTED) 3] create /tmp/wgr "123"
Created /tmp/wgr
[zk: localhost:2181(CONNECTED) 4] create /tmp/wgr/qwer "123"
Created /tmp/wgr/qwer
[zk: localhost:2181(CONNECTED) 5] create /tmp/wgr/qwer/re "123"
Created /tmp/wgr/qwer/re
[zk: localhost:2181(CONNECTED) 6] delete /tmp
Node not empty: /tmp
[zk: localhost:2181(CONNECTED) 7] get /tmp
123
cZxid = 0x15
ctime = Sat Apr 11 20:32:16 CST 2020
mZxid = 0x15
mtime = Sat Apr 11 20:32:16 CST 2020
pZxid = 0x16
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 1
[zk: localhost:2181(CONNECTED) 8]
[zk: localhost:2181(CONNECTED) 8] rmr /tmp
[zk: localhost:2181(CONNECTED) 9] get /tmp
Node does not exist: /tmp
[zk: localhost:2181(CONNECTED) 10]

查看节点

get path

[zk: localhost:2181(CONNECTED) 6] get /hadoop
3456
cZxid = 0x2
ctime = Sat Apr 11 19:15:47 CST 2020
mZxid = 0xc
mtime = Sat Apr 11 20:27:51 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

节点各个属性如下表。其中一个重要的概念是 Zxid(ZooKeeper TransactionId),ZooKeeper 节点的每一次更改都具有唯一的 Zxid,如果 Zxid1 小于 Zxid2,则Zxid1 的更改发生在 Zxid2 更改之前。

状态属性 说明
cZxid 数据节点创建时的事务 ID
ctime 数据节点创建时的时间
mZxid 数据节点最后一次更新时的事务 ID
mtime 数据节点最后一次更新时的时间
pZxid 数据节点的子节点最后一次被修改时的事务 ID
cversion 子节点的更改次数
dataVersion 节点数据的更改次数
aclVersion 节点的 ACL 的更改次数
ephemeralOwner 如果节点是临时节点, 则表示创建该节点的会话的
SessionID; 如果节点是持久节点, 则该属性值为 0
dataLength 数据内容的长度
numChildren 数据节点当前的子节点个数

当创建子节点的时候,pZxid会发生改变

Zookeeper常用节点命令

查看节点状态
可以使用 stat 命令查看节点状态, 它的返回值和 get 命令类似, 但不会返回节点数据 

[zk: localhost:2181(CONNECTED) 11] stat /hadoop
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x1e
mtime = Sat Apr 11 20:39:10 CST 2020
pZxid = 0x1e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 12]

查看节点列表
​ 查看节点列表有 ls path 和 ls2 path 两个命令,后者是前者的增强,不仅可以查看指定路径下的所有节点,还可以查看当前节点的信息

[zk: localhost:2181(CONNECTED) 12] ls /
[b0000000002, a0000000001, hadoop, zookeeper, tmp0000000006]
[zk: localhost:2181(CONNECTED) 13] ls2 /
[b0000000002, a0000000001, hadoop, zookeeper, tmp0000000006]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x1e
cversion = 13
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 5
[zk: localhost:2181(CONNECTED) 14]

4  监听器

get path [watch]
​ 使用 get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是 zookeeper 的触发器是一次性的 (One-time trigger),即触发一次后就会立即失效。

[zk: localhost:2181(CONNECTED) 18] get /hadoop watch
456
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x1f
mtime = Sat Apr 11 20:46:15 CST 2020
pZxid = 0x20
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 1
[zk: localhost:2181(CONNECTED) 19] set /hadoop 45678

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x21
mtime = Sat Apr 11 20:53:32 CST 2020
pZxid = 0x20
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
[zk: localhost:2181(CONNECTED) 20] set /hadoop 43
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x22
mtime = Sat Apr 11 20:53:46 CST 2020
pZxid = 0x20
cversion = 1
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 1
[zk: localhost:2181(CONNECTED) 21]

监听器stat path [watch]
​ 使用 stat path [watch] 注册的监听器能够在节点状态发生改变的时候,向客户端发出通知

[zk: localhost:2181(CONNECTED) 0] stat /hadoop watch
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x22
mtime = Sat Apr 11 20:53:46 CST 2020
pZxid = 0x20
cversion = 1
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 1
[zk: localhost:2181(CONNECTED) 1] set /hadoop 112233

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
cZxid = 0x1e
ctime = Sat Apr 11 20:39:10 CST 2020
mZxid = 0x26
mtime = Sat Apr 11 20:56:48 CST 2020
pZxid = 0x20
cversion = 1
dataVersion = 4
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 1

监听器ls\ls2 path [watch]
​ 使用 ls path [watch] 或 ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和删除操作。

[zk: localhost:2181(CONNECTED) 3] ls /hadoop watch
[hbase]
[zk: localhost:2181(CONNECTED) 4] create /hadoop/node3 "node3"

WATCHER::
Created /hadoop/node3

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop
[zk: localhost:2181(CONNECTED) 5] ls /hadoop watch
[node3, hbase]
[zk: localhost:2181(CONNECTED) 6] delete /hadoop/node3

WATCHER::
[zk: localhost:2181(CONNECTED) 7]
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop

[zk: localhost:2181(CONNECTED) 7]