zookeeper系列之数据模型

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作为分布式锁的实现模型。下面是一个树状图形式:


zookeeper系列之数据模型_第1张图片
 每个节点都关联一个状态,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).

你可能感兴趣的:(数据结构,C++,c,应用服务器,jboss)