Zookeeper数据存储模型

​ 上一节介绍了zookeeper线网环境安装教程,本章将继续介绍zookeeper中的数据存储模型。

1、数据存储结构

​ zookeeper的数据模型采用类似文件系统的目录结构进行存储,目录树中的每个节点被称为Znode,Znode既可以存储数据,也可以拥有自己的子节点。

​ zookeeper中节点必须通过绝对路径进行访问,以斜杠/开头,其中路径和节点是一一对应的,即一个节点有唯一的路径标识,一个路径仅可以表示一个节点。其存储结构如下图所示:

在这里插入图片描述

2、Znode中存储的数据

​ Zookeeper中的每个znode由三部分组成。分别是该Znode节点的元数据、数据信息和该Znode下的子节点信息。

  • 元数据:元数据中包含Znode的一些状态信息,如创建时间、修改时间、版本号、权限列表等。
  • 数据信息:存储在该ZNode中的数据信息。 该数据信息的大小有限制,通常不允许超过1M,但是常规使用中应远小于这个值
  • 子节点信息:该Znode下的子节点

zookeeper虽然可以存储数据,但是它设计的目录不是作为一个数据库的存在,而是用来管理分布式系统中的一些配置及状态信息,所以ZNode节点中的数据大小是有限制的,不允许超过1M,正常使用过程中应该远小于1M。其中每个ZNode节点的操作都是原子操作,对节点数据的存取都是全量的。同时数据的大小限制也保证了zookeeper对节点操作的高效。

znode元数据信息

  • cZxid : 当前znode创建的事务ID
  • ctime : 当前znode创建的时间
  • mZxid : 当前znode修改的事务ID
  • mtime : 当前znode修改的时间
  • pZxid : 最近子节点被修改的事务ID,如当前节点下有多个子节点,当前值为当前节点下子节点最近被更新的子节点事务ID
  • cversion : 子节点版本号,当子节点有变化时当前值加一。注意变化是指子节点数目增加或减少时才算变化,子节点内容变化不会影响该值
  • dataVersion : 数据版本。每次对节点进行set操作,dataVersion值就会增加1。
  • aclVersion : ACL的版本号。当节点的ACL权限变化时,当前值增加1.
  • ephemeralOwner : 若当前节点是临时节点,该值为该znode所有者的sessionID。如果是持久节点,该字段值为0。
  • dataLength : ZNode中数据的长度
  • numChildren : 该ZNode子节点的个数

版本号:

​ ZNode中设计的版本号有三个,版本号是保证多客户端操作同一个ZNode时操作顺序一致性的重要前提。假设客户端C1对 /config写入一些配置信息,如果另一个客户端C2同时更新了这个znode,此时C1的版本号已经过期,C1调用setData一定不会成功。这正是版本机制有效避免了数据更新时出现的先后顺序问题。

事务ID

​ 对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生。zxid对于整个zk都是唯一的,即使操作的是不同的znode。

3、Znode节点类型

zookeeper中znode节点的类型包括四种:

  • 持久无序节点
  • 持久有序节点
  • 临时顺序节点
  • 临时顺序节点

永久节点:zookeeper的永久节点不依赖会话,一旦创建就会永远保留在服务器中,直到客户端主动删除。

临时节点:临时节点的生命周期与创建该临时节点的会话的生命周期绑定,当会话失效,该会话创建的所有临时节点都将失效被自动删除。

顺序节点:创建顺序节点的时候,zookeeper会自动在创建的节点后面添加一个1o位计数器,计数器从0000000000开始向上递增。注意计数器的数值对于此节点的父节点是唯一的,当数值大于2^32-1时,计数器将溢出。

发布了130 篇原创文章 · 获赞 40 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u014630623/article/details/103592501