您的位置:首页 > 其它

ZooKeeper中的数据模型

2017-09-17 21:52 155 查看
原文链接:http://www.dubby.cn/detail.html?id=9026

本文主要介绍zk中的各个概念,详细介绍请继续关注后续的文章

0 简述

目录等价于路径,本人常用路径这个词,但是为了让读者更好的对比文件系统,所以尽量使用目录这个词,如果全文有我不经意间使用的路径,那么请见谅,这就是目录的意思

zk中是一个有层次的命名,这一点很类似传统的文件管理系统。但是有一点不一样的,那就是每个目录既可以有内容,也可以有子目录。换句话说,那就是zk这个文件系统中,文件也可以是目录。还有一点,在zk中只有绝对目录,也就是用斜线
/
分割的目录,没有相对目录。任何unicode字符都可以被用作zk中目录的命名,不过要满足下面的约束:

空字符(\u0000)不能作为目录命名。(这会影响zk的C语言客户端。)

\u0001 - \u001F 和 \u007F - \u009F这些字符都不能用作目录命名。

.
可以作为命名中的一部分,但是
.
..
不能像文件系统一样代表某个目录,因为zk没有相对路径,
"/a/b/./c"
or
/a/b/../c
这种命名都是不合法的。


zookeeper
是保留字,不能使用。


1 节点

ZNodes

在zk这个文件系统中,每个节点都被叫做znode。Znode维护了一个信息统计的结构,包含了:数据改变的版本号、数据访问权限的改变、时间戳。版本号+时间可以帮助zk来检验数据更新是否合法。Znode每次更新,版本号都会自增。举个例子,zk每次收到数据改变的请求,也会同时获得请求改变的数据的版本号。这时,可以校验请求中的数据的版本号和真实的版本号是否一致,如果不一致,这次更新就会失败。

1.1 观察者

Watches

客户端可以在znode上设置观察者(类似监听器)。这个znode发生改变就会触发这个观察者,然后清楚这个观察者

1.2 数据权限

Data Access

每个znode的数据都是可以读写的。每个znode都有一个访问权限列表(Access Control List /ACL)来限制谁可以做什么操作。

zk设计的目的并不是为了实现一个通用数据库,更不是一个大对象存储系统。他是为了协调数据,比如配置信息、状态信息、集合点等。这几类协调数据都有一个特点就是比较小:单位用kb来计算。zk的服务端和客户端都会有数据的合理性检查,来确保数据不会超过1M,但是,请注意,数据最好不要真的到这么大。如果真的不得不存储这么大的数据,那么我建议你使用其他分布式文件系统,比如:NFS或者HDFS,然后在zk上只存一个引用。

1.3 临时节点

Ephemeral Nodes

在zk中,也有临时节点这个概念。这个节点的生命周期和创建这个节点的session的生命周期一致,一旦session结束,这个节点也就会被删除。也正是因为这个特性,临时节点不允许有子节点。

1.4 序列节点–唯一命名

Sequence Nodes – Unique Naming

在创建节点时,你可以请求zk来自动生成一个序列号追加在节点名之后,这个序列化有一个计数器来统计。每一个父节点只有一个唯一的计数器。当计数器超过2147483647时就会溢出。

1.5 容器节点

Container Nodes

3.6.0版本新功能

zk中还有容器节点这个概念。容器节点具有特殊目的,比如锁。当容器节点下最后一个子节点被删除,那么这个容器节点会在未来某个时刻被服务端删除。

因为这个原因,如果你操作容器节点时,你需要处理
KeeperException.NoNodeException
,当出现这个异常是,你需要重新创建父节点(容器节点),然后再创建子节点。

2 ZooKeeper中的时间

Time in ZooKeeper

zk中追踪时间又多种方式:

事物ID(zxid):每一个改变zk状态的操作都会增加zxid(ZooKeeper Transaction Id)。这个值反映了zk正题所有变化的总量。每个操作都会有一个唯一的zxid,如果zxid1比zxid2小,那么zxid1一定发生在zxid之前。

版本号(version numvers):对某个节点来说,每次改变,都回让这个节点的版本号自增。每个节点有3个版本号,分别是:dataVersion——节点数据改变的次数,cversion——节点的子节点改变的次数,aclVersion——节点ACL改变的次数。

时间单元(ticks):zk集群中,使用ticks来定义事件的时间,比如状态上传,session 超时时间,连接超时时间。tick time间接公开了最短的session超时时间(session的超时时间是tick time的两倍)

如果一个客户端请求了一个session超时时间比最短的还要短服务器将会恢复客户端最短的超时时间。

真正的时间(real time):zk只有在节点创建和修改的时候会设置上
ctime
mtime
,其他都不会使用真实的时间。

zxid会溢出吗?会的,不过他的实现是long,溢出的可能性很小很小……

3 ZooKeeper中的统计数据结构

ZooKeeper Stat Structure

每个节点都是由以下的字段组成:

czxid:代表节点创建时的zxid。

mzxid:代表节点最后一次修改的zxid。

pzxid:节点的子节点最后一次修改的zxid。

ctime:节点创建时的时间。

mtime:节点最后一次修改的时间。

version(dataVersion):节点数据修改的次数。

cversion:节点的子节点被修改的次数。

aversion(aclVersion):节点的控制权限列表(ACL)修改的次数。

ephemeralOwner:如果节点时临时节点,这个字段值为创建此节点的session的id。否则,此字段值为0。

dataLength:此节点值的长度。

numChildren:此节点的子节点的数量。

作者测试用的zk版本是3.4.9,其中部分字段和上述的不一致,没有
version
替代的是
dataVersion
,没有
aversion
替代的是
aclVersion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zookeeper