异度部落格

学习是一种生活态度。

0%

Zookeeper源码分析-数据模型

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

节点

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

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

zookeeper-data-model

节点类型

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 的信息包含下面一些字段:

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

Note:zxid = znode transaction id

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[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