# 基本操作命令

ZooKeeper命令行工具类似于Linux的shell环境，不过功能肯定不及shell啦，但是使用它我们可以简单的对ZooKeeper进行访问，数据创建，数据修改等操作.

命令行工具的一些简单操作如下：

* `zkCli.sh`客户端连接命令
* ls 与 ls2 命令
* get 与 stat 命令
* create 命令
* set 命令
* delete 命令

## 客户端连接

```
使用zkCli.sh -server 127.0.0.1:2181连接到 ZooKeeper 服务，连接成功后，系统会输出 ZooKeeper 的相关环境以及配置信息。
```

## 查看znode结构

* **ls命令：**&#x663E;示根目录下文件： `ls /` 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

```
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper]
```

第一次部署的ZoopKeeper集群，默认在根节点“/”下面有一个叫做/zookeeper的保留节点

* **ls2命令：**&#x663E;示根目录下文件：`ls2 /`查看当前节点数据**并能看到更新次数等数据**

```
[zk: localhost:2181(CONNECTED) 2] ls2 /
[zk-book, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
```

> status命令+ls命令的结果=ls2命令结果

## 创建节点，并设置初始内容

语法：

```
create [-s] [-e] path data acl
```

* `-e` 创建临时节点，当客户端断开连接，session回话结果，心跳时间检测，临时节点消失（注意非实时，而是会在比如10s，20s检测）
* `-s`创建顺序节点。

操作：

`create /zk "test"`创建一个新的 znode节点“ zk ”以及与它关联的字符串

```
[zk: localhost:2181(CONNECTED) 5] create /zk "test"
Created /zk
```

创建顺序节点：

```
$ create -s  /abc
Created /abc0000000001
$ create -s  /abc
Created /abc0000000002
$ create -s  /abc
Created /abc0000000003
$ ls /abc
[abc0000000001, abc0000000002, abc0000000003]
```

## 获取节点内容

`get /zk` 确认 znode 是否包含我们所创建的字符串

```
[zk: localhost:2181(CONNECTED) 7] get /zk
test
cZxid = 0x3
ctime = Fri Jul 20 10:39:45 CST 2018
mZxid = 0x3
mtime = Fri Jul 20 10:39:45 CST 2018
pZxid = 0x3
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
```

## 修改节点内容

语法：

```
set path data [version]
```

version - 乐观锁

操作：

`set /zk "zkbak"` 对 zk 所关联的字符串进行设置

```
[zk: localhost:2181(CONNECTED) 8] set /zk "zkbak"
cZxid = 0x3
ctime = Fri Jul 20 10:39:45 CST 2018
mZxid = 0x4
mtime = Fri Jul 20 10:40:51 CST 2018
pZxid = 0x3
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
```

> * cZxid - 创建了这个节后，zookeeper为这个节点分配的id
> * ctime - create time，节点创建的时间
> * mZxid - 修改后，zookeeper为这个节点分配的id
> * mtime - 节点修改的时间，当没有修改过，则创建时间和修改时间是一样的
> * pZxid - 子节点的id
> * cversion - 子节点的版本号
> * dataVersion - 当前数据的版本号
> * aclVersion - 权限版本号
> * ephemeralOwner - 根据值可区分是否是临时节点
> * dataLength - 数据的长度
> * numChildren - 下面有几个子节点

dataVersiond 值也由原来的0变成了1，这是因为刚才的更新操作导致该节点的数据版本也发生了变更。

## 删除节点

语法：

```
delete path [version]
```

操作:

`delete /zk` 将刚才创建的 znode 删除

```
[zk: localhost:2181(CONNECTED) 9] delete /zk
```

注意无法删除一个包含子节点的节点

```
[zk: localhost:2181(CONNECTED) 10] create /zk-book 123
Created /zk-book
[zk: localhost:2181(CONNECTED) 11] create /zk-book/child 123456
Created /zk-book/child
[zk: localhost:2181(CONNECTED) 12] delete /zk-book
Node not empty: /zk-book
```

## 关闭客户端连接

`quit`

## 帮助命令

`help`
