# Zookeeper源码分析-数据模型

- URL: https://www.yidoo.xyz/zookeeper-data-model
- 作者: 核动力蜗牛
- 发布时间: 2014-09-13
- 更新时间: 2014-09-13
- 分类: Zookeeper源码分析
- 标签: zookeeper

本文主要介绍 Zookeeper 的数据模型，包括 Zookeeper 的数据视图，节点类型以及节点所包含的信息。

# 节点

Zookeeper 的数据视图采用的是类似 Unix 的数据视图，但是并没有引入文件系统的相关概念：目录和文件，而是引入了节点的概念，称为 Znode。它是 Zookeeper 最小的组成单元，每个 Znode 包含三部分组成：

- **data**：表示节点所存储的数据，单个节点存储数据不能超过 1M。
- **stat**：表示节点的信息，例如节点创建时间，节点的版本，节点的权限等信息。
- **children**:表是所包含的子节点。

![zookeeper-data-model](https://www.yidoo.xyz/images/2cdee8fc81264846cf4224145c86021e.jpg)

# 节点类型

Zookeeper 中的节点类型可以分为三种：

- 持久节点（Perisient Node），这类节点在创建之后将一直存在，知道有客户端对它进行显示删除，也就是说它不会因为创建其的 client 的关闭而消失。
- 临时节点（Ephemeral Node），这类节点的生命周期与创建它们的 client 绑定。也就是说当 client 的 session 关闭时，其所创建的临时节点也将被删除。这里有一点需要注意的是 session 关闭，而不是 connection loss。因为 zookeeper 的 client 支持 session 转移，也就是当所连接的 server 出现网络连接断开或者 server down 掉的情况，client 将自动选择 zookeeper 集群中的其他节点进行连接，同时将 session 转移到其他节点上。这种情况只能算 connection loss，而不会造成 session 关闭。除非，该 client 无法连接所有的节点，支持 session timeout。
- 时序节点（Sequential Node）,这类节点在创建节点的时候，zookeeper 会自动为其添加一个数字后缀%10d，例如/test-0000000001。不过这类节点是不能单独存在的，需要同持久节点或临时节点组合使用形成：
    - Perisient Sequential Node
    - Ephemeral Sequential Node

# 节点信息

Znode 的信息包含下面一些字段：

<table>
<tr>
<td>czxid</td>
<td>创建这个znode的zxid</td>
</tr>
<tr>
<td>mzxid</td>
<td>最后一次修改这个znode的zxid</td>
</tr>
<tr>
<td>ctime</td>
<td>该znode创建时间</td>
</tr>
<tr>
<td>mtime</td>
<td>该znode最后一次修改的时间</td>
</tr>
<tr>
<td>version</td>
<td>该znode的version，也就是该znode的修改次数。</td>
</tr>
<tr>
<td>cversion</td>
<td>该znode的子节点的version</td>
</tr>
<tr>
<td>aversion</td>
<td>该znode的ACL信息version</td>
</tr>
<tr>
<td>ephemeralOwner</td>
<td>如果该znode是ephemeral node，此字段就是对应client的session；否则为0。</td>
</tr>
<tr>
<td>dataLength</td>
<td>The length of the data field of this znode.</td>
</tr>
<tr>
<td>numChildren</td>
<td>子节点个数</td>
</tr>
</table>
Note:zxid = znode transaction id

查看节点信息，可以使用 zkCli 中的 get 命令。

```
[zk: localhost:2181(CONNECTED) 15] get /zk_test
my_data
cZxid = 0x8
ctime = Sun Sep 14 14:43:56 CST 2014
mZxid = 0x8
mtime = Sun Sep 14 14:43:56 CST 2014
pZxid = 0x10
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2
```
