Zookeeper对我们的意义就像解释螺丝刀对我们的意义一样。简而言之,螺丝刀允许我们拧螺丝,但是仅仅这样说不能表达出这个工具的能力。螺丝刀允许我们组装家具和电子设备,例如在墙上挂一副画。通过给出更多的这样的例子,我们对螺丝刀能做的事情有个大致的感觉,但是这样去描述也不够完整。
Zookeeper这样的系统能为我们做什么可以归结于这一点:它在分布式系统中能提供协同任务。协同任务一个有着多个进程参与的任务。比如,一个任务以协作或者协调为目的。协作意味着参与的进程需要一起做一些事情,一些进程需要执行某种动作让其他的进程继续运行。例如,在典型的master-worker架构中,当worker可用时它会通知master,Master随后会指派任务给worker。当遇到这种情况是竞争是不一样的,比如两个进程不能并发的运行,一个进程必须等待另外一个进程。还是那个master-worker的例子,我们只想要一个master,但是多个进程可能都会尝试变成master。多进程然后需要实现互斥操作。我们实际上希望获取领导权的任务像获取锁一样:那个获取了领导权锁的进程会变成master的角色。
如果你有过多线程编程的经验,你会意识到它们之间有很多的相似的问题。实际上,有着多个进程运行在同一台计算机上或者跨越多个计算机本质上没有什么区别。同步原语在多线程上线文中非常有用,同样在分布式环境中也一样有用。然而,一个重要的区别源于这样一个事实:在典型的非共享架构中,不同的计算器除了网络不会共享任何东西。虽然有很多的消息传递算法能实现同步原语,但是如果能依赖一个提供顺序排列属性的共享存储会容易实现很多,Zookeeper就提供这样的服务。
协同并不总是采用同步原语的形式,例如领导者选举或者锁服务。一个进程告诉其他进程该做经常采用 配置元数据的方式进行。例如,在master-worker系统中,workers需要知道那些指派给他们的任务,而这些信息即使在master奔溃的情况下也要可用。
我们来看一些例子,来对Zookeeper的使用有一个更加具象的了解。
Apache HBase
HBase是一个经常和Hadoop一起使用的数据存储系统。在HBase中,Zookeeper被用作选举一个集群的领导者,追踪可用的服务器,维护集群的元数据。
Apache Kafka
Kafka是一个发布-订阅模式的消息系统。它用Zookeeper检测奔溃,实现主题发现,维护主题的生成者和消费者的状态。
Apache Solr
Solr是一个企业级的搜索平台。在分布式的形态中,它被成为SolrCloud,它用Zookeeper来存储关于集群的元数据,以及协调这些袁术的更新。
Yahoo!Fetching Service
Fetching Service实现了爬虫的部分工作,它能通过缓存内容数据有效的抓取WEB页面,同时又能确保WEB服务器的抓取策略能得到保留,比如那些robotx.txt文件。该服务使用Zookeeper来处理领导者选举、奔溃检查、元数据存储之类的任务。
Facebook Messages
这是一个Facebook应用,它整合了沟通的各个渠道:emails,SMS,Facebook Chat和现存的Facebook Inbox。它使用Zookeeper作为实现分片、故障转移和服务发现的控制器。
除了上面的例子,外面还有大量的实用案例。通过这个示例,让我们现在进行一些更加抽象的讨论。当使用Zookeeper进行编程时,开发者设计他们的应用程序作为连接到Zookeeper服务器的客户端,通过Zookeeper客户端的API进行某些操作。在Zookeeper的这些能力中,它主要提供一下几个能力:
- 强一致性、排序和持久化的保证
- 实现同步原语的能力
- 提供一种简单的方式来处理并发的各方面问题,这些问题在现实的分布式环境中经常导致不正确的行为
然而,Zookeeper并没有魔法,他不能开箱即用的解决所有的问题。所以理解Zookeeper提供的能力并了解它棘手的某些方面至关重要。本书的一个目标就是讨论处理这些问题的方式。我们涵盖了那些需要读者知道关于Zookeeper能为开发者做什么的基础知识。另外,我们还讨论了有Zookeeper的应用程序在实现过程中会出现的若干问题,帮助那些刚刚接触Zookeeper的开发者们。
Zookeeper名字的由来
Zookeeper室友雅虎研究院开发出来的。我们在Zookeeper上工作了一段时间,并把它推销给其他的团队,所以我们需要一个名字。那时候,团队和Hadoop的团队一起工作,并开发了各种各样的以动物名字为代号的项目,Apache Pig(猪)就是其中最有名的一个。当我们讨论不同动物的名字时,我们的经理想到好像听上去我们生活中一个动物园中。就是这样敲定的,分布式系统就是一个动物园。它们嘈杂并且难以管理,Zookeeper意味着让它们在管控之中。
本书采用猫来做封面也是合适的,因为早期的一片来自雅虎研究院的关于Zookeeper的文章把分布式进程管理描述的像管理一群猫。Zookeeper听上去要比一群猫要好点。