ZK的数据结构特点

ZK的数据结构特点

ZooKeeper这种数据结构有如下这些特点: 
1. 每个子目录项如NameService都被称作znode,这个znode是被它所在的路径唯一标识,如Server1这个znode的标识为/NameService/Server1 
2. znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL类型的目录节点不能有子节点目录 
3. znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据 
4. znode可以是临时节点,一旦创建这个znode的客户端与服务器失去联系,这个znode也将自动删除,ZooKeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态成为session,如果znode是临时节点,这个session失效,znode也就被删除. 
5. znode的目录名可以自动编号,如App1已经存在,再创建的话,将会自动命名为App2. 
6. znode可以被监控,包括这个目录节点中存储的数据被修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是ZooKeeper的核心特性.

 

 Zookeeper 的视图结构跟标准的 Unix 文件系统很像,都有一个根节点 / 。在根节点下面就是一个个的子节点,我们称为 ZNode。ZNode 是 Zookeeper 中最小数据单位,在 ZNode 下面又可以再挂 ZNode,这样一层层下去就形成了一个层次化命名空间 ZNode 树,我们称为 ZNode Tree。对于 ZNode 节点,我们可以增删改查操作,其实有很多的开源缓存框架和 Zookeeper 相似,只是数据结构不一样。像 Redis、Memcache 等,都有自己的数据操作命令,以及自己的数据存储结构。

 

一、【数据结构】

 我们先来看看 Zookeeper 的数据模型图

 

 在 Zookeeper 中,每一个数据节点都是一个 ZNode,上图根目录下有两个节点,分别是:app1 和 app2,其中 app1 下面又有三个子节点。那么我们来看看 ZNode 数据结构到底是什么样子的呢。首先我们来了解 ZNode 的类型。

 ZNode 的类型有哪些?

 Zookeeper 节点类型可以分为三大类:持久性节点(Persistent)、临时性节点(Ephemeral)、顺序性节点(Sequential)。现实开发中在创建节点的时候通过组合可以生成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。

 持久节点就是节点被创建后会一直存在服务器,直到删除操作主动清除,这种节点也是最常见的类型。

 持久顺序节点就是有顺序的持久节点,节点特性和持久节点是一样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示其顺序。

 临时节点就是会被自动清理掉的节点,它的生命周期和客户端会话绑在一起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。

 临时书序节点就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀。

 ZNode 的数据结构是怎么样的呢?

 我们看看结构图

 

 整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。图中 app1 是数据内容,其他的属于状态信息。那么这些状态信息都有什么含义呢?

 cZxid 就是 Create ZXID,表示节点被创建时的事务 ID。

 mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务 ID。

 ctime 就是 Create Time,表示节点创建时间。

 mtime 就是 Modified Time,表示节点最后一次被修改的时间。

 pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新。

 cversion 表示子节点的版本号。

 dataVersion 表示内容版本号。

 dataLength 表示数据长度。

 numChildren 表示子节点数。

 ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0。

 

二、【操作命令】

 

 通过 Help 命令我们看到 Zookeeper 提供很多的操作命令,我们不去一一介绍,选几个我们经常用的吧。

 get path [watch] 命令 

 path 是路径 [watch] 是监视器,一般我们用 API 编程的时候,在 getData、exists、getChildren 时候会自己去实现一个 watcher,或者用默认的 watcher。在这里 get 命令的用法可以默认 watch 就好了,例如 get /app1。如下图:

 

 大家注意 dataVersion = 0,这个是数据内容的版本号,Zookeeper 保证一致性,基本上都会有个版本控制。

 set path data [version] 命令

 path 是路径 data 是数据内容 [version] 是版本号,我们可以通过 set /app1 newapp1 来更新节点 /app1 的内容,也可以自己设置版本号,不过通过命令行去设置版本号通过 set /app1 newapp1 2。

 如下图:

 

 大家可以发现 dataVersion = 1,版本号默认加 1。

 delete path [version] 命令

 path 是节点路径 [version] 版本号,如下图:

 

 我们再去 get 看看

 

 Node does not exists:/app1,app1 节点不存在了。

 create [-s] [-e] path data acl 命令

 这个命令后面的参数比较多,[-s] 顺序节点,[-e] 临时性节点,path 路径,data 数据内容,acl 权限。我们创建一个持久性节点。

 

 大家发现没有,节点名后面加上了一串数字,这个就是 Zookeeper 顺序标识。而且是持久性节点。

 

 临时性节点 app2,关闭客户端会话断开会自动清除。

 

 谢谢大家观看!

 
分类: Zookeeper
posted @ 2018-03-15 18:27  跨境电商杂货铺  阅读(878)  评论(0编辑  收藏  举报