Zookeeper 允许分布式进程之间像文件系统一样,通过共享的、有层次的、数据寄存器(我们称这些寄存器为znodes)的命名空间,来相互协调。但是又不像正常的文件系统,Zookeeper为客户端提供:高吞吐,低延迟,高可用,以严格有序地方式访问znodes。Zookeeper的性能使得它能用于大型分布式系统。它的可靠性能避免在大系统的单节点故障。它的严格有序能让客户端复杂的同步语义得以实现。
Zookeeper提供的命名空间很像标准的文件系统。一个名字(name)是由斜线("/")分割的一串路径序列(a sequence of path)。在Zookeeper命名空间里的每个znode都是由路径区分的。除了根znode("/")没有父节点,其他的每个znode都有一个父路znode路径作为它的前缀。还有一点跟文件系统很相似,如果一个znode有子节点,那么该将该节点无法被删除。
Zookeeper和标准文件系统主要的不同是每个znode可以有关联的数据(每个文件还可以是目录,反之亦然),并且znodes的数据是有限制的。Zookeeper被设计为存储用于协调的数据:状态信息,配置,为止信息等等。这类元信息的大小如果不是字节的话,通常是kb。Zookeeper有内置的1M的检查以避免它被用于存储大量数据,但是一般而言,它被用于存储很多更小的数据片段。
Zookeeper服务本身通过一组包含该服务的机器进行复制。这些机器在持久存储中维护数据树的内存映像以及事务日志和快照。因为数据保存在内存里,所以Zookeeper能够获得高吞吐和低延迟。内存数据库的缺点是Zookeeper可供管理的数据库大小受内存限制。这个限制也进一步地保持存储在znode的数据数量小。
组成Zookeeper服务的服务器必须相互知道。只要大多数的服务器可用,那么Zookeeper服务也就将是可用的。客户端也必须知道服务器列表。客户端通过使用服务器列表来和Zookeeper来交互。
客户端只能连接单个Zookeeper服务器。客户端维护了一个TCP连接,通过这个连接,来发送请求,获得响应,获得监听事件以及发送心态。如果连接到服务器的TCP连接中断,那么客户端将会连接一台不同的服务器。当客户端首次连接到Zookeeper服务时,Zookeeper服务器首先会为客户端建立会话。如果客户端需要连接另外的服务器,那么会话会和新的服务器重新连接。
由Zookeeper客户端发送的读取请求会在客户端连接的Zookeeper服务器进行本地处理。如果读取请求在一个znode上注册了监听,那么监听器还会在Zookeeper服务器本地被跟踪。写入请求被转发到其他的Zookeeper服务器,在响应产生以前通过一致性。同步请求还会被转发到另外的服务器,但不会通过一致性。因此,读取请求的吞吐量可随服务器数量伸缩,写请求的吞吐量会随着服务器数量而降低。
有序对Zookeeper也很重要;几乎接近强迫式的无序。所有的更新都是有序的。Zookeeper实际上通过给每个更新打上加戳的序号来反映有序性。我们称这种序号为zxid(Zookeeper Transaction Id)。每个更新都有一个唯一的zxid。读取(和监听者)也遵循更新有序。读取的响应会使用最新的zxid打上戳,通过服务这些读请求的服务器处理。
翻译后感:有些地方即使用翻译工具也感觉违和。