ZooKeeper编程指南(一)

来源:互联网 发布:阿里云不备案 ip 编辑:程序博客网 时间:2024/05/24 01:48

ZooKeeper编程指南(一)  

介绍
数据模型
    节点
    时间
    stat结构
会话
监控
访问控制
可插拔的认证
一致性保证
Bindings
构建单元:ZooKeeper操作向导
程序结构
常见问题和疑难解答

介绍
    这篇文章是一篇开发人员指南,那些想充分利用ZK提供的协调服务创建分布式应用的程序员。它包含概念和实践信息。
    指南的前4部分展示ZK概念的更高层次的讨论。他们对于理解ZK如何工作和如何使用ZK都是必须的。前4部分并不包含源代码,但确实假定你熟悉分布式计算的相关问题。
前4部分包括:
数据模型
会话
监控
一致性保证

后4部分提供编程实践
Bindings
构建单元:ZooKeeper操作向导
程序结构
常见问题和疑难解答


数据模型
    ZK有一个层次的命名空间,非常类似于分布式文件系统。唯一的不同是命名空间中的节点不仅可以有数据而且还可以有字节点。就好像是有一个文件系统,文件同样也可以是目录。节点路径被表示为规范的,绝对的和斜线分割的路径。没有相对引用。任何unicode字符都可以被用在路径中,除了下面的限制:
    1、null空字符不能是路径的一部分。
    2、下面的字符不能被使用,要么是渲染不好,要么显示不正常。 \ - \ and \ - \?
    3、下面的字符不被允许:\? -uF8FFF, \?-uFFFF, \uXFFFE - \uXFFFF (where X is a digit 1 - E), \? - \?.
    4、“.”字符可以被用作名字的一部分,但是“.”“..”不能被单独使用来之名路径中的节点。因为ZK不使用相对路径。下面的路径就是无效的: "/a/b/./c" or "/a/b/../c".
    5、“zookeeper”是保留字符串。

    节点
   ZK树中的每一个节点被称作znode。znode有一个stat结构,含有数据和acl改变的版本号。stat结构同样还包含时间戳。版本号加上时间戳允许ZK验证缓存和协调更新?节点的数据每一次改变,版本号增加。client获取数据,同样获取数据的版本号。当客户端执行更新或删除的时候,它必须提供要操作节点的数据版本号。如果提供的版本号并不匹配实际的版本号,更新失败。
    znode是程序员操作的主要对象。有几个特点需要提及:
        监控  客户端可以在节点上设置监控。节点的改变会触发监控,然后清除监控(类似于事件编程里的边沿触发,只通知一次)。ZK触发监控时,会发送通知给客户端。

        数据访问  节点中存储的数据的读写是原子的。读会获取所有的数据,写会更新所有的数据。每一个节点都有访问控制列表ACL限制谁可以做什么。
    ZK设计上并不是通用的数据库或大对象存储。相反,它管理协调式数据。这种数据可以是配置,状态信息,集合等。各种各样的协调式数据的共同特点就是它们都很小:按kb计算。ZK客户端和Server实现必须有完整检查来保证节点的数据小于1M,但数据在平均水平上要远远小于1M。操作相对大的数据在一些操作上需要花费更多的时间,因为需要在网络上或存储介质上传递更多的数据,这会影响一些操作的延迟。如果需要大数据存储,处理这种数据的通常模式是把它们存储在块文件系统上,例如NFS或HDFS,把存储位置的指针存入ZK。

        临时性节点  ZK有临时性节点的概念。只要创建节点的会话是活跃的,节点就存在。会话结束,节点被删除。由于这种性质,临时性节点不允许有子节点。

        顺序节点-唯一命名  当创建节点时,可以要求ZK在路径结尾追加单调递增的计数。对父节点来说,计数是唯一的。计数的格式是%010d,比如/root/child_0000000000;/root/child_0000000001;注意:用来存储下一个计数的顺序号存在于父节点维护的一个有符号整数(4字节)。当递增超过2147483647时,计数会溢出。

    时间
   ZK用多种方式跟踪时间
        Zxid  每一次对ZK状态的改变,都会收到一个标记,以事务号(ZK transaction id)的形式。这会暴露ZK所有变化的全部顺序。每一次改变都会有唯一的zxid,如果zxid1比zxid2小,那么zxid1发生在zxid2之前。
        版本号  节点的改变会递增节点其中的一个版本号;节点数据改变的版本号,节点子节点改变的版本号,节点ACL改变的版本号。
        tick(钟表的滴嗒声,一种固定的时间间隔)  当使用含有多个服务器的ZK服务,服务器使用ticks来定义事件的时序,比如状态上传,会话超时,服务器之间的连接超时等。tickTime仅仅被间接的通过最小的超时时间暴露(2*tickTime);如果客户端请求超时小于最小超时时间,这种情况下,服务器通知客户端超时时间是最小超时时间。
        real time实际时间  ZK并不使用真实时间,或时钟时间。除了节点创建或修改时,把时间戳存入stat结构。

    stat结构  每一个节点的stat结构由下面的属性构成:
        czxid  创建这个节点时的变更对应的事务号
        mzxid  最后修改这个节点的变更对应的事务号
        ctime  节点创建时的毫秒数
        mtime  节点最后一次修改时的毫秒数
        version  节点数据变更的版本号
        cversion  节点的子节点变更的版本号
        aversion  节点ACL变更的版本号
        ephemeralOwner  创建节点的会话id(临时性节点),非临时性节点为0
       dataLength  节点数据的长度
       numChildren  字节点的数目