ZooKeeper没有使用原语的方式,而是引入了操作粒度更细小的数据节点的概念:Znode,通过暴露操作这些Znode的API,使用者可以更方便的来实现更加适合自己的原语,而不是仅仅使用经过进一步封装后的同步原语,例如分布式锁.这就是事物的两面性,封装提供了便捷性,失去了灵活性.
命名空间
ZooKeeper设计了一个有层级的命名空间(Hierarchical Namespace),这个结构来源是数据结构中树的概念,这样就使得ZooKeeper根据命名空间定位节点时的效率大幅提升.
命名空间和标准的文件系统非常相似,不过Znode同时有目录和文件两个特征.同时像目录一样维护着路径这样的标识,也维护着像文件一样维护着数据、元信息、ACL、时间戳等数据结构.Znode的访问路径是绝对路径,必须以斜线(/)开头,表示根,节点和其子节点之间同样使用斜线(/)进行分割.因此每个Znode节点都是通过唯一的路径来标识和访问.
Znode有三部分组成:数据信息,状态信息和子节点.
其中,节点数据以字节数组形式存储,被设计为严格限制在1M以内,而实际使用中应该远小于该值.这源自ZooKeeper设计的目的:ZooKeeper并不是设计专门存储数据的,而是用来维护和监控存储数据的状态变化,而这些数据都都在内存中,考虑到内存的限制,数据节点的存储的数据是不能太大的,因此如果想把ZooKeeper用来持久化大量数据,推荐使用Redis吧.
Znode的状态信息中使用了两种类型的来共同表示:zxid和版本号
zxid
是ZooKeeper的事务ID,每次Znode变更时,都会会产生一个唯一的zxid,并且是全局有序的,对于同一个节点,序号越大表示变更的时间约晚.zxid是64位数字,高32位表示选举的zxid,低32位表示自增计数(待完善)
版本
Znode有三个版本字段,verion,cversion,aversion.version是Znode的版本号,使用乐观锁的思想,每次变动都会自增version,而cversion是子节点的版本号,
节点类型
ZooKeeper的节点分为持久节点(persistent),临时节点(ephemeral)两类,还有一种分类是根据是否有序分的:顺序节点,无序节点,这样就会组合成四种.如何确定是否有序还是无序?
Stat类的ephemeralOwner标记节点类型
优势
高性能,有序