Zookeeper 是一种分布式的,开源的,应用于分布式应用的协作服务。
它提供了一些简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。
Zookeeper 很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以使用 Java 或者 C 来进行编程接入。
1. Zookeeper 数据模型
ZooKeeper 拥有一个层次的命名空间,这个和标准的文件系统非常相似
ZooKeeper 树中的每个节点被称为—Znode。
和文件系统的目录树一样,ZooKeeper 树中的每个节点可以拥有子节点。
但也有不同之处:
1) 引用方式:
在 ZooKeeper 中,路径由 Unicode 字符串组成,并且有一些限制。字符串"/zookeeper"用以保存管理信息,比如关键配额信息。
2) Znode 结构
ZooKeeper 命名空间中的Znode,兼具文件和目录两种特点。
既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分
每个 Znode 由 3 部分组成:
stat:此为状态信息, 描述该 Znode 的版本, 权限等信息
data:与该 Znode 关联的数据
children:该 Znode 下的子节点
服务器和客户端都被设计为严格检查并限制每个Znode的数据大小至多1M,但常规使用中应该远小于此值
3) 数据访问
每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限
4) 节点类型
Persistent Nodes:永久有效地节点,除非client 显式的删除,否则一直存在。
Ephemeral Nodes:临时节点,仅在创建该节点 client 保持连接期间有效,一旦连接丢失,zookeeper 会自动删除该节点。
Sequence Nodes:顺序节点,ZooKeeper 会自动在节点路径末尾添加递增序号,这种类型是实现分布式锁,分布式 queue 等特殊功能的关键。
5) 监控
客户端可以在节点上设置 watch,
当节点状态发生改变时(Znode的增、删、改)将会触发 watch 所对应的操作。
当 watch 被触发时,ZooKeeper 将会向客户端发送且仅发送一条通知,因为 watch 只能被触发一次,这样可以减少网络流量。
ZooKeeper可以为所有的读操作设置watch,这些读操作包括:exists()、getChildren()及 getData()