前言
上一章我们讲了zookeeper伪集群模式的搭建,这一章我们来用命令行对zookeeper进行一些操作,深入了解它的基本概念。
zookeeper数据结构
前面我们讲了zookeeper的基本概念。对于zookeeper的数据结构,其实我们已经有了初步的认识。
在zookeeper中,数据信息被保存在一个个数据节点上,这些节点被称为znode。znode是zookeeper中最小的数据单位,在znode下面又可以再挂znode,这样一层一层下去就形成了一个层次化的命名空间znode tree。它采用了类似文件系统的层级树状结构进行管理。见下图实例:
在zookeeper中,没一个数据节点都是一个znode,上图根目录下有两个节点,分别是app1和app2,其中,app1下面又有三个子节点,所有znode按层次化进行组织,形成一颗树,znode的节点路径标识方式和unix文件系统路径非常相似,都是由一些列使用斜杠(/)进行分割的路径表示,开发人员可以向这个节点写入数据,也可以在这个节点下面创建子节点。
命令行操作
下面,我们使用命令行来操作一下zookeeper。我们使用前面搭建好的zookeeper服务器。
- 通过客户端连接zookeeper服务器
###cd到zookeeper安装路径bin目录下,我的安装目录是/data/software/zookeeper-3.6.1
cd /data/software/zookeeper-3.6.1/bin
###连接本地zookeeper
./zkCli.sh
也可以使用./zkCli.sh -server ip:port 连接远程zookeeper服务器
连接成功后:
- 查看节点信息
###查看跟节点信息
ls /
可以看到,当前根节点下只有一个zookeeper节点,这是zookeeper自己的节点,我们暂时不用关心。
- 创建节点
使用create命令,可以创建一个zookeeper节点,命令如下:
create [-s][-e] path data acl
其中,-s指创建有序节点,-e创建临时节点,若不指定,则创建持久节点;acl用来进行权限控制。
- 创建顺序节点
###在根目录下创建节点zk-test并赋值123
create -s /zk-test 123
可以看到,我们创建的顺序节点 /zk-test,zookeeper自动在后面添加了序列号。接着执行 ls /zk-test0000000000 查看新创建的节点,下面没有子节点了,所以显示[]。再通过get /zk-test0000000000 查看节点的数据,返回结果是123.
- 创建临时节点
###创建临时节点并指定value
create -e /zk-temp 123
ls /zk-temp
get /zk-temp
临时节点在客户端会话结束后自动删除,下面我们使用quit命令退出客户端
再次连接服务端,使用ls /命令查看:
可以看到 /zk-temp节点已经消失。利用临时节点的这一特性,我们可以使用zookeeper实现分布式锁而不用担心客户端挂掉出现死锁的问题。
- 创建持久节点
###创建持久节点
create /zk-persistent 123
###查看节点
ls /zk-persistent
###获取节点value
get /zk-persistent
- 删除节点
delete [-v version] path
version是指当前节点的版本号
###删除节点
delete /zk-persistent
删除节点的时候,如果节点存在子节点,需要先删除子节点,再删除父节点。
- 使用ls -s path 查看节点状态
我们当前使用的zookeeper版本是3.6.1,是目前最新的版本,可以使用ls -s path 查看节点的状态信息,如果是老版本(3.5.0以前),请使用ls2 path查看节点状态信息。
查看根节点状态信息
ls -s /
cZxid:这是导致创建znode更改的事务ID。
mZxid:这是最后修改znode更改的事务ID。
pZxid:这是用于添加或删除子节点的znode更改的事务ID。
ctime:表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode创建时间。
mtime:表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode最近修改时间。
dataVersion:表示对该znode的数据所做的更改次数。
cversion:这表示对此znode的子节点进行的更改次数。
aclVersion:表示对此znode的ACL进行更改的次数。
ephemeralOwner:如果znode是ephemeral类型节点,则这是znode所有者的 session ID。 如果znode不是ephemeral节点,则该字段设置为零。
dataLength:这是znode数据字段的长度。
numChildren:这表示znode的子节点的数量。
小结
这一章我们利用zookeeper命令行来对zookeeper进行了一些节点上的操作,对它节点的基本概念应该有了更清晰的认识,方便我们后面在讨论zookeeper使用场景的时候,能够更加快速的了解其原理。