zookeeper是一个面向应用程序的高性能协调服务器,它使用一个简单的接口暴露公共服务(比如命名和配置管理,同步和组服务),让用户不必从头开始编程,它为实现共识,组管理,领导者选举和到场协议配备了现成的支持。在本文中,我们将探讨zookeeper的基础知识,然后解释一个在模拟的微型分布式环境中建立和部署zookeeper集群的指南。最后我们将提供如何在流行的项目中使用zookeeper的示例。
1 为啥要用zookeeper呢
zookeeper是一个面向分布式系统的构建块,当设计一个分布式系统时,一般需要设计和开发一些协调服务:
名称服务 是指将一个名称映射到与该名称有关联的一些信息的服务。电话目录是将人的名字映射到其电话号码的一个名称服务。DNS也是一个名称服务,它将一个域名映射到一个ip地址,在分布式系统中,您可能想跟踪哪些服务器或服务的运行状态,就可以通过名称来查看其状态。也可以将名称服务扩展到组成员服务。zookeeper暴露了一个简单的接口来完成此工作。
锁定 为了允许在分布式系统中对共享资源进行有序的访问,可能需要实现分布式互斥,zookeeper提供了一个简单的方式来实现它们
同步 与互斥同时出现的是同步访问共享资源的需求。无论是实现一个生产者-消费者队列,还是实现一个障碍,zookeeper都提供了一个简单的接口来实现。
配置管理 可以使用zookeeper集中存储和管理分布式系统的配置,这也就意味者,所有新加入的节点都将在加入系统后就可以立即使用来自zookeeper的最新的集中式配置。这还可以通过其中一个zookeeper的客户端来更改集中式的配置。集中更改分布式系统的状态。
领导者选举 分布式系统可能必须处理节点停机的问题,
利用zookeeper实现一个自动故障转移策略。
虽然可以从头开始设计和实现所有这些服务,但是调试任何问题需要执行额外的工作,并很难实现。
zookeeper虽然是一个针对分布式系统的协调服务,但它本身也是一个分布式应用程序。zookeeper遵循一个简单的客户端-服务器模型,其中客户端是使用服务的节点,而服务器是提供服务的节点。zookeeper服务器的集合形成了一个zookeeper集合。在任何时间内,一个客户端可以连接一个服务端,每个服务端都可以同时处理大量客户端的请求。每个客户端定期发送ping到它连接的zookeeper服务器,让服务器知道它处于活动和连接的状态。被询问的zookeeper服务器也通过ping确认进行响应,表示服务器也处于活动状态。
如果客户端在指定的时间内没有收到服务器的确认,那么客户端会连接到集合体中的另一台服务器,而且客户端会话会被透明的转移到新的zookeeper服务器。
zookeeper有一个类似于文件系统的数据模型,由znode组成。可以将znodes(zookeeper的数据节点)看到unix系统中的文件。但它们可以有子节点,另一种方式是将它们看做是目录,可以有与其相关的数据。每一个目录可以视作znode。
znode的结构存储在zookeeper的内存结构中,这实现了对来自客户端的读取操作的可扩展的快速响应。每个zookeeper服务器还在磁盘上维护一个事务日志。记录所有的写入请求。因为zookeeper服务器在返回一个成功的响应之前必须将事务同步到磁盘,所以事务日志也是zookeeper中对性能最重要的部分。可以存在znode中的数据的默认最大大小为1MB,因此即使zookeeper的层次结构看起来与文件系统类似。也不应该将它用作一个通用的文件系统。相反,应该只将它作少量数据的存储机制,以便提供可靠可用的协调。
当客户端请求读取特定znode的内容时,读取操作是在客户点所连接的服务器上进行的,因此,由于只涉及集合体中的一个服务器,所以读取是快速和可扩展的,然后成功完成写入操作,要求zookeeper集合体的严格意义上的多数节点都是可用的,在启动zookeeper服务时,集合体中的某个节点被选举为领导者,当客户端发出一个写入请求时,所连接的服务器会将请求传递到领导者,此领导者对集合体中的所有节点发出相同的写入请求,如果严格意义上的多数节点(法定数量quorum)成功响应应该写入,那么写入请求被视为成功完成,然后一个成功的代码会返回给发起写入请求的客户端。如果集合体中的可用节点数量未达到法定数量,那么zookeeper服务将不可用。
法定数量是通过严格意义上的多数节点来表示。读取操作始终从连接到客户端的zookeeper服务器来读取数据,所以读取性能不会随着集合体中的服务器数量的变化而变化,但是,
仅在写入法定数量的节点时,写入操作才是成功的。写就以为这,随着集合体中节点数量的增加,写入性能会下降,因为必须将写入更多的服务器中,并在更多服务器之间进行协调。
在zookeeper的集合体中,3 ,5 或 7 是最典型的节点数量,请记住,zookeeper集合体的大小与分布式系统中节点大小没有什么关系。可以利用一个相对较少5个节点的zookeeper集合体运行有50个节点的大型hbase集群。
zookeeper的应用
hadoop依赖zookeeper来实现hadoop hdfs namenode的自动故障转移,以及yarn resourcemanager的高可用性。
hbase 是构建在hadoop之上的分布式数据库,它使用zookeeper来实现区域服务器的主选举 租赁管理 以及区域服务器之间的其他通信
solr 是用zookeeper实现领导选举和集中式配置
mesos是一个集群管理器,提供了分布式应用程序之间高效的资源隔离和共享。mesos使用zookeeper实现了容错的,复制的主选举。