Zookeeper的Shell 客户端操作
命令 说明 参数
create [-s] [-e] path data acl 创建Znode -s 指定是顺序节点
-e 指定是临时节点
ls path [watch] 列出Path下所有子Znode
get path [watch] 获取Path对应的Znode的数据和属性
ls2 path [watch] 查看Path下所有子Znode以及子Znode的属性
set path data [version] 更新节点 version 数据版本
delete path [version] 删除节点, 如果要删除的节点有子Znode则无法删除 version 数据版本
rmr path 删除节点, 如果有子Znode则递归删除
setquota -n|-b val path 修改Znode配额 -n 设置子节点最大个数
-b 设置节点数据最大长度
history 列出历史记录
1:创建普通节点
create /app1 hello
2: 创建顺序节点
create -s /app3 world
3:创建临时节点
create -e /tempnode world
4:创建顺序的临时节点
create -s -e /tempnode2 aaa
5:获取节点数据
get /app1
6:修改节点数据
set /app1 xxx
7:删除节点
delete /app1 删除的节点不能有子节点
rmr /app1 递归删除
Znode 的特点
- 文件系统的核心是 Znode
- 如果想要选取一个 Znode, 需要使用路径的形式, 例如 /test1/test11
- Znode 本身并不是文件, 也不是文件夹, Znode 因为具有一个类似于 Name 的路径, 所以可以从逻辑上实现一个树状文件系统
- ZK 保证 Znode 访问的原子性, 不会出现部分 ZK 节点更新成功, 部分 ZK 节点更新失败的问题
- Znode 中数据是有大小限制的, 最大只能为1M
- Znode是由三个部分构成
- stat: 状态, Znode的权限信息, 版本等
- data: 数据, 每个Znode都是可以携带数据的, 无论是否有子节点
- children: 子节点列表
Znode 的类型
- 每个Znode有两大特性, 可以构成四种不同类型的Znode
- 持久性
- 持久 客户端断开时, 不会删除持有的Znode
- 临时 客户端断开时, 删除所有持有的Znode, 临时Znode不允许有子Znode
- 顺序性
- 有序 创建的Znode有先后顺序, 顺序就是在后面追加一个序列号, 序列号是由父节点管理的自增
- 无序 创建的Znode没有先后顺序
- 持久性
- Znode的属性
- dataVersion 数据版本, 每次当Znode中的数据发生变化的时候, dataVersion都会自增一下
- cversion 节点版本, 每次当Znode的节点发生变化的时候, cversion都会自增
- aclVersion ACL(Access Control List)的版本号, 当Znode的权限信息发生变化的时候aclVersion会自增
- zxid 事务ID
- ctime 创建时间
- mtime 最近一次更新的时间
- ephemeralOwner 如果Znode为临时节点, ephemeralOwner表示与该节点关联的SessionId
通知机制
-
通知类似于数据库中的触发器, 对某个Znode设置 Watcher, 当Znode发生变化的时候, WatchManager会调用对应的Watcher
-
当Znode发生删除, 修改, 创建, 子节点修改的时候, 对应的Watcher会得到通知
-
Watcher的特点
- 一次性触发 一个 Watcher 只会被触发一次, 如果需要继续监听, 则需要再次添加 Watcher
- 事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState, eventType, path
KeeperState EventType 触发条件 说明
None 连接成功
SyncConnected NodeCreated Znode被创建 此时处于连接状态
SyncConnected NodeDeleted Znode被删除 此时处于连接状态
SyncConnected NodeDataChanged Znode数据被改变 此时处于连接状态
SyncConnected NodeChildChanged Znode的子Znode数据被改变 此时处于连接状态
Disconnected None 客户端和服务端断开连接 此时客户端和服务器处于断开连接状态
Expired None 会话超时 会收到一个SessionExpiredException
AuthFailed None 权限验证失败 会收到一个AuthFailedException
会话
- 在ZK中所有的客户端和服务器的交互都是在某一个Session中的, 客户端和服务器创建一个连接的时候同时也会创建一个Session
- Session会在不同的状态之间进行切换: CONNECTING, CONNECTED, RECONNECTING, RECONNECTED, CLOSED
- ZK中的会话两端也需要进行心跳检测, 服务端会检测如果超过超时时间没收到客户端的心跳, 则会关闭连接, 释放资源, 关闭会话