ZooKeeper数据模型
2015-10-25 21:19
232 查看
ZooKeeper中可以创建一些节点,每一个节点都唯一对应着一个用斜线分割的绝对路径,可以称之为节点路径。并且可以为节点关联相应的数据。 这些节点构成类似于文件系统的树形一样的层次结构。
在zookeeper中,没有使用相对路径的节点。
除了下面几种情况,任何unicode字符都可以作为节点路径的一部分:
1. null 字符(\u0000)。
2. \u0001 - \u0019 和 \u007F - \u009F。
3. \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE - \uXFFFF , \uF0000 - \uFFFFF。
4. ‘.’可以作为路径名字的一部分,但是’.’和’..’不能单独作为路径的一部分。(例如/a/b/./c或者/a/b/../c)
5. ‘zookeeper’是保留字。
znode是版本控制的,它维护一个统计结构体,包含数据更改和ACL更改的版本号。这个结构体还包含时间戳字段。版本号和时间戳让ZooKeeper可以校验缓存,协调更新。
ZooKeeper中每个znode的Stat结构体由下述字段构成:
czxid:创建znode的事务的zxid
mzxid:最近修改znode的事务的zxid
ctime:znode的创建时间(以距离时间原点(epoch)的毫秒数表示)
mtime:znode的最近修改时间(以距离时间原点(epoch)的毫秒数表示)
version:znode的数据的修改次数
cversion:znode的子节点修改次数
aversion:znode的ACL修改次数
dataLength:znode的数据长度
numChildren:znode的子节点个数。
ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。
zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。
每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
对节点的每次修改将使得节点的版本号增加一。版本号有三种:version(znode数据修改的次数)、cversion(znode子节点修改的次数),以及aversion(znode的ACL修改次数)。
每次修改znode数据的时候,版本号会增加。客户端获取数据的同时,也会取得数据的版本号。执行更新或者删除操作时,客户端必须提供版本号。如果提供的版本号与数据的实际版本不匹配,则更新操作失败。
观察
客户端可以在znode上设置观察。对znode的修改将触发观察,然后移除观察。观察被触发时,ZooKeeper向客户端发送一个通知。
数据存取
存储在名字空间中每个znode节点里的数据是原子地读取和写入的。节点的访问控制列表(ACL)控制可以进行操作的用户。
ZooKeeper不是设计用来作为通用数据库或者大型对象存储的,而是用来存储协调数据的。协调数据的形式可能是配置、状态信息、聚合等等。各种形式的协调数据的一个共同特点是:它们通常比较小,以千字节来衡量。ZooKeeper客户端和服务器实现会进行检查,以保证znode数据小于1MB,但是平均的实际数据量应该远小于1MB。对较大数据的操作将导致某些操作比其他操作耗费更多时间,进而影响某些操作的延迟,因为需要额外的时间在网络和存储媒体间移动更多数据。如果需要大数据存储,通常方式是存储到块存储系统,如NFS或者HDFS中,然后在ZooKeeper中保存到存储位置的指针。
临时节点
ZooKeeper有临时节点的概念。临时节点在创建它的会话活动期间存在。
Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了。所以临时节点不能有子节点。
顺序节点:唯一命名
创建znode时,可以要求ZooKeeper在路径名后增加一个单调增加的计数器部分。这个计数器相对于znode的父节点是唯一的。计数器的格式是0d,也就是带有0填充的10个数字(这种格式是为了方便排序),比如说,PATH0000000001。注意:用于存储下一个顺序号的计数器是一个由父节点维护的有符号整数(4字节),所以计数器将在超过2147483647的时候溢出(导致名字成为PATH-2147483647)。
在zookeeper中,没有使用相对路径的节点。
除了下面几种情况,任何unicode字符都可以作为节点路径的一部分:
1. null 字符(\u0000)。
2. \u0001 - \u0019 和 \u007F - \u009F。
3. \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE - \uXFFFF , \uF0000 - \uFFFFF。
4. ‘.’可以作为路径名字的一部分,但是’.’和’..’不能单独作为路径的一部分。(例如/a/b/./c或者/a/b/../c)
5. ‘zookeeper’是保留字。
Znode
在ZooKeeper中,每一个节点都称之为zonde。znode是版本控制的,它维护一个统计结构体,包含数据更改和ACL更改的版本号。这个结构体还包含时间戳字段。版本号和时间戳让ZooKeeper可以校验缓存,协调更新。
ZooKeeper中每个znode的Stat结构体由下述字段构成:
czxid:创建znode的事务的zxid
mzxid:最近修改znode的事务的zxid
ctime:znode的创建时间(以距离时间原点(epoch)的毫秒数表示)
mtime:znode的最近修改时间(以距离时间原点(epoch)的毫秒数表示)
version:znode的数据的修改次数
cversion:znode的子节点修改次数
aversion:znode的ACL修改次数
dataLength:znode的数据长度
numChildren:znode的子节点个数。
ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。
zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。
每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
对节点的每次修改将使得节点的版本号增加一。版本号有三种:version(znode数据修改的次数)、cversion(znode子节点修改的次数),以及aversion(znode的ACL修改次数)。
每次修改znode数据的时候,版本号会增加。客户端获取数据的同时,也会取得数据的版本号。执行更新或者删除操作时,客户端必须提供版本号。如果提供的版本号与数据的实际版本不匹配,则更新操作失败。
观察
客户端可以在znode上设置观察。对znode的修改将触发观察,然后移除观察。观察被触发时,ZooKeeper向客户端发送一个通知。
数据存取
存储在名字空间中每个znode节点里的数据是原子地读取和写入的。节点的访问控制列表(ACL)控制可以进行操作的用户。
ZooKeeper不是设计用来作为通用数据库或者大型对象存储的,而是用来存储协调数据的。协调数据的形式可能是配置、状态信息、聚合等等。各种形式的协调数据的一个共同特点是:它们通常比较小,以千字节来衡量。ZooKeeper客户端和服务器实现会进行检查,以保证znode数据小于1MB,但是平均的实际数据量应该远小于1MB。对较大数据的操作将导致某些操作比其他操作耗费更多时间,进而影响某些操作的延迟,因为需要额外的时间在网络和存储媒体间移动更多数据。如果需要大数据存储,通常方式是存储到块存储系统,如NFS或者HDFS中,然后在ZooKeeper中保存到存储位置的指针。
临时节点
ZooKeeper有临时节点的概念。临时节点在创建它的会话活动期间存在。
Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了。所以临时节点不能有子节点。
顺序节点:唯一命名
创建znode时,可以要求ZooKeeper在路径名后增加一个单调增加的计数器部分。这个计数器相对于znode的父节点是唯一的。计数器的格式是0d,也就是带有0填充的10个数字(这种格式是为了方便排序),比如说,PATH0000000001。注意:用于存储下一个顺序号的计数器是一个由父节点维护的有符号整数(4字节),所以计数器将在超过2147483647的时候溢出(导致名字成为PATH-2147483647)。
相关文章推荐
- 安全参透之旅第2章 fping工具使用
- 进行蓝牙连接的两种方式
- LeetCode OJ:Convert Sorted Array to Binary Search Tree(将排序好的数组转换成二叉搜索树)
- hdoj 2524 矩形A + B
- hdoj2669Romantic【扩展欧几里得】
- WordPress代码高亮插件CodeColorer正确使用方法
- OOD沉思录 --- 类和对象的关系 --- 包含关系1
- Drupal7重置密码方法
- java学习资料
- 6.序列:字符串、列表和元组
- R语言笔记004——R批量读取txt文件
- 容器的综合应用:文本查询程序
- fork() || fork()和fork() && fork()笔试题
- Wow! Such City!(最短路)
- Cisco交换机常用命令
- Io及多线程
- 通过SQL Server 2008数据库复制实现数据库同步备份
- OOD沉思录 --- 类和对象的关系 --- 使用关系原则
- Linux配置CentOS永久IP地址
- mybatis(6)动态sql