zookeeper概述
Q: zookeeper 解决了什么问题?
相对于开发在一台计算机上运行的单个程序,如何让一个应用中多个独立的程序协同工作是一件非常困难的事情。开发这样的应用,很容易让很多开发人员陷入如何使多个程序协同工作的逻辑中,最后导致没有时间更好地思考和实现他们自己的应用程序逻辑;又或者开发人员对协同逻辑关注不够,只是用很少的时间开发了一个简单脆弱的主协调器,导致不可靠的单一失效点。
Q: zookeeper 是怎么解决应用中多个独立程序协同工作的问题的?
ZooKeeper从文件系统API得到启发,提供一组简单的API,使得开发人员可以实现通用的协作任务,包括选举主节点、管理组内成员关系、管理元数据等。ZooKeeper包括一个应用开发库(主要提供Java和C两种语言的API)和一个用Java实现的服务组件。ZooKeeper的服务组件运行在一组专用服务器之上,保证了高容错性和可扩展性。
当你决定使用ZooKeeper来设计应用时,最好将应用数据和协同数据独立开。比如,网络邮箱服务的用户对自己邮箱中的内容感兴趣,但是并不关心由哪台服务器来处理特定邮箱的请求。在这个例子中,邮箱内容就是应用数据,而从邮箱到某一台邮箱服务器之间的映射关系就是协同数据(或称元数据)。整个ZooKeeper服务所管理的就是后者
Q: zookeeper的应用场景?
Apache HBase:HBase是一个通常与Hadoop一起使用的数据存储仓库。在HBase中,ZooKeeper用于选举一个集群内的主节点,以便跟踪可用的服务器,并保存集群的元数据。
Apache Kafka:Kafka是一个基于发布-订阅(pub-sub)模型的消息系统。其中ZooKeeper用于检测崩溃,实现主题(topic)的发现,并保持主题的生产和消费状态。
- Apache Solr:Solr是一个企业级的搜索平台。Solr的分布式版本命名为SolrCloud,它使用ZooKeeper来存储集群的元数据,并协作更新这些元数据。
- Yahoo!Fetching Service:Yahoo!Fetching Service是爬虫实现的一部分,通过缓存内容的方式高效地获取网页信息,同时确保满足网页服务器的管理规则(比如robots.txt文件)。该服务采用ZooKeeper实现主节点选举、崩溃检测和元数据存储。
- Facebook Messages:Facebook推出的这个应用(http://on.fb.me/1a7uViK)集成了email、短信、Facebook聊天和Facebook收件箱等通信通道。该应用将ZooKeeper作为控制器,用来实现数据分片、故障恢复和服务发现等功能。
Q: zookeeper不适用的场景?
整个ZooKeeper的服务器集群管理着应用协作的关键数据。ZooKeeper不适合用作海量数据存储。对于需要存储海量的应用数据的情况,我们有很多备选方案,比如说数据库和分布式文件系统等。因为不同的应用有不同的需求,如对一致性和持久性的不同需求,所以在设计应用时,最佳实践还是应该将应用数据和协同数据独立开。
Q: 使用 zookeeper 时需要注意的问题?
- 消息延迟:消息传输可能会发生任意延迟,比如,因为网络拥堵。这种任意延迟可能会导致不可预期的后果。比如,根据基准时钟,进程P先发送了一个消息,之后另一个进程Q发送了消息,但是进程Q的消息也许会先完成传送。
- 处理器性能:操作系统的调度和超载也可能导致消息处理的任意延迟。当一个进程向另一个进程发送消息时,整个消息的延时时间约等于发送端消耗的时间、传输时间、接收端的处理时间的总和。如果发送或接收过程需要调度时间进行处理,消息延时会更高。
- 时钟偏移:使用时间概念的系统并不少见,比如,确定某一时间系统中发生了哪些事件。处理器时钟并不可靠,它们之间也会发生任意的偏移。因此,依赖处理器时钟也许会导致错误的决策。
Q: ZooKeeper的成功和注意事项
不得不指出,完美的解决方案是不存在的,我们重申ZooKeeper无法解决分布式应用开发者面对的所有问题,而是为开发者提供了一个优雅的框架来处理这些问题。多年以来,ZooKeeper在分布式计算领域进行了大量的工作。Paxos算法[1]和虚拟同步技术(virtual synchrony)[2]给ZooKeeper的设计带来了很大影响,通过这些技术可以无缝地处理所发生的某些变化或情况,并提供给开发者一个框架,来应对无法自动处理的某些情况。
ZooKeeper最初由雅虎研究院开发,用于处理大量的大型分布式应用。我们注意到,这些应用在分布式协作方面的处理方式并不妥当,这些系统的部署存在单点故障问题或很脆弱,另一方面,开发者在分布式协作方面花费了大量的时间和精力,导致开发者没有足够的资源来关注应用本身的功能逻辑。我们还注意到,这些应用都在基本协作方面有相同的需求。因此,我们开始着手设计一套通用的解决方案,通过某些关键点让我们可以一次实现就能应用于大多数不同的应用中。ZooKeeper已经被证实更加通用,其受欢迎程度超越了我们的想象。
多年来,我们发现人们可以很容易地部署ZooKeeper集群,轻松通过这个集群开发应用,但实际上,在使用ZooKeeper时,有些情况ZooKeeper自身无法进行决策而是需要开发者自己做出决策,有些开发者并不完全了解这些。编写本书的其中一个目的就是让开发者了解如何更有效地使用ZooKeeper,以及为什么需要这样做。