# 基本操作命令

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`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiaoxiami.gitbook.io/zookeeper/zookeeper-cao-zuo-ming-ling/zookeeperke-hu-duan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
