4. Zookeeper精要-数据模型

来源:互联网 发布:mac单机游戏迅雷下载 编辑:程序博客网 时间:2024/06/05 10:06

1、znodes数据模型

Zookeeper允许分布式的进程通过数据寄存器的命名空间共享机制相互协调,命名空间看起来很像Unix的文件系统,在Zookeeper的命名规则中,数据寄存器就是所谓的znode,如图:
这里写图片描述
我们可以看到znode就类似于一个树形结构,通过给出的事例我们需要着重注意以下几点:

  1. 根节点只有一个子节点/zoo,/zoo几点有三个子节点
  2. 在Zookeeper树中,每个znode都是通过路径标识,且路径是通过”/”分割
  3. znodes之所以可以叫做数据寄存器,主要是因为它可以存储数据。因此,一个znode可以拥有子节点以及和该节点相关联的数据。

一般被存储在znode里面的数据都是byte格式且每个znode所存储的数据量最大不能超过1M。Zookeeper是为调度而生的,而几乎所有和调度相关的数据在大小上都是很小的,因此,此数据大小的限制是强制的,推荐实际的数据大小应小于该限制。
斜杠分割的znode路径是规范且强制的,需要注意的是Zookeeper不能识别相对路径和引用路径。znode的名称可以由Unicode字符组成,而且除Zookeeper的保留字之外,znode可以任意命名,但是需要注意的是在znode路径中,’.’的使用是非法的。
类似于文件系统的文件,znode维护了一个静态的数据结构,这个数据结构包含了数据变更的版本号,访问控制列表以及数据变更的时间戳。当数据变更时,版本号增加,Zookeeper使用版本号和相关的时间戳去验证内部缓存。Zookeeper的客户端也可以通过Zookeeper的API,结合znode版本号更新或者删除一个特定的znode,如果指定的版本号不能够匹配znode的当前版本,操作失败。执行znode的update或者delete操作时,可以指定0重写版本号。

2. znodes类型

Zookeeper有两种znodes类型:持久化类型和临时类型。您也可能听过过第三种类型,叫做有序znode,这种类型是对前两种类型的补充。有序znode既可以是持久化类型,也可以是临时类型,znode的类型在znode创建时设置。

2.1 持久化znode

顾名思义,在Zookeeper的命名空间中,持久化的znode的生命周期从创建开始一直到被显示删除为止。znode的删除可以通过调用delete API,但是客户端创建持久化znode之后并不需要强制要求删除,任何通过Zookeeper服务认证的客户端都可以删除znode。
示例:

客户端连接Zookeeper服务:./zkCli.sh -server localhost:2181创建持久化znode:create /[PacktPub] "ApacheZooKeeper"

2.2、临时znode

所谓临时znode,就是当客户端通过创建临时znode的形式创建一个znode,一旦客户端和Zookeeper服务之间会话结束,Zookeeper服务将自动删除该znode。
临时znode可以被该znode的创建者和所有通过Zookeeper认证的客户端通过调用delete API删除,一旦临时znode的创建者和Zookeeper服务的会话终止,该znode将会立马消失,所以在当前版本的zookeeper中,临时znode不允许有子节点。

客户端连接Zookeeper服务:./zkCli.sh -server localhost:2181创建持久化znode:create -e /[PacktPub] "ApacheZooKeeper"

因为临时节点不允许有子节点,所以一旦在临时节点下面创建子znode,系统将会抛出一个异常。

create -e /[PacktPub]/EphemeralChildEphemerals cannot have children: /[PacktPub]/EphemeralChild

2.3、 有序znode

有序znode既在创建该znode时,Zookeeper服务为该znode分配了一个序号,该值是一个单调递增计数器的值,Zookeeper服务在有序znode创建时将该值增补在znode名称的后面。
计数器用于存储序列号,且序列号是一个整数,序列号由10位数字,前面不足用0补充。如:/path/to/znode-0000000001,这种命名约定对于znode通过分配给它们的值来进行排序是很有用的,有序znode既可以是持久化znode,也可以是临时znode。

创建持久化有序znode:create -s /[PacktPub] "PersistentSequentialZnode"
创建临时有序znode:create -s -e /[PacktPub] "EphemeralSequentialZnode"