数据模型

        Zookeeper的视图模型和Unix的文件系统非常相似,但是没有引入传统文件系统的目录和文件等概念,而是使用了特有的“数据节点”,即ZNode。Znode是Zookeeper中 数据的最小单元,每个ZNode上都可以存储数据和挂载子节点,从而构成一个层次化的命名空间,称为树。

节点类型

        Zookeeper中 数据节点分为持久节点和顺序节点两类,两类节点都有一个SEQUENTIAL属性。通过组合可生成四种组合节点类型:
        持久节点:节点创建后会一直存在于Zookeeper服务 器上,直到有删除操作来主动清除这个节点。
        持久顺序节点:基本特性与持久节点一致。不同的是,Zookeeper会在其节点名后追加一个由其父节点维护的顺序列表生成的自增数字做为后缀来做为新的完整的节点名。数字后缀的上限是整型最大值。
        临时节点:临时节点的声明周期与客户端声明周期一致。Zookeeper中规定不能基于临时节点创建子节点。
        临时顺序节点:基本特性与临时节点一致。不同的是添加了顺序特性。

 

节点状态

       每个数据节点除了存储数据内容之外,还存储了数据节点本身的一些状态信息。Stat类包含了Zookeeper上一个数据节点的所有状态信息。

        czxid:reated ZXID,表示该节点被创建时的事务ID。
        mzxid:Modified ZXID,表示该节点最后一次被更新时的事务ID。
        ctime:表示节点被创建的时间。
        mtime:表示该节点最后一次被更新时的时间。
        version:数据节点的版本号。
        cversion:子节点的版本号。
        aversion:节点的ACL版本号。
        ephemeralOwner:创建该临时节点的会话的SessionID。如果该节点为持久节点,那么这个属性值为0。
        dataLength:数据内容的长度。
        numChildren:当前节点的子节点个数。
        pzxid:表示该节点的子节点列表最后一次被修改时的事务ID。只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid。

版本

        在Zookeeper中通过版本来保证分布式数据原子性操作。在处理每一个数据更新请求时,首先获取当前请求的版本version,同时从数据记录中获取当前服务 器上该数据的最新版本cuurentVersion。如果version为-1,表示不需要乐观锁,忽略版本对比,否则对version和currentVersion进行对比,如果版本不匹配则抛出BadVersionException异常,否则会对version进行加1操作。

 Watcher

        在Zookeeper中通过watcher机制来进行数据变更的通知。Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager和Zookeeper服务 器三部分。客户端向Zookeeper服务 器注册Watcher时,会将Watcher对象存储在客户端的WatcherManager中,当Zookeeper服务 器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。
 

ACL

        在Zookeeper中通过ACL机制来保证数据的安全。一个有效的ACL信息通常包括三部分:scheme:id:permission。

        scheme:权限模式,通常用来确定权限验证过程中使用的检验策略。
        id:授权对象,权限赋予的一个用户或指定实体,不同的模式下授权对象也不同。
        permission:权限,通过权限检查后允许的操作。分为CREATE、DELETE、READ、WRITE、ADMIN五类。