ZooKeeper数据模型

转自:https://blog.csdn.net/tomato__/article/details/78549368 

Zookeeper数据模型

Zookeeper的结构类似标准的文件系统,但这个文件系统中没有文件和目录,而是统一使用节点(node)的概念,称为ZNode。ZNode作为保存数据的容器(限制在1mb以内),也构成了一个层次化的命名空间。ZNode的节点路径和Unix文件路径非常相似。

事务ID

对于每个事务请求,ZooKeeper都会为其配置一个全局唯一都事务ID,用ZXID来表示,通常是一个64位都数字。

ZNode

每个ZNode都维护了一个表示节点状态的数据结构,包括版本号和时间戳,每次znode的数据改变,都会导致版本号增加。版本号用于控制节点的状态更新,每次ZooKeeper的客户端获取数据时,都会得到数据的版本号,当客户端试图更新或删除数据时,它必须提供数据的版本号,如果它提供的版本号和当前的版本号匹配,则操作成功,否则操作失败。 
znode的基本属性如下:

zxid

  • czxid:该znode被创建时改变的zxid;
  • mzxid:该znode最后被修改时改变的zxid;
  • pzxid:该znode子节点列表最后被修改的zxid。注意,只有子节点列表变更来才会变更pzid,子节点内容变更不会影响pzxid;

时间

- ctime:该znode被创建时的毫秒值; 
- mtime:该znode最后被修改时的毫秒值;

版本

- version:该znode的数据的改变次数; 
- cversion:该znode的孩子改变的次数; 
- aversion:该znode的ACL改变的次数;

节点类型

- ephemeralOwner:如果该znode为一个临时节点,该值为znode的拥有者的session id;如果不是一个临时节点,值为零;

其它

  • dataLength:该znode的数据的长度;
  • numChildren:该znode的孩子的个数。

监听(watches)

ZooKeeper的客户端能够监听zonde的变化,当znode变化时,ZooKeeper会发送通知消息到客户端。请参考后续的监听章节。

数据存取

存储在znode上的数据被原子的读和写,读请求将读取znode上的所有数据,而写则是替换znode上的所有数据,每个znode都有一个访问控制表(ACL)来限制谁能做什么。 
ZooKeeper不能被当作一个通用数据库或存储大量数据,它仅应该被用来管理协作数据,通常要求这些协作数据应该较小:千字节规模。ZooKeeper的客户端和服务端都会限制znode的数据不会超过1M,但znode上的数据的平均值应该更小。限制数据大小的主要原因是为了防止数据同步时的时间过长。 
如果确实需要存储大量数据,通常的解决方案是存储该数据到第三方存储系统中,例如NFS或者HDFS等,再将数据的指针存储到ZooKeeper中。

ZNode类型

持久节点(Persistent Node)

最常见都一种节点,一经创建就会一直存在ZooKeeper中,直到主动删除。

持久顺序节点(Persistent_Sequential Node)

在创建一个znode时,你能要求ZooKeeper创建顺序都Znode,ZooKeeper会自动为给定节点名加上一个序号,该序号对于该znode的父节点是唯一的。序号的格式为%010d,固定格式是为了简化对znode的排序。 
注意序号是一个有符号的整数,超出范围后将溢出。

临时节点(Ephemeral Node)

临时节点和ZooKeeper的session绑定,ZooKeeper客户端通过session创建znode临时节点后,只要该session不断开,znode临时节点就存在,而当session断开后,znode临时节点将被删除。 
临时节点不允许存在孩子节点。

临时顺序节点(Ephemeral_Sequential Node)

就是在临时节点都基础上添加来顺序都特性。

容器节点(Container Node)

3.6.0版本增加。 
容器节点是为leader、lock等操作存在的,当容器节点的最后一个孩子节点被删除之后,容器节点将被标注并在一段时间后删除。 
由于容器节点的该特性,当你在容器节点下创建一个孩子节点时,应该始终准备捕获KeeperException.NoNodeException,如果捕获了该异常,则需要重新创建容器节点。

ZooKeeper中的时序

ZooKeeper使用多种方式来跟踪时序:

Zxid(ZooKeeper Transaction Id)

对ZooKeeper的每次状态改变都会收到一个zxid的时间戳,zxid反应了对zookeeper的所有改变的顺序,每次改变都有一个唯一的zxid,并且如果zxid1小于zxid2,那么zxid1发生在zxid2之前。 
zxid分为两个部分,epoch和counter。epoch用于标识对应的leader,每次新的leader产生,epoch加1;counter用于对状态改变计数,每次状态改变counter加1。

版本号

每个znode都有一个版本号,每次对该znode的改变都会导致该znode的版本号的增加。有3种类型的版本号: 
- version:znode的数据改变的次数; 
- cversion:znode的孩子改变的次数; 
- aversion:znode的ACL改变的次数。

Ticks

当使用多节点的ZooKeeper时,ticks表示事件的次数,事件包括:状态上载、session超时、节点间的连接超时等。

服务端时间

除了znode的创建时间和修改时间使用服务端,ZooKeeper不使用服务端时间作为时序的保障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值