Zookeeper会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,如图所示:

Zookeeper数据模型Znode - 图1

Zookeeper这种数据结构有如下这些特点:

1)每个子目录项如NameService都被称作为znode,这个znode是被它所在的路径唯一标识,如Server1这个znode的标识为/NameService/Server1。

2)znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL(临时的)类型的目录节点不能有子节点目录。

3)znode是有版本的(version),每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据,version号自动增加。

4)znode的类型:

  • Persistent 节点,一旦被创建,便不会意外丢失,即使服务器全部重启也依然存在。每个 Persist 节点即可包含数据,也可包含子节点。
  • Ephemeral 节点,在创建它的客户端与服务器间的 Session 结束时自动被删除。服务器重启会导致 Session 结束,因此 Ephemeral 类型的 znode 此时也会自动删除。
  • Non-sequence 节点,多个客户端同时创建同一 Non-sequence 节点时,只有一个可创建成功,其它匀失败。并且创建出的节点名称与创建时指定的节点名完全一样。
  • Sequence 节点,创建出的节点名在指定的名称之后带有10位10进制数的序号。多个客户端创建同一名称的节点时,都能创建成功,只是序号不同。

5)znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper的核心特性,Zookeeper的很多功能都是基于这个特性实现的。

6)ZXID:每次对Zookeeper的状态的改变都会产生一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,如果zxid1小于zxid2,则zxid1在zxid2之前发生。

//*


ZooKeeper的视图结构和标准的Unix文件目录结构类似,数据模型库是一棵树,
每一个节点叫做ZNode。每一个节点可以通过路径来标识,它可以有子节点,也可以有数据
第二点需要注意的是,每一个znode都必须有值,如果没有值,节点是不能创建成功的。
通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化。

版本号

每个zookeeper节点都有各自的版本号,可以通过命令行来显示节点信息,每当节点数据发生变化的时候,那个节点的版本号会累加(类似乐观锁的机制),当客户端删除或者修改 过时的旧节点的时候, 如果传入的版本号和节点的版本号不匹配就会报错.这也是一个乐观锁的表现.

存放数据不宜过大
每个zookeeper节点存储的数据不宜过大,几K即可,一般来说就是放个对象,或者list,Map集合等等,但是不适合存放很庞大的list对象,
权限管理

节点可以设计权限acl的可以针对每个开发员设置不同的权限,可以通过acl来限制用户对某个节点的访问修改等等,就是类似权限管理的东西.

Zookeeper数据模型Znode - 图2

Zookeeper数据模型Znode - 图3

节点类型

Zookeeper有两种节点类型:
1. 持久节点(persistent)
2. 临时节点(ephemeral)

当然每种节点都有顺序节点

持久节点概述

持久节点是指一旦这个ZNode被创建了,除非主动将ZNode移除操作,否则ZNode会一直保存在zookeeper上,哪怕客户端创建这个持久节点的客户端和zookeeper集群断开了连接,持久节点依然存在


临时节点概述

临时节点的生命周期和客户端会话绑定,一旦创建这个临时节点的客户端和zookeeper集群断开连接,这个客户端创建的所有的临时节点都会被移除

是否允许有子节点
1.持久节点允许有子节点的,它可以在节点下一次来继续创建其它子节点,
2.而临时节点是不允许创建子节点的.

1.顺序节点

ZooKeeper还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL.一旦节点被标记上这个属性,那么在这个节点被创建的时候,Zookeeper会自动在其节点名后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字。

顺序节点和不带顺序的节点不同的地方是顺序节点后面会接一串数字


Znode有四种形式的目录节点(默认是persistent )

  • PERSISTENT-持久节点: 除非手动删除,否则节点一直存在于Zookeeper上
  • EPHEMERAL-临时节点: 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。
  • PERSISTENT_SEQUENTIAL-持久顺序节点: 基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
  • EPHEMERAL_SEQUENTIAL-临时顺序节点 : 基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。



    1.创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
    Zookeeper数据模型Znode - 图4
    2.在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序



    2.Zookeeper节点状态属性

    Zookeeper数据模型Znode - 图5
    emphemeralOwner 属性判断是不是临时节点,如果它有值,并且是序号,说明它是临时节点,如果值为0就是持久节点

    3.持久节点和顺序节点使用场景

    持久节点
    如果你是做元数据的存储,肯定是用持久节点,
    临时节点
    如果你是做一些类似分布式协调和通知之类的,很多时间是用的是临时节点,比如说我创建一个临时节点,别人来监听这节点的变化,如果我断开连接了,这个临时节点就会消失,此时别人就会感知到我这个临时节点消失了,就会来做点别的事情.
    顺序节点
    顺序节点在分布式锁里面用的比较经典.