为什么不使用ZooKeeper构建云平台发现服务?

本文作者通过ZooKeeper与Eureka作为 Service发现服务(注:WebServices 体系中的UDDI就是个发现服务)的优劣对比,分享了Knewton在云计算平台部署服务的经验。本文虽然略显偏激,但是看得出Knewton在云平台方面是非常有经验的,这篇文章从实践角度出发分别从云平台特点、CAP原理以及运维三个方面对比了ZooKeeper与Eureka两个系统作为发布服务的优劣,并提出了在云平台构建发现服务的方法论。

背景

很多公司选择使用 ZooKeeper作为Service发现服务(Service Discovery),但是在构建 Knewton(Knewton 是一个提供个性化教育平台的公司、学校和出版商可以通过Knewton平台为学生提供自适应的学习材料)平台时,我们发现这是个根本性的错误。在这边文章 中,我们将用我们在实践中遇到的问题来说明,为什么使用ZooKeeper做Service发现服务是个错误。

请留意服务部署环境

让我们从头开始梳理。我们在部署服务的时候,应该首先考虑服务部署的平台(平台环境),然后才能考虑平台上跑的软件 系统或者如何在选定的平台上自己构建一套系统。例如,对于云部署平台来说,平台在硬件层面的伸缩(注:作者应该指的是系统的冗余性设计,即系统遇到单点失 效问题,能够快速切换到其他节点完成任务)与如何应对网络故障是首先要考虑的。当你的服务运行在大量服务器构建的集群之上时(注:原话为大量可替换设 备),则肯定会出现单点故障的问题。对于knewton来说,我们虽然是部署在AWS上的,但是在过往的运维中,我们也遇到过形形色色的故障;所以,你应 该把系统设计成“故障开放型”(expecting failure)的。其实有很多同样使用AWS的 公司跟我们遇到了(同时有很多 书是介绍这方面的)相似的问题。你必须能够提前预料到平台可能会出现的问题如:意外故障(注:原文为box failure,只能意会到作者指的是意外弹出的错误提示框),高延迟与 网络分割问题(注:原文为network partitions。意思是当网络交换机出故障会导致不同子网间通讯中断)——同时我们要能构建足够弹性的系统来应对它们的发生。

永远不要期望你部署服务的平台跟其他人是一样的!当然,如果你在独自运维一个数据中心,你可能会花很多时间与钱来避免硬件故障与网络分割问题,这 是另一种情况了;但是在云计算平台中,如AWS,会产生不同的问题以及不同的解决方式。当你实际使用时你就会明白,但是,你最好提前应对它们(注:指的是 上一节说的意外故障、高延迟与网络分割问题)的发生。

ZooKeeper作为发现服务的问题

ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它 很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用;但是用它来做Service发现服务解决方案则是个错误。

在分布式系统领域有个著名的 CAP定理(C- 数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);ZooKeeper是个 CP的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性(注:也就 是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。但是别忘了,ZooKeeper是分布式协调服务,它的 职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性 的了,如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。而且, 作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。

作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算是 返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能 因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨 了!

而且更何况,如果被用作Service发现服务,ZooKeeper本身并没有正确的处理网络分割的问题;而在云端,网络分割问题跟其他类型的故障一样的确会发生;所以最好提前对这个问题做好100%的准备。就像 Jepsen在 ZooKeeper网站上发布的博客中所说:在ZooKeeper中,如果在同一个网络分区(partition)的节点数(nodes)数达不到 ZooKeeper选取Leader节点的“法定人数”时,它们就会从ZooKeeper中断开,当然同时也就不能提供Service发现服务了。

如果给ZooKeeper加上客户端缓存(注:给ZooKeeper节点配上本地缓存)或者其他类似技术的话可以缓解ZooKeeper因为网络故障造成节点同步信息错误的问题。 Pinterest与 Airbnb公 司就使用了这个方法来防止ZooKeeper故障发生。这种方式可以从表面上解决这个问题,具体地说,当部分或者所有节点跟ZooKeeper断开的情况 下,每个节点还可以从本地缓存中获取到数据;但是,即便如此,ZooKeeper下所有节点不可能保证任何时候都能缓存所有的服务注册信息。如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper 会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;所以导致到达这些节点的服务请求 被丢失了。(注:这也是为什么ZooKeeper不满足CAP中A的原因)

更深层次的原因是,ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法的 目的是为了让ZooKeeper变得更加可靠(available);但是,ZooKeeper设计的本意是保持节点的数据一致,也就是CP。所以,这样 一来,你可能既得不到一个数据一致的(CP)也得不到一个高可用的(AP)的Service发现服务了;因为,这相当于你在一个已有的CP系统上强制栓了 一个AP的系统,这在本质上就行不通的!一个Service发现服务应该从一开始就被设计成高可用的才行!

如果抛开CAP原理不管,正确的设置与维护ZooKeeper服务就非常的困难;错误会 经常发生, 导致很多工程被建立只是为了减轻维护ZooKeeper的难度。这些错误不仅存在与客户端而且还存在于ZooKeeper服务器本身。Knewton平台 很多故障就是由于ZooKeeper使用不当而导致的。那些看似简单的操作,如:正确的重建观察者(reestablishing watcher)、客户端Session与异常的处理与在ZK窗口中管理内存都是非常容易导致ZooKeeper出错的。同时,我们确实也遇到过 ZooKeeper的一些经典bug: ZooKeeper-1159 与 ZooKeeper-1576; 我们甚至在生产环境中遇到过ZooKeeper选举Leader节点失败的情况。这些问题之所以会出现,在于ZooKeeper需要管理与保障所管辖服务 群的Session与网络连接资源(注:这些资源的管理在分布式系统环境下是极其困难的);但是它不负责管理服务的发现,所以使用ZooKeeper当 Service发现服务得不偿失。

做出正确的选择:Eureka的成功

我们把Service发现服务从ZooKeeper切换到了Eureka平台,它是一个开 源的服务发现解决方案,由Netflix公司开发。(注:Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作 服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。)Eureka一开 始就被设计成高可用与可伸缩的Service发现服务,这两个特点也是Netflix公司开发所有平台的两个特色。( 他们都在讨论Eureka)。自从切换工作开始到现在,我们实现了在生产环境中所有依赖于Eureka的产品没有下线维护的记录。我们也被告知过,在云平台做服务迁移注定要遇到失败;但是我们从这个例子中得到的经验是,一个优秀的Service发现服务在其中发挥了至关重要的作用!

首先,在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切换 到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务 注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广 的网络分割故障,并实现“0”宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新 的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。

但是,Eureka做到的不止这些。正常配置下,Eureka内置了心跳服务,用于淘汰一些“濒死”的服务器;如果在Eureka中注册的服务, 它的“心跳”变得迟缓时,Eureka会将其整个剔除出管理范围(这点有点像ZooKeeper的做法)。这是个很好的功能,但是当网络分割故障发生时, 这也是非常危险的;因为,那些因为网络问题(注:心跳慢被剔除了)而被剔除出去的服务器本身是很”健康“的,只是因为网络分割故障把Eureka集群分割 成了独立的子网而不能互访而已。

幸运的是,Netflix考虑到了这个缺陷。如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入”自我保护模式“,同时保留那些“心跳死亡“的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对 于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出”自我保护模式“。所以Eureka的哲学是,同时保 留”好数据“与”坏数据“总比丢掉任何”好数据“要更好,所以这种模式在实践中非常有效。

最后,Eureka还有客户端缓存功能(注:Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口)。 所以即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过 Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解 决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。

Eureka的构架保证了它能够成为Service发现服务。它相对与ZooKeeper来说剔除了Leader节点的选取或者事务日志机制,这 样做有利于减少使用者维护的难度也保证了Eureka的在运行时的健壮性。而且Eureka就是为发现服务所设计的,它有独立的客户端程序库,同时提供心 跳服务、服务健康监测、自动发布服务与自动刷新缓存的功能。但是,如果使用ZooKeeper你必须自己来实现这些功能。Eureka的所有库都是开源 的,所有人都能看到与使用这些源代码,这比那些只有一两个人能看或者维护的客户端库要好。

维护Eureka服务器也非常的简单,比如,切换一个节点只需要在现有EIP下移除一个现有的节点然后添加一个新的就行。Eureka提供了一个 web-based的图形化的运维界面,在这个界面中可以查看Eureka所管理的注册服务的运行状态信息:是否健康,运行日志等。Eureka甚至提供 了Restful-API接口,方便第三方程序集成Eureka的功能。

结论

关于Service发现服务通过本文我们想说明两点:1、留意服务运行的硬件平台;2、时刻关注你要解决的问题,然后决定 使用什么平台。Knewton就是从这两个方面考虑使用Eureka替换ZooKeeper来作为service发现服务的。云部署平台是充满不可靠性 的,Eureka可以应对这些缺陷;同时Service发现服务必须同时具备高可靠性与高弹性,Eureke就是我们想要的!

本文作者:佚名

来源:51CTO

时间: 2024-12-09 13:31:09

为什么不使用ZooKeeper构建云平台发现服务?的相关文章

基于成熟基础架构云平台的服务云建设

[硅谷网12月12日文]据<硅谷>杂志2012年第18期刊文,在分析当前云服务建设产业发展机遇的基础上,分析了传统云平台服务建设存在的主要问题.最后,基于成熟的基础架构云(IAAS)平台产品完成基础设施的整合和基础架构云的基础环境部署,验证基础架构云的相关技术能力.成熟度.安全性.可扩展性符合云计算云平台的要求. 0引言 近年来,全球云计算产业蓬勃发展.我国云计算产业兴起于20世纪90年代,云计算产业已经形成了竞争性的产业发展态势,以展览展示.网络游戏.远程教育.数字电视内容制作以及各种影视动

阿里云承建国家级工业云平台 目标服务10万家制造企业

近日,在国家工业和信息化部组织召开的全国云计算工作交流会上,国家工业智能公共服务云平台(下称"国家工智云平台")正式签约启动,以进一步加快落实<云计算发展三年行动计划(2017-2019年)>,推动我国工业互联网云平台的发展. "国家工智云平台"由阿里云计算有限公司(简称"阿里云").中国电子信息产业发展研究院(简称"工信部赛迪研究院").工业和信息化部电子第五研究所(简称"中国赛宝")共同发起

五年磨一剑 初志云平台正式服务于用户

  近日,初志正式推出全新的国产自主可控初志InitCloud云平台,其产品是基于自身云存储技术优势结合云安全领域相关技术,并将先进的openstack技术进行了深度二次开发的基础架构云平台,通过云平台建设可全面满足用户云化的需求,帮助用户打造自己的云计算生态系统.初志InitCloud云平台的设计之初严格参照了国家对云平台的相关标准,并且对标公安行业警务云标准,以此为打造行业私有云奠定了坚实的基础.伴随产品的发布,其产品设计背景以及初志为用户提供云服务业务的相关问题被大家所关注. 厚积薄发 初

宿迁市政务服务依托“云平台”提升“服务式管”

一是建成云平台,实现 "联合作战式"服务.整合行政权力运行网.公共资源交易网.12345政府热线网.电子监察网,建成政务服务云平台,推进部门数据共享,实现便民方舟载体由"场所"向"平台"过渡,各进驻窗口由"物理整合"向"化学反应"转变,便民方舟团队由"多国部队"向"联合作战"转变.2015年共办理各类事项132万件,其中行政许可事项2万余件,公共服务及其他事项近130

北明何长青:联手跨国企业 提供基于云平台管理服务

北明软件有限公司(以下简称"北明")董事会秘书何长青认为,云计算是计算模式的改变,它的到来实际上已经影响到应用软件的体系结构,2010年北明整合后密切关注云计算的发展,并将以集成商的角色同跨国IT云服务提供商合作,提供基于云平台上的管理支撑服务. 北明软件董事会秘书 何长青先生 记者:您认为云计算为IT业带来哪些机遇与变革? 何长青:云计算的到来实际上已经影响到应用软件的体系结构,例如,谷歌在云端提供的在线办公软件服务,使中小企业摆脱了自建IT系统的技术与资金难题:客户采购方式发生的改

Data4公司为用户提供直接访问主要云平台的服务

日前,欧洲数据中心运营商Data4公司推出了新的服务框架,用户通过这个服务框架可以直接访问全球各地的110个公共云平台和互联网交易所. 用户通过"Data4数字中心"访问的云平台包括AWS,Microsoft Azure,Softlayer,Google Cloud,VCloud Air和Salesforce.Data4公司补充说,这其中还包括所有主要的欧洲互联网交易所. Data4公司表示,这个服务框架可立即在法国,意大利和卢森堡的14个数据中心提供. Data4公司产品副总裁Jér

IT号外 至强将关键业务负载迁入云平台

在本期<IT号外>的开篇文章中,我们曾经提到,尽管有相当数量的企业已经开始了自身云计算平台的规模与构建,但他们还少有将关键业务迅速迁移到云平台上的打算,这是因为关键业务对于独立的.专用的IT平台的需求目前仍是十分明显.不过,凡事都有例外,每一种趋势都有其先行者,有一部分用户目前就开始了将关键业务迁入云计算平台的尝试,本文的案例故事主角美国印弟安纳大学的作为就是这样一例. 印弟安纳大学是一个典型的教育行业用户,也是一所排名领先的知名学府,它共设有8个校区,注册学生超过10万人,它还拥有2万名教职

厦门建成全省首个消防管理物联网云平台

利用物联网的传感技术,建立消防安全管理云平台,使单位的消防安全管理插上科技的翅膀.近日,厦门市消防支队召开消防物联网云平台管理服务工作现场会,向全市推广消防物联网云平台的管理与服务. 消防物联网云平台管理,就是综合利用无线传感.云计算.大数据等技术,通过互联网.无线通信网.专网等通信网络,对消防设施.器材.人员等状态进行智能化感知.识别.定位与跟踪,并通过信息处理.数据挖掘和态势分析,为单位消防管理.消防部队防火监管.灭火救援提供信息支撑. 实现这一目标,程序并不复杂.在搜集录入单位消防设施.消

天云科技张福波:云平台要有一个核心和四个方面

5月23日-5月25日,2012 第四届中国云计算大会云基地专场拉开帷幕,展示云实践.探讨云趋势,共享云未来.云基地专场全面展示了云计算领域的最新技术和新产品,并以论坛形式探讨云计算发展趋势.大数据的大价值.云时代数据中心的节能等备受业界关注的热点话题.天云科技副总裁张福波表示:云平台要解决核心的价值和问题,云平台建设有一个核心,四个方面:降低TCO是核心,四个方面为资源共享,自动化管理,数据信息整合以及业务逻辑整合. 张福波:大家下午好.今天很荣幸,天云SkyForm平台发布,Logo是中国的