转自: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不使用服务端时间作为时序的保障。