ZooKeeper学习笔记(一)之概览
ZooKeeper致力于开发一种能提供高可靠分布式协同的开源服务。
什么是ZooKeeper
Zookeeper是一个集中式的服务,提供配置信息维护、命名(目录)、分布式同步和组服务功能。上述服务在分布式系统中被广泛地以各种形式使用。这些服务通常伴随着大量不可避免的Bug和竞争条件。正因为上述服务的实施困难,应用程序通常在开始时会在此妥协,导致程序脆弱和难于维护。即使没有错误,不同的部署也会导致管理的复杂。
naming service 也称directory service.
协同一个分布式系统就像管理一个动物园。
ZooKeeper致力于将上述服务的必要部分提取成一组非常简单的集中协同服务API。服务本身就是分布式和高可靠的。一致性、组管理和presence协议将由服务提供,应用不必自己来实现。应用程序使用特定服务由ZooKeeper特定组件和应用程序特定convention组成。ZooKeeper提供的配方将表明这些简单服务可以用来构建强大的抽象。
ZooKeeper本身有C和Java的实现,并提供多种Client绑定,含Python Ruby和Go。
ZooKeepr概览
ZooKeeper允许分布式进程通过共享的层级的数据注册命令空间(类似文件系统)来相互协同。不同于文件系统的是,ZooKeeper为Client提供高吞吐量,低延时,高可用和顺序严格的znode存取。高性能全ZooKeeper可被用在大型的分布式系统。高可靠保证ZooKeeper不会成为系统的单点命门。严格的顺序使复杂的同步单元可在Client上实施。命名空间则非常类似标准的文件系统。
name是一系列用/分隔的的路径元素,命名空间中的每一个zonode由path来唯一标识。每个znode都有比它少一个路径元素前缀的父node,除了root(/)无父node之外。和文件系统一样,如果一个znode没有子znode,它可以被删除。
与文件系统最大的区别是每个znode都可以有数据与之关联(文件可以包含目录,反之亦然),每个znode只能拥有有限数据。ZooKeeper被设计来保存协同数据,配置,位置信息等。这类数据通常以KB为单位或者更小,总之被用于保存单个体积较小的数据。
服务本身由运行于多个主机上的Copy组成,这些机器维护一个保存于内存中的数据树镜像,以及存于持久存储中的一个事务日志和快照。因为数据保存在内存中,ZooKeeper可以做到高吞吐低延时,局限在于容量受限于内存大小,这也是ZooKeeper选择保存较小体积数据的原因。
组成ZooKeeper的Server进程必须彼此知悉,只要多数Server可用,服务就可用。Client也必须知道Servers的信息,并使用Server列表创建一个指向服务的Handle。Client只连接到一个ZooKeeper Server,通过TCP连接来发送请求,获得响应,监听事件及维持心跳,如果连接断开,Client会连接另一个Server。当Client首次连接到服务时,Server为其创建一个会话,如果Client需要连接到另一个Server,该会话会在另一个Server间重新建立。
Client发送的Read请求在与之连接的Server本地处理,如果read请求注册了监听(watch)znode,监听也在本地处理。Write请求将会发送到所有Server并在协同后响应,同步(sync)请求也会被转发到所有Server,但并不需要协同。所以Read请求是随Server数量增多而吞吐量增加的,Write则相反。
ZooKeeper对顺序是非常重视的,几乎是强迫症(obsessive–compulsive disorder)式的。所有更新完全有序化,实际上Zookeeper为每次更新都加上唯一的、能反映顺序的数字印记(zxid:Zookeeper transaction id)。Read与更新之间也是有序的,read的响应也会被与之连接的Server加上最新(latest)的zxid。