Zookeeper具有命令行界面(CLI),用于和ZooKeeper服务器集群的简单交互,有助于调试和解决问题。要想使用ZooKeeper CLI,首先需要有运行着的ZooKeeper服务器(可通过bin/zkServer运行),然后运行ZooKeeper客户端。一旦客户端成功连接服务端,就可以使用以下命令对ZooKeeper进行操作。
常用命令
1.创建节点
使用create命令,可以创建一个ZooKeeper节点,
create [-s] [-e] path data acl
其中,-s 和 -e用来指定节点属性,顺序或临时节点,若不指定-e,则表示持久节点;acl为权限控制。
1.1创建顺序节点
使用 create -s /zk-sequence 123 命令 创建zk-sequence顺序节点
可以看到zk-sequence节点后面自动添加了一串数字
1.2创建临时节点
使用create -e /zk-temp 123 命令创建zk-temp临时节点
临时节点在客户端会话结束后,就会自动删除,使用quit退出客户端
再使用客户端连接服务端,并使用ls /命令查看根目录下的节点
可以看到临时节点zk-temp已经消失了。
2.读取节点
读取节点可以通过ls 和 get命令,ls命令可以列出ZooKeeper指定节点下的第一级的所有子节点;get命令可以获取ZooKeeper指定节点的数据内容和属性信息。
若获取根节点下面的所有子节点,使用ls / 命令即可 前文已经用过了。
若想要获取某个节点数据内容 和 元数据(描述性信息),使用get / 命令即可,如获取前文创建的顺序节点
3.更新节点
使用set命令可以更新指定节点的数据内容,用法如下
set path data [version]
针对上面读取的同一个节点,更新节点后,可以看到dataVersion由0变为了1
并且可以看到此节点的内容数据由原来的“123”变为了“data-update”
4.删除节点
delete /path 删除节点。
rmr /path 删除节点及子节点。
可以看到 FirstZnode0000000001节点已经被删除。
总结概念
至此,对于ZooKeeper基本对象Znode节点和层次命名空间,我们已经有了概念。
ZooKeeper提供的命名空间更像一个标准的文件系统。名称是被“/”分割开的路径元素序列。ZooKeeper中的每个节点由路径进行唯一标识。
不像标准的文件系统,ZooKeeper命名空间中的每个Znode节点都有与之相关的内容数据以及子节点。它就像一个允许Znode既是文件同时也是目录的文件系统。(ZooKeeper用来存储协调数据:状态信息、配置、位置信息等,每个节点存储的数据通常是很小的,以字节为单位。)我们使用术语Znode来称呼ZooKeeper的节点。
Znode保有一个stat的结构,包含了 数据修改的版本号,ACL的变化,和时间戳信息 用来做缓存验证和协调更新。每次znode的数据变化,版本号的增加。举个例子,当一个客户端检索数据,它也会收到数据的版本信息。
czxid. 节点创建时的zxid.
mzxid. 节点最新一次更新发生时的zxid.
ctime. 节点创建时的时间戳.
mtime. 节点最新一次更新发生时的时间戳.
dataVersion. 节点数据的更新次数.
cversion. 其子节点的更新次数.
aclVersion. 节点ACL(授权信息)的更新次数.
ephemeralOwner. 如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是临时节点, ephemeralOwner值为0. 至于什么是临时节点, 请看前后的讲述.
dataLength. 节点数据的字节数.
numChildren. 子节点个数.
znode节点的状态信息中包含czxid和mzxid, 那么什么是zxid呢? ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
ZooKeeper也有临时节点的概念,这些znode只存在于创建它的当前会话状态为活跃,一旦会话结束,临时节点也会消失。当你想要实现断开连接会被撤销的事务,临时节点非常好用。