zookeeper中的一些概念

翻译自:

ZooKeeper Programmer's Guide http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html


之前简单翻译的,因为感觉网上的好多概念都不准确,不过翻译了个差不多,也没发现啥成果,而且看到网上已经有人翻译了。因此整合了一下别人的翻译和我自己的翻译重新整理了一下。

The ZooKeeper DataModel

 

Zk 拥有一个层次化的命名空间,其很像分布式的文件系统。他们唯一的区别是,命名空间中的每一个node包括children node都可以和数据关联起来。这就好像一个文件系统中可以把一个文件也当做目录。

 所有的Unicode字符都可以作为一个目录,除以下几点的约束之外:

null字符(\u0000)不可以作为一个个目录名称的一部分;

下面的这些字符不能用,因为会出现现实异常:(\u0001 - \u0019 and \u007F - \u009F)

下面的这些字符是不被允许的(\ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE - \uXFFFF(where X is a digit 1 - E), \uF0000 - \uFFFFF.)

“.”字符可以作为一个名字当中的一部分,但是“.”“..”不可以作为路径中一个节点的名字,并且zk中也不支持相对路径。下面的写法是不合法的:"/a/b/./c" or "/a/b/../c".

ZNodes

在zk树中的每一个节点都被称为znode。Znode们负责维护着一个状态结构,状态结构中每一次数据或者是acl权限变化的版本号,并且有时间戳。Znode中的数据每一次的变化都会导致版本号增加。比如,当一个客户端检索一个数据的时候,它同时也检索了数据的版本。当一个客户端提交一个update或者是delete操作的时候,客户端会提供znode数据变化的版本号,如何提供的版本和数据实际变化的版本不一样,那么更新失败。

 

Watches

       客户端可以设置watches在zondes上,znode变化会给client发生通知,并且清除监听(如果需要再次监听,那么需要再次设置监听)。

Data Access

       存储在znode当中的数据以一种原子的方式进行读或者写。读的话那么得到和这个znode相关的所有bytes,写的话那么替换和这个znode相关的所以数据。每个节点用于访问控制列表(acl)

       ZooKeeper不是设计用来作为通用数据库或者大型对象存储的,而是用来存储协调数据的。协调数据的形式可能是配置、状态信息、聚合等等。各种形式的协调数据的一个共同特点是:它们通常比较小,以千字节来衡量。ZooKeeper客户端和服务器实现会进行检查,以保证znode数据小于1MB,但是平均的实际数据量应该远小于1MB。对较大数据的操作将导致某些操作比其他操作耗费更多时间,进而影响某些操作的延迟,因为需要额外的时间在网络和存储媒体间移动更多数据。如果需要大数据存储,通常方式是存储到块存储系统,如NFS或者HDFS中,然后在ZooKeeper中保存到存储位置的指针。


Ephemeral Nodes
       这些节点存在于session的创建,并且znode出于active状态,只有在znode被删除的情况下sesson才会结束。这是因为这个特性,ephemeral不允许拥有children。

Sequence Nodes -- Unique Naming
创建znode时,可以要求ZooKeeper在路径名后增加一个单调增加的计数器部分。这个计数器相对于znode的父节点是唯一的。计数器的格式是0d,也就是带有0填充的10个数字(这种格式是为了方便排序),比如说,<path>0000000001。队列接收节里有一个使用这种特征的例子。注意:用于存储下一个顺序号的计数器是一个由父节点维护的有符号整数(4字节),所以计数器将在超过2147483647的时候溢出(导致名字成为<path>-2147483647)。


Time in ZooKeeper

zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。

Version numbers
对节点的每次修改将使得节点的版本号增加一。版本号有三种:version(znode数据修改的次数)cversion(znode子节点修改的次数),以及aversion(znode的ACL修改次数)。

tick
多服务器ZooKeeper中,服务器使用tick来定义状态上传、会话超时、节点间连接超时等事件的时序。tick仅被最小会话超时(2倍的tick时间)间接使用:如果客户端要求小于最小会话超时的时间,服务器将告知客户端,实际使用的是最小会话超时。

Real time
除了在创建和修改znode时将时间戳放入stat结构体中之外,ZooKeeper不使用真实时间,或者说时钟时间。


ZooKeeper Stat Structure

czxid:创建节点的事务的zxid
mzxid:对znode最近修改的zxid
ctime:以距离时间原点(epoch)的毫秒数表示的znode创建时间
mtime:以距离时间原点(epoch)的毫秒数表示的znode最近修改时间
version:znode数据的修改次数
cversion:znode子节点修改次数
aversion:znode的ACL修改次数
ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。
dataLength:znode数据长度。
numChildren:znode子节点个数。


Consistency Guarantees

Zk的一致性保证分为以下几个方面:

顺序一致性:会以客户端发送的命令的顺序来执行,保证顺序。

原子性:完全的原子性,要么失败,要么成功。

一致性的系统镜像:每个客户端看到的系统服务一致。

可靠性:可靠性通过以下两种机制来保证:

1,  monotonicity Condition in paxos

确保所有的更新都能被client看到,通过一个读请求或者是成功的update。


哎,不写了,麻烦。。还不如把需要注意的点总结一下。

参考一下别人的翻译吧,比我翻译的准确
http://blog.163.com/wm_at163/blog/static/132173490201232423051163/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值