数据模型
ZK的数据模型采用类似文件系统的层次模型, 与Key-value模型相对应. 它采用文件系统模型主要基于以下两点考虑
- 文件系统的树形结构便于表达数据之间的层次关系
- 文件系统的树形结构便于为不同的应用分配独立的命名空间
ZK 的层次模型称作 Data tree
. Data tree
的每个节点叫做 znode.
不同于文件系统, ZK 的每个节点都可以保存数据, 并且每个节点都有一个版本, 从0开始计数
data tree 接口
ZK 对外提供一个用来访问 data tree 的简化文件系统API:
- 使用 unix 风格的路径名来定位 znode, 例如 /A/X 表示 znode A的子节点 X
- znode 的数据只支持全量写入和读取, 没有像通用文件系统那样支持部分写入和读取
- data tree 的所有API 都是
wait-free
的. 正在执行中的 API 调用不会影响其他API的完成
- data tree 的API都是对文件系统的 wait-free 操作, 不直接提供锁这样的分布式协同机制, 但是利用 data tree 的 API, 可以用来实现多种分布式协同机制
znode 分类
znode 可以是持久性
的, 也可以是临时性
的
- 持久性的znode ( Persistent ): 这样的znode在创建之后即使发生集群宕机或者client宕机也不会丢失
- 临时性的znode ( Ephemeral ): client宕机或者client在指定的timeout时间内没有给 ZK 集群发消息, 这样的znode就会消失
znode 也可以是顺序性
的. 每一个顺序性的znode关联一个唯一的单调递增整数. 这个单调递增整数是 znode 名字的后缀. 如果 znode 具备顺序性, 那么又会以下两种 znode