ZooKeeper 使用一个树形结构的命令空间表示其数据结构。ZooKeeper 树中的每个节点称为一个 Znode,Znode是 ZooKeeper 中数据的最小单元并且每个 Znode 都有一个唯一的路径标识。ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,一般不要放比较大的数据在 Znode 上,所以 ZooKeeper 给出的上限是每个结点的数据大小最大是 1M。
ZooKeeper 的每个节点不经存储了数据信息,同时提供对节点信息监控 (Watch) 等操作。
每个节点还可以拥有 N 个子节点,最上层是根节点以“/”来代表,Zookeeper 的数据模型如下图:
Znode 兼具文件和目录两种特点:既可以像文件一样保存和维护数据,又可以像目录一样作为路径标识的一部分。每个 Znode 有 3 部分组成:
Stat
状态信息,用于存储 Znode 的版本、权限和时间戳等信息。
Data
Znode 中具体存储的数据。
Children
Znode 子节点的信息描述。
Znode 节点虽然可以存储数据,但并不能存储大量数据,主要是用来存储分布式应用中的配置文件、集群状态等元数据信息。
Zookeeper 中节点有 3 种:永久节点、临时节点、有序节点。节点的类型在创建时被确定并且不能改变。
永久节点
一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除。该类节点一般用于存储一些永久性的配置信息。
临时节点
如果会话结束或者超时临时节点就会消失。此外,临时节点只能做叶子节点 ,不能创建子节点。
有序节点
在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,以此类推。显然有序节点包括永久有序结点和临时有序节点。
每个 Znode 节点都有一个访问控制列表(Access Control List,ACL),该列表规定了用户对节点的访问权限,应用程序可以根据需求将用户分为只读、只写和读写用户。对于 Znode 操作的权限,ZooKeeper 提供了以下 5 种:
对于身份认证,提供了以下几种方式:
每个 Znode 节点上的数据都具有原子操作的特性,读操作将获取与节点相关的数据,写操作将替换节点上的数据。
Watcher 即事件监听器,是 ZooKeeper 中的一个很重要的特性。
ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
Session 即会话,可以看作是 ZooKeeper 服务器与客户端的之间的一个 TCP 长连接,通过这个连接,客户端能够通过心跳检测与服务器是否保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的 Watcher 事件通知。
Session 有一个属性叫做:sessionTimeout ,即会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 sessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
另外,在为客户端创建会话之前,服务端首先会为每个客户端都分配一个 sessionID。由于 sessionID是 ZooKeeper 会话的一个重要标识,许多与会话相关的运行机制都是基于这个 sessionID 的,因此无论是哪台服务器为客户端分配的 sessionID,都必须是全局唯一的。