ZooKeeper中的数据模型
2017-09-17 21:52
155 查看
原文链接:http://www.dubby.cn/detail.html?id=9026
本文主要介绍zk中的各个概念,详细介绍请继续关注后续的文章
zk中是一个有层次的命名,这一点很类似传统的文件管理系统。但是有一点不一样的,那就是每个目录既可以有内容,也可以有子目录。换句话说,那就是zk这个文件系统中,文件也可以是目录。还有一点,在zk中只有绝对目录,也就是用斜线
空字符(\u0000)不能作为目录命名。(这会影响zk的C语言客户端。)
\u0001 - \u001F 和 \u007F - \u009F这些字符都不能用作目录命名。
在zk这个文件系统中,每个节点都被叫做znode。Znode维护了一个信息统计的结构,包含了:数据改变的版本号、数据访问权限的改变、时间戳。版本号+时间可以帮助zk来检验数据更新是否合法。Znode每次更新,版本号都会自增。举个例子,zk每次收到数据改变的请求,也会同时获得请求改变的数据的版本号。这时,可以校验请求中的数据的版本号和真实的版本号是否一致,如果不一致,这次更新就会失败。
客户端可以在znode上设置观察者(类似监听器)。这个znode发生改变就会触发这个观察者,然后清楚这个观察者。
每个znode的数据都是可以读写的。每个znode都有一个访问权限列表(Access Control List /ACL)来限制谁可以做什么操作。
zk设计的目的并不是为了实现一个通用数据库,更不是一个大对象存储系统。他是为了协调数据,比如配置信息、状态信息、集合点等。这几类协调数据都有一个特点就是比较小:单位用kb来计算。zk的服务端和客户端都会有数据的合理性检查,来确保数据不会超过1M,但是,请注意,数据最好不要真的到这么大。如果真的不得不存储这么大的数据,那么我建议你使用其他分布式文件系统,比如:NFS或者HDFS,然后在zk上只存一个引用。
在zk中,也有临时节点这个概念。这个节点的生命周期和创建这个节点的session的生命周期一致,一旦session结束,这个节点也就会被删除。也正是因为这个特性,临时节点不允许有子节点。
在创建节点时,你可以请求zk来自动生成一个序列号追加在节点名之后,这个序列化有一个计数器来统计。每一个父节点只有一个唯一的计数器。当计数器超过2147483647时就会溢出。
3.6.0版本新功能
zk中还有容器节点这个概念。容器节点具有特殊目的,比如锁。当容器节点下最后一个子节点被删除,那么这个容器节点会在未来某个时刻被服务端删除。
因为这个原因,如果你操作容器节点时,你需要处理
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只有在节点创建和修改的时候会设置上
zxid会溢出吗?会的,不过他的实现是long,溢出的可能性很小很小……
每个节点都是由以下的字段组成:
czxid:代表节点创建时的zxid。
mzxid:代表节点最后一次修改的zxid。
pzxid:节点的子节点最后一次修改的zxid。
ctime:节点创建时的时间。
mtime:节点最后一次修改的时间。
version(dataVersion):节点数据修改的次数。
cversion:节点的子节点被修改的次数。
aversion(aclVersion):节点的控制权限列表(ACL)修改的次数。
ephemeralOwner:如果节点时临时节点,这个字段值为创建此节点的session的id。否则,此字段值为0。
dataLength:此节点值的长度。
numChildren:此节点的子节点的数量。
作者测试用的zk版本是3.4.9,其中部分字段和上述的不一致,没有
本文主要介绍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 Nodes3.6.0版本新功能
zk中还有容器节点这个概念。容器节点具有特殊目的,比如锁。当容器节点下最后一个子节点被删除,那么这个容器节点会在未来某个时刻被服务端删除。
因为这个原因,如果你操作容器节点时,你需要处理
KeeperException.NoNodeException,当出现这个异常是,你需要重新创建父节点(容器节点),然后再创建子节点。
2 ZooKeeper中的时间
Time in ZooKeeperzk中追踪时间又多种方式:
事物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学习之节点数据模型<十一>
- zookeeper 数据模型
- ZooKeeper系统模型之版本——保证分布式数据原子性操作。
- ZooKeeper数据模型
- ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念
- ZooKeeper系统模型之数据初始化。
- 【ZooKeeper Notes 14】数据模型
- Zookeeper数据模型之初探
- ZooKeeper系统模型之snapshot——数据快照。
- Zookeeper 01 数据模型
- ZooKeeper:数据模型
- Zookeeper的数据模型
- zookeeper介绍、数据模型、原理、应用场景
- 【转】ZooKeeper 数据模型
- ZooKeeper之(二)数据模型
- ZooKeeper 数据模型
- ZooKeeper数据模型
- zookeeper数据模型
- ZooKeeper 数据模型
- ZooKeeper之(二)数据模型