ZooKeeper的概念和基础

  •        ZooKeeper简介

        在计算机诞生之后很长的一段时间里,一个应用服务是在一个独立的单处理器计算机上运行一段程序。时至今日,应用服务已经发生了很大的变化。在大数据和云计算盛行的今天,应用服务由很多个独立的程序组成,这些独立的程序则运行在形形色色、千变万化的一组计算机上。 相对于开发在一台计算机上运行的单个程序,如何让一个应用中多个独立的程序协同工作是一件非常困难的事情。开发这样的应用,很容易让很多开发人员陷入如何使多个程序协同工作的逻辑中,最后导致没有时间更好地思考和实现他们自己的应用程序逻辑;又或者开发人员对协同逻辑关注不够,只是用很少的时间开发了一个简单脆弱的主协调器,导致不可靠的单一失效点。 ZooKeeper的设计保证了其健壮性,这就使得应用开发人员可以更多关注应用本身的逻辑,而不是协同工作上。ZooKeeper从文件系统API得到启发,提供一组简单的API,使得开发人员可以实现通用的协作任务,包括选举主节点、管理组内成员关系、管理元数据等。ZooKeeper包括一个应用开发库(主要提供Java和C两种语言的API)和一个用Java实现的服务组件。ZooKeeper的服务组件运行在一组专用服务器之上,保证了高容错性和可扩展性。 当你决定使用ZooKeeper来设计应用时,最好将应用数据和协同数据独立开。比如,网络邮箱服务的用户对自己邮箱中的内容感兴趣,但是并不关心由哪台服务器来处理特定邮箱的请求。在这个例子中,邮箱内容就是应用数据,而从邮箱到某一台邮箱服务器之间的映射关系就是协同数据(或称元数据)。整个ZooKeeper服务所管理的就是后者。

  • ZooKeeper的使命

       试着说明ZooKeeper能为我们做什么,就像解释螺丝能为我们做什么一样。我们可以简单地表述,螺丝刀可以让我们拧动螺丝。但是这种方式并不能完全表达螺丝刀的能力。实际上,螺丝刀还可以让我们组装各种家具和电子设备,甚至在某些情况下你还可以用它把画挂在墙上。就像螺丝刀的例子一样,我们将介绍ZooKeeper能做什么,虽然未必详尽。

        关于ZooKeeper这样的系统功能的讨论都围绕着一条主线:它可以在分布式系统中协作多个任务。一个协作任务是指一个包含多个进程的任务。这个任务可以是为了协作或者是为了管理竞争。协作意味着多个进程需要一同处理某些事情,一些进程采取某些行动使得其他进程可以继续工作。比如,在典型的主-从(master-worker)工作模式中,从节点处于空闲状态时会通知主节点可以接受工作,于是主节点就会分配任务给从节点。竞争则不同。它指的是两个进程不能同时处理工作的情况,一个进程必须等待另一个进程。同样在主-从工作模式的例子中,我们想有一个主节点,但是很多进程也许都想成为主节点,因此我们需要实现互斥排他锁(mutual exclusion)。实际上,我们可以认为获取主节点身份的过程其实就是获取锁的过程,获得主节点控制权锁的进程即主节点进程。 如果你曾经有过多线程程序开发的经验,就会发现很多类似的问题。实际上,在一台计算机上运行的多个进程和跨计算机运行的多个进程从概念上区别并不大。在多线程情况下有用的同步原语在分布式系统中也同样有效。一个重要的区别在于,在典型的不共享环境下不同的计算机之间不共享除了网络之外的其他任何信息。虽然许多消息传递算法可以实现同步原语,但是使用一个提供某种有序共享存储的组件往往更加简便,这正是ZooKeeper所采用的方式。 协同并不总是采取像群首选举或者加锁等同步原语的形式。配置元数据也是一个进程通知其他进程需要做什么的一种常用方式。比如,在一个主-从系统中,从节点需要知道任务已经分配到它们。即使在主节点发生崩溃的情况下,这些信息也需要有效。 让我们看一些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作为控制器,用来实现数据分片、故障恢复和服务发现等功能。

       除了以上介绍的这些应用外,还有很多使用ZooKeeper的例子。根据这些代表应用,我们可以从更抽象的层次上讨论ZooKeeper。当开发人员使用ZooKeeper进行开发时,开发人员设计的那些应用往往可以看成一组连接到ZooKeeper服务器端的客户端,它们通过ZooKeeper的客户端API连接到ZooKeeper服务器端进行相应的操作。

Zookeep的客户端API功能强大,其中包括:

       ·保障强一致性、有序性和持久性。

       ·实现通用的同步原语的能力。

       ·在实际分布式系统中,并发往往导致不正确的行为。

ZooKeeper提供了一种简单的并发处理机制。 当然,ZooKeeper也并不是万能的,我们还不能让它解决所有问题。对我们来说,更重要的是要了解ZooKeeper为我们提供了什么,并知道如何处理其中的一些棘手问题。这本书的目标之一就是讨论如何处理这些问题。我们将介绍ZooKeeper为开发人员提供的各种功能,也会讨论我们在开发ZooKeeper应用中遇到的一些问题,带你走入ZooKeeper的世界。

  • 关于ZooKeeper名字的来源

ZooKeeper由雅虎研究院开发。我们小组在进行ZooKeeper的开发一段时间之后,开始推荐给其他小组,因此我们需要为我们的项目起一个名字。与此同时,小组也一同致力于Hadoop项目,参与了很多动物命名的项目,其中有广为人知的Apache ZooKeeper由雅虎研究院开发。我们小组在进行ZooKeeper的开发一段时间之后,开始推荐给其他小组,因此我们需要为我们的项目起一个名字。与此同时,小组也一同致力于Hadoop项目,参与了很多动物命名的项目,其中有广为人知的Apache Pig项目(http://pig.apache.org)。我们在讨论各种各样的名字时,一位团队成员提到我们不能再使用动物的名字了,因为我们的主管觉得这样下去会觉得我们生活在动物园中。大家对此产生了共鸣,分布式系统就像一个动物园,混乱且难以管理,而ZooKeeper就是将这一切变得可控。

 

  • ZooKeeper改变了什么

使用ZooKeeper是否意味着需要以全新的方式进行应用程序开发?事实并非如此,ZooKeeper实际上简化了开发流程,提供了更加敏捷健壮的方案。 ZooKeeper之前的其他一些系统采用分布式锁管理器或者分布式数据库来实现协作。实际上,ZooKeeper也从这些系统中借鉴了很多概念。但是,ZooKeeper的设计更专注于任务协作,并不提供任何锁的接口或通用存储数据接口。同时,ZooKeeper没有给开发人员强加任何特殊的同步原语,使用起来非常灵活。 虽然我们也可以不使用ZooKeeper来构建分布式系统,但是使用ZooKeeper可以让开发人员更专注于其应用本身的逻辑而不是神秘的分布式系统概念。所以不使用ZooKeeper开发分布式系统也并不是不可能,只是难度会比较大。

  • ZooKeeper不适用的场景

整个ZooKeeper的服务器集群管理着应用协作的关键数据。ZooKeeper不适合用作海量数据存储。对于需要存储海量的应用数据的情况,我们有很多备选方案,比如说数据库和分布式文件系统等。因为不同的应用有不同的需求,如对一致性和持久性的不同需求,所以在设计应用时,最佳实践还是应该将应用数据和协同数据独立开。 ZooKeeper中实现了一组核心操作,通过这些可以实现很多常见分布式应用的任务。你知道有多少应用服务采用主节点方式或进程响应跟踪方式?虽然ZooKeeper并没有为你实现这些任务,也没有为应用实现主节点选举,或者进程存活与否的跟踪的功能,但是,ZooKeeper提供了实现这些任务的工具,对于实现什么样的协同任务,由开发人员自己决定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrZhangBaby

请博主喝杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值