与mysql、redis等软件同样,zookeeper的软件包中也提供了客户端程序用于对服务器上的数据进行操做。本节咱们就来学习zookeeper客户端的使用方法。不过在详细讲解zk客户端的使用方法以前,咱们会先来讨论zookeeper的数据存储结构,只有理解了zookeeper的数据存储结构,才会真正明白zk操做的真正含义。java
zookeeper采用树状结构对数据进行存储,整个数据存储结构很是相似于linux的文件系统。以下图所示,节点node_1的路径是/node_1,节点node_1_1的路径是/node_1/node_1_1。zookeeper就是经过对这些节点进行建立、删除、修改、读取等操做来完成系统功能的。node
在zookeeper的bin目录下,名为zkCli.sh的文件就是zookeeper为咱们提供的客户端脚本程序。咱们能够经过它操做zookeeper服务器上的数据。使用zkCli.sh链接zk服务器的命令格式:./zkCli.sh -timeout 0 -server ip:port
。这里的timeout参数是会话超时时间,单位是毫秒,若是在此时间内zk服务器没有收到客户端的心跳包,那么这个会话就失效了。与zk服务器创建链接以下图所示,注意到最后的提示符中有CONNECTED表明已经成功与服务器创建了链接。mysql
执行h
命令能够查看zookeeper支持的操做命令列表。linux
这些命令大体可分为增删改查4种类型,下面咱们对其进行一一介绍。redis
ls命令用于列出某个节点下的全部子节点信息。sql
此处列出了/节点下的所有子节点信息,因为咱们尚未建立任何节点,因此只有一个zookeeper节点(由zk本身默认建立)存在。api
create命令用于建立一个新的节点,它的命令格式create [-s] [-e] path data acl
。path是节点的路径,data是节点中存储的数据值,acl是节点的权限(权限相关内容将在java api部分讲解)。参数s表示建立一个顺序节点。服务器
上面的示例连续执行了3次create -s /node_1 123
命令,因为加了参数-s,因此zk会自动在建立的节点名字后面增长一个后缀,而且后缀名字是递增的。
参数e表示建立的是一个临时节点,临时节点只在本会话内有效,登出以后临时节点就会被删除。学习
下面例子建立了一个新的/node_1节点,用stat命令查看节点的信息以下:spa
在zookeeper中,每次对数据节点的写操做都是一个事务,每一个事务都有一个惟一的事务id做为这个事务的标识。
cZxid就是建立这个节点的事务id。
ctime是建立这个节点的时间。
mZxid是最后更新该节点的事务id。
mtime是节点被最后更新的时间。
pZxid是节点的子节点列表被最后一次更新的事务id。子节点列表被更新只有两种状况,分别是“增长子节点”和“删除子节点”。修改子节点的数据内容不包括在内。
cversion是当前节点的子节点的变动版本号。
dataVersion当前节点存储数据内容的变动版本号。
aclVersion当前数据节点acl的变动版本号。上面3个版本号都可以用于实现乐观锁。
ephemeralOwner为建立该临时节点的事务id。若是是持久节点,那么该值固定为0。
dataLength表示当前节点存储数据内容的长度。
numChildren表示当前节点包含的子节点个数。
get命令能够获取一个节点存储的数据内容,同时能够获取该节点的stat信息。
ls2除了能够列出当前节点的全部子节点,还能列出当前节点的stat信息。
delete命令能够用于删除一个节点,但它只能删除没有任何子节点的节点。在下面的例子中,节点/node_1中有一个子节点/node_1/node_1_1。因此不能用delete命令删除节点/node_1。
以上就是zookeeper客户端提供的比较重要的命令。注意在zookeeper的全部写操做中,都有一个version字段,能够利用这个字段实现乐观锁。