目录
持久顺序节点 (Persistent Sequential):
临时顺序节点 (Ephemeral Sequential):
命令行语法
命令 | 说明 | 示例 |
---|---|---|
create | 创建一个节点,并设置其值 | create /path "initial value" |
get | 获取指定路径下的节点数据和状态 | get /path |
set | 设置指定路径下节点的数据 | set /path "new value" |
ls | 列出指定路径下的所有子节点 | ls /path |
delete | 删除指定路径下的节点 | delete /path |
rmr | 递归删除指定路径下的所有子节点及自身 | rmr /path |
stat | 显示指定节点的状态信息 | stat /path |
close | 关闭客户端会话 | close |
versions | 显示指定节点的版本号(Zookeeper 3.4.6 及以上支持) | versions /path |
wch | 订阅一个节点的watcher事件 | wch /path |
uwch | 取消订阅一个节点的watcher事件 | uwch /path |
cons | 显示客户端连接状态 | cons |
conf | 获取或设置客户端的会话超时时间(毫秒) | conf [timeout] |
启动Zookeeper客户端
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkCli.sh -server hadoop12:2181
显示所有操作命令
[zk: hadoop12:2181(CONNECTED) 1] help
查看当前znode
中所包含的内容
[zk: hadoop12:2181(CONNECTED) 0] ls /
[zookeeper]
查看当前节点详细数据
[zk: hadoop12:2181(CONNECTED) 5] ls -s /
[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
解释字段含义:
-
czxid: 创建节点的事务
每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改的总次序。每次修改都有唯一的zxid
zxid
,如果zxid1
小于zxid2
,那么zxid1
在zxid2
之前发生。 -
ctime:
znode
被创建的毫秒数(从 1970 年开始) -
mzxid:
znode
最后更新的事务zxid
-
mtime:
znode
最后修改的毫秒数(从 1970 年开始) -
pZxid:
znode
最后更新的子节点zxid
-
cversion:
znode
子节点变化号,znode
子节点修改次数 -
dataversion:
znode
数据变化号 -
aclVersion:
znode
访问控制列表的变化号 -
ephemeralOwner: 如果是临时节点,这是
znode
拥有者的session id
。如果不是临时节点则是 0。 -
dataLength:
znode
的数据长度 -
numChildren:
znode
子节点数量
Zookeeper节点类型
Zookeeper提供了几种不同类型的节点(称为znode
),每种类型的节点都有其特定的行为和用途。下面是Zookeeper中节点类型的概述:
持久节点 (Persistent):
- 当创建一个持久节点时,它会一直存在于Zookeeper中,直到被显式地删除。
- 即使客户端与Zookeeper服务器断开连接,该节点也不会被删除。
临时节点 (Ephemeral):
- 临时节点的存在依赖于创建它的客户端会话。
- 如果客户端会话结束(例如客户端崩溃或主动关闭连接),临时节点将被自动删除。
- 临时节点不能有子节点。
持久顺序节点 (Persistent Sequential):
- 这种类型的节点是持久节点的一种变体,但它在创建时会在节点名称后自动添加一个递增的数字序号。
- 序号是由父节点维护的一个单调递增的计数器。
- 节点创建后,即使客户端与Zookeeper服务器断开连接,该节点仍然存在,除非被显式删除。
临时顺序节点 (Ephemeral Sequential):
- 这种类型的节点结合了临时节点和持久顺序节点的特点。
- 在创建时,节点名称后会自动添加一个递增的数字序号。
- 如果客户端会话结束,该节点将被自动删除。
除了这些基本类型之外,还有一些额外的概念需要注意:
容器节点 (Container):
这是一种特殊类型的节点,主要用于装载子节点。当容器节点下面没有子节点时,该节点未来会被Zookeeper自动清除。
监听机制 (Watcher):
Zookeeper允许客户端注册监听器(watcher),以监控节点的变化。监听器可以针对节点的数据更改、子节点的添加或删除等事件进行注册。
创建两个普通节点(持久节点 + 不带序号)
[zk: localhost:2181(CONNECTED) 3] create /sanguo "diaochan"
Created /sanguo
[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei"
Created /sanguo/shuguo
获得节点的值
[zk: localhost:2181(CONNECTED) 5] get -s /sanguo
diaochan
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000003
mtime = Wed Aug 29 00:03:23 CST 2018
pZxid = 0x100000004
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
[zk: localhost:2181(CONNECTED) 6] get -s /sanguo/shuguo
liubei
cZxid = 0x100000004
ctime = Wed Aug 29 00:04:35 CST 2018
mZxid = 0x100000004
mtime = Wed Aug 29 00:04:35 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
创建带序号的节点(持久节点 + 带序号)
先创建一个普通的根节点 /sanguo/weiguo
[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
Created /sanguo/weiguo
创建带序号的节点
[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/xuchu "xuchu"
Created /sanguo/weiguo/xuchu0000000002
创建短暂节点(短暂节点 + 不带序号 or 带序号)
创建短暂的不带序号的节点
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo
创建短暂的带序号的节点
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo
在当前客户端是能查看到的
[zk: localhost:2181(CONNECTED) 3] ls /sanguo
[wuguo, wuguo0000000001, shuguo]
退出当前客户端然后再重启客户端
[zk: localhost:2181(CONNECTED) 12] quit
再次查看根目录下短暂节点已经删除
[zk: localhost:2181(CONNECTED) 0] ls /sanguo
[shuguo]
修改节点数据值
[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"
监听器原理
Zookeeper 提供了一种机制,允许客户端注册监听器以跟踪感兴趣的目录节点的变化。当目录节点发生变化(如数据改变、节点删除或子节点的增加或删除)时,Zookeeper 会通知客户端。这种监听机制确保了 Zookeeper 保存的任何数据的任何改变都能快速响应到监听了该节点的应用程序。
监听器原理流程
- Main()线程
- 创建Zookeeper客户端
- 创建两个线程:一个负责网络连接通信(connect),一个负责监听(listener)。
- 通过connect线程将注册的监听事件发送给Zookeeper。
- 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
- Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
- listener线程内部调用了process()方法。
常见的监听
监听节点数据的变化
get path [watch]
监听子节点增减的变化
ls path [watch]
监听器示例
1. 节点的值变化监听
在 hadoop14 主机上注册监听 /sanguo
节点数据变化
[zk: localhost:2181(CONNECTED) 26] get -w /sanguo
在 hadoop13 主机上修改 /sanguo
节点的数据
[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"
观察 hadoop14 主机收到数据变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
注意:在 hadoop13 再多次修改
/sanguo
的值,hadoop14 上不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。
2. 节点的子节点变化监听(路径变化)
在 hadoop14 主机上注册监听 /sanguo
节点的子节点变化
[zk: localhost:2181(CONNECTED) 1] ls -w /sanguo
[shuguo, weiguo]
在 hadoop13 主机 /sanguo
节点上创建子节点
[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
Created /sanguo/jin
观察 hadoop14 主机收到子节点变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
注意:节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。
3. 节点删除与查看
删除节点
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin
递归删除节点
[zk: localhost:2181(CONNECTED) 15] deleteall /sanguo/shuguo
查看节点状态
[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1