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