ZooKeeper 概述
ZooKeeper: 一个分布式应用的分布式协调服务
ZooKeeper (下面简称 ZK)是一个分布式应用的分布式的、开源的协调服务。ZK 提供一系列原语使得分布式应用可以诸如同步、配置维护、分组和命名等高层次服务。它运行在 Java 环境。
协调服务不好写正确。经常发生的错误有竞态条件和死锁。有了 ZK 就不需要自己从头开始实现协调服务。
设计目标
ZK 简洁。ZooKeeper 允许分布式进程通过与标准文件系统类似的共享分层命名空间相互协调。命名空间由 ZooKeeper 语法中的数据寄存器(称为 znodes )组成,这些类似于文件和目录。不像典型的文件系统是用来存储的,ZK 的数据存储在内存中,这意味着 ZK 拥有高吞吐和低延迟的特点。
ZK 投入很大的精力来实现高性能,高可用和严格的顺序访问。从性能方面来说,ZK 可以用在大型分布式系统中。从可靠性来说,ZK 避免了单点问题。严格的顺序访问意味着复杂的同步原语可以在客户端实现。
ZK 是可复制的。就像它协调的分布式处理一样,ZK 本身也是在一个叫做 ensemble 的主机集合中复制。
ZooKeeper Service |
上图中的 5 个 Server 相互感知。他们有一份在内存的数据,并且有持久化的事务日志和快照日志。只要超过半数的机器存活(n/2 + 1),这个 ZK Service 就可用。
Client 连接到一个 Server 上,如果连接断开,Client 会连接到其他可用 Server。
ZK 是有序的。ZK 的更新操作都有数字来表示顺序。
ZK 快速。ZK 在读为主的情况下,性能非常强。读写 10:1 的时候差不多是性能最好的时候。
数据模型和分级命名空间
路径就是名称,类似常规文件系统,如 /root/hello。
节点和临时节点
ZK的节点可以存储数据(ZK 被设计为存储协调数据:状态信息、配置、位置信息等,所以每个 ZNode 存储的数据都很小,在字节到千字节之间),叫它 ZNode。
临时节点和客户端 session 生命周期一致,session 创建则临时节点创建,session 断开,则临时节点删除。
监听
ZK 支持监听,在 ZK 里面叫做 Watch。客户端 Watch 节点,节点变化 ZK 服务会通知客户端,是一种事件驱动模式。
保障
顺序一致性:按请求顺序来更新
原子性:更新全部成功或者全部失败,没有部分成功部分失败情况
单一系统镜像:Client 无论连接到哪个 server 所获取的结果都是相同的
可靠性:一旦更新操作被应用,那么在客户端再次更新它之前,它的值将不会改变
实时性:在确定的时间范围内,客户端所看到的是最新的
CAP 理论
在分布式领域,有一个CAP理论。CAP理论的核心观点是任何软件系统都无法同时满足一致性、可用性以及分区容错性。
从上面的「保障」的内容可以得出 ZK 是满足 CAP 理论的 CP。P 分区容错性,是分布式应用基本的属性。因为单一系统镜像这个保障,ZK 必须保障所有节点内容一致,那么就要保证 C。
性能
上图是一个 ZK 3.2 版本的吞吐量图,运行在 2Ghz 双核 Xeon 和 2 块 SATA 15K RPM 盘上。ZK 日志写到其中一块盘上,快照写到 OS 驱动器上。servers 表示集群数量。横坐标是读所占的比例,纵坐标是每秒请求量。
参考资料: