ZooKeeper之(二)数据模型

ZooKeeper 会维护一个具有层次关系的数据结构,非常类似于一个文件系统。
ZooKeeper之(二)数据模型_第1张图片
树形结构的每个节点都被称作为Znode。
znode通过路径引用,如同Unix中的文件路径。路径必须是绝对的,因此他们必须由斜杠字符来开头。除此以外,它们必须是唯一的,也就是说每一个路径只有一个表示,因此这些路径不能改变。。在ZooKeeper中,路径由Unicode字符串组成,并且有一些限制。字符串"/ZooKeeper"用以保存管理信息,比如关键配额信息。
1、数据结构
znode兼具文件和目录两种特点。既能像文件那样维护数据、原信息、访问控制列表(ACL)、时间戳等,又能像目录一样作为路径标识的一部分。
每个Znode由3部分组成:
stat:状态信息,描述该znode的权限、版本
data:与该znode关联的数据
children:该znode下的子节点
用来管理调度数据,如分布式应用中的配置文件信息、状态信息等元数据。ZooKeeper的服务器和客户端都被设计为严格检查并限制每个Znode的数据大小至多1M,但常规使用中应该远小于此值。
2、节点类型:
临时节点和持久节点。在创建时就被指定,并且不能改变。
两种节点类型的区别在于是否依赖于会话而生存。客户端和ZooKeeper服务器的一次连接称为一次会话。客户端靠与服务器建立一个TCP的长连接来维持一个会话,客户端在启动的时候首先会与服务器建立一个TCP连接,通过这个连接客户端能够通过心跳检测与服务器保持有效的会话,也能向ZooKeeper服务器发送请求并获得响应。
(1)临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
(2)永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显式地执行删除操作的时候,他们才能被删除。
另外,当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,当客户端请求创建这个节点A后,ZooKeeper会根据父节点的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。这样的节点称为顺序节点。与永久节点都可以成为顺序节点。细分一下,共有四种节点类型:

l PERSISTENT-持久化目录节点

客户端与ZooKeeper断开连接后,该节点依旧存在

l PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

客户端与ZooKeeper断开连接后,该节点依旧存在,只是ZooKeeper给该节点名称进行顺序编号

l EPHEMERAL-临时目录节点

客户端与ZooKeeper断开连接后,该节点被删除

l EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

客户端与ZooKeeper断开连接后,该节点被删除,只是ZooKeeper给该节点名称进行顺序编号
3 数据访问
zookeeper中的每个节点存储的数据都要被原子性的操作。也就是说读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。
每一个节点都有自己的ACL,这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作,有以下权限:

l CREATE: 创建子节点的权限

l READ: 获取节点数据和子节点列表的权限

l WRITE: 更新节点数据的权限

l DELETE: 删除子节点的权限

l ADMIN: 设置节点ACL的权限

上面的权限有点类似信息系统的权限管理,在开发系统的时候一般也会对数据做这些权限管理,一个ZooKeeper集群可能会服务很多的业务,尤其是一些大公司,ZooKeeper集群的节点中会保存重要的信息,那么这些信息通常只能对一部分的访问者开放,通过ACL我们可以对某些节点的访问进行授权,从而来保证数据的安全。
4、zxid
致使zookeeper节点状态改变的每一个操作都将使节点收到一个zxid格式的时间戳,并且这个时间戳全局有序。也就是说,每个对节点的改变都将产生唯一一个zxid。如果zxid1的值小于zxid2的值,那么zxid1所对应的事件发生在zxid2所对应的事件之前。实际上,zookeeper的每个节点维护者两个zxid的值,分别为xzxid\mzxid
czxid:节点的创建时间所对应的zxid格式时间戳
mzxid:节点的修改时间所对应的zxid格式时间戳
zxid是一个64位数字,高32位是epoch用来表示leader关系是否改变,每次一个leader被被选出来,它都会有一个新的epoch。低32位是个递增计数。
5、版本号用来记录节点数据或者是节点的子节点列表或者权限信息的修改次数。如果一个节点的version是1,那就代表这个节点从创建以来被修改了一次。
对接点的每一个操作都将致使这个节点的版本号增加。每个节点维护着三个版本号:
version:节点数据版本号
cversion:子节点版本号
aversion:节点所拥有的acl版本号
6、watcher机制
zookeeper允许用户在指定节点上注册一些watcher,当数据节点发生变化时,zookeeper服务器会把这个变化的二同志发送给感兴趣的客户端。这个是zookeeper的核心特性
ZooKeeper之(二)数据模型_第2张图片
两个客户端都在ZooKeeper集群中注册了watcher(事件监听器),那么当ZooKeeper中的节点数据发生变化的时候,ZooKeeper会把这一变化的通知发送给客户端,当客户端收到这个变化通知的时候,会触发某些提前定义好的动作。

一般来说,ZooKeeper会向客户端发送且仅发送一条通知。

你可能感兴趣的:(zookeeper)