zookeeper系列之数据模型

本文介绍了Zookeeper的数据模型,它采用树状结构,每个节点可存储数据并具有不同的类型如持久节点和临时节点。文章还详细解释了节点的状态属性及如何通过版本控制来确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zookeeper的数据模型就是一颗树,对外的操作接口看起来就像一个小文件系统。题外话,很感慨最近遇到的好几个数据模型都是树状的,jcr的数据模型,jboss 的tree cache都是树状的表现形式。 每个Zookeeper server都存在一个相同的树,server之间需要维持树的一致性,并且任何时刻这棵树都存在在内存中,因此,我们一定要控制树的规模。树有多个节点(node)构成,要获取节点是通过path得到的。每个节点可以存储数据,节点的数据是以二进制的形式存在的。节点从存储角度看分可持久的节点和临时节点(Ephemeral node)。持久的节点保存在磁盘上,而临时节点只存储在内存中,当创建该节点的session关闭则该临时节点也自动删除。从节点的是否具有特殊性来看分普通节点和序列化节点(Sequential node)。序列化节点会在创建的节点名自动加上序列号。比如要创建/a/b/c/serieal-这样的序列化节点,如果服务器端已经存在这个序列号节点,且最大值为/a/b/c/serial-10,则新创建的名字为/a/b/c/serial-11。而普通节点的名字是由客户端指定的,服务器端不会自动改变节点的名字。下图为Zookeeper的数据模型示意图。注意,任何临时节点的父节点不能为临时节点。后续的Zookeeper应用中将会使用ephemeral_sequential作为分布式锁的实现模型。下面是一个树状图形式:



 每个节点都关联一个状态,Stat,结构如下:

private long czxid; 创建本节点时的zxid
  private long mzxid; 本节点最后修改时的zxid
  private long ctime;创建本节点的时间,都以leader时间为准
  private long mtime;本节点最后修改时的时间,以leader时间为准
  private int version;通过setData会增加版本,每次修改会使version版本增加1.
  private int cversion;孩子变化时会更改父亲节点的版本,每当有孩子增加或者删除时,此版本增加1
  private int aversion;每当有对此节点进行setACL操作时,aversion会自动增加1
  private long ephemeralOwner;如果节点为临时节点,则表明那个session创建此节点
  private int dataLength;关联节点的数据长度为多少
  private int numChildren;节点有多少个孩子
  private long pzxid;孩子最后一次变更(增加或删除)的zxid
 对于setData接口中需要提供的版本,如果为-1,则表明总是在最后的基础上修改,或者说自动覆盖原有数据,即使在发送请求的过程中已经被其他请求修改也自动覆盖。如果指定版本,如果指定的版本不是当前最新版本,则修改不会成功,会抛出badVersion错误。可以模拟CompareAndSet操作用来提供同步功能。

在一个请求的FinalRequestProcessor处理时,才将最后的结果应用到data_tree上。主要调用zks.dataTree.processTxn(request.hdr, request.txn).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值