Eureka与zookeeper的区别、原理及各⾃优缺点
前⾔
在微服务的开发过程中,如果使⽤的是 Dubbo 那就必须香港明星谁最有钱
使⽤到 Zookeeper ,在使⽤ Spring Cloud Eureka 时,⾃然其功能更强⼤得多。博主也不得不感叹,Spring Cloud Eureka 后来者居上呀,Dubbo 早在⼏年前停⽌了维护,在其停⽌了维护的⼏年⾥正是互联⽹发展的⼤好时期,Eureka 借机快速发展,夺得了⼀⼤⽚市场,可以说已经超越了 Dubbo 了,17年的时候,阿⾥巴巴⼜突然宣布重启对Dubbo 的维护,在其重启的发布会上,其主导维护者也表⽰,将希望加⼊ Eureka 的⽣态,呃。。。好吧。
废话过多,进⼊正题。为什么要⽤ Eureka 与 Zookeeper 进⾏⽐较呢,因为两者都有类似的起到服务注册中⼼的作⽤,请往下看。
关于 Eureka
1、什么是 Eureka ?
Eureka 是 Netflix 的⼀个⼦模块,也是核⼼模块之⼀。Eureka 是⼀个基于 REST(REprentational State Transfer) 的服务,⽤于定位服务,以实现云端中间层服务器的负载均衡和故障转移。Eureka还附带了⼀个基于java的客户端组件——Eureka Client,它使得感叹岁月流逝的诗句
与服务的交互更加容易。Eureka Client 还
有⼀个内置的负载均衡器,可以进⾏基本的循环负载均衡,在 Netflix,⼀个更加复杂的负载均衡器封装了 Eureka,可以根据流量、资源的使⽤情况、错误条件等因素根据⾃定义的权重来实现负载均衡,从⽽提供更好的弹性服务。
对于服务注册与发现对于微服务架构来说是⾮常重要的,有了服务发现与注册,只需要使⽤服务的标识符,就可以访问到服务,⽽不需要修改服务调⽤的配置⽂件了。
2、Eureka 基本架构原理
Eureka 采⽤了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中⼼。⽽系统中的其他微服务,则使⽤Eureka Client 连接到 Eureka Server 并维持⼼跳连接。这样系统的维护⼈员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运⾏。Spring Cloud 的⼀些其他⼦模块(例如 Gateway)就可以通过 Eureka Server 来发现系统中的其他微服务,并执⾏相关的业务逻辑。⼀个 Eureka 的⾼可⽤架构图如下(后⾯会专门的⼀篇⽂章来描述如何实现⾼可⽤):
上⾯图描述了 Eureka 是如何部署在 Netflix 上的,这是 Eureka 典型的使⽤案例。每个区域都有⼀个 Eureka 集群,⽽这个 Eureka 集群只知道该区域中的实例。每个区域⾄少有⼀个 Eureka 服务器来处理该区域故障(故障转移)。
关于 Eureka 的更多内容,请查看《 Eureka 基本原理及其架构概述 》
Eureka 源码地址:
关于 Zookeeper
1、为什么要使⽤ Zookeeper ?
Zookeeper 是⼀个⽤于维护配置信息、命名、提供分布式同步和提供组服务的集中服务。 所有这些类型的服务都以某地理学家
种形式被分布式应⽤程序使⽤。 每次实现它们时,都会有⼤量的⼯作⽤于修复不可避免的 bug 和竞争条件。 由于难以实现这些类型的服务,应⽤程序在开始时通常会缩减这些服务,这使得它们在咽立爽口含滴丸
出现变更时变得脆弱,难以管理。 即使正确地执⾏,在部署应⽤程序时,这些服务的不同实现也会导致管理复杂性。
ZooKeeper 的⽬标是将这些不同服务的精华提炼成⼀个⾮常简单的、集中的协调服务接⼝。 服务本⾝是分布式的,并且⾼度可靠的。 其⼀致性、集群管理和协议都将由服务来实现,这样应⽤程序就不需要⾃⼰再去实现它们。 这些应⽤程序的特定⽤途将由 Zookeeper 的特定组件和应⽤程序的特定约定组成。 ⽽ Zookeeper Recipes 就向我们展⽰了如何使⽤这个简单的服务来构建更强⼤的抽象。
2、什么是 Zookeeper ?
ZooKeeper 是⼀个分布式的,开放源码的分布式应⽤程序协调服务,是 Google 的 Chubby ⼀个开源
的实现,是 Hadoop 和 Hba 的重要组件。它是⼀个为分布式应⽤提供⼀致性服务的软件,其主要功能包括:配置维护、域名服务、分布式同步、组服务管理等。
ZooKeeper 的⽬标就是错综复杂的、易出错的服务封装起来,将简其单易⽤的接⼝和性能⾼效、功能稳定的系统服务暴露出来并提供给⽤户调⽤使⽤。
3、Zooekeeper 基本原理
ZooKeeper 是以 Paxos 算法为基础的,⽽Paxos 算法存在活锁的问题,即当有多个 propor 交错提交时,有可能互相排斥导致没有⼀个 propor 能提交成功,⽽ Paxos 作了⼀些优化,通过选举产⽣⼀个leader (领导者),只有 leader 才能提交 propor。
*注:所谓的 Paxos 算法是⼀种基于消息传递的⼀致性算法,并且该算法被认为是类似算法中最有效的。
ZooKeeper 的基本运⾏流程:
1、选举 Leader(所以⼀般要求3个,或者以上)。
2、同步数据。
3、选举 Leader 过程中算法有多中,但最终的选举标准是⼀致的。
4、Leader 被赋予最⾼的执⾏ID(竞选成功后的授权),其执⾏ID类似于Linux中的root权限。
5、集群中服务得到通知并⼀致的认可选出的 Leader。
6、Leader 服务器宕机,进⼊1)步,再次进⾏ Leader 选举。
4、Zookeeper 特性
在 Zookeeper 中,znode 是⼀个跟UFS(Unix File System) 路径相似的节点,可以往这个节点存储或获取数据。Zookeeper 使⽤Watcher 事件进⾏监测,如果在创建 znode 时 Flag 设置为临时节点的(关于更多 Flag 的设置,请参考:),那么当创建这个 znode 的节点与 Zookeeper 服务失去连接后,这个 znode 将不再存在在 Zookeeper ⾥。当客户端接收到事件信息,⽐如连接超时、节点数据改变、⼦节点改变,都可以调⽤相应的事件来处理数据。
Zookeeper 源码地址:
Eureka 与 zookeeper 的区别
1、了解什么是 CAP原则
CAP 原则⼜称 CAP 定理,1998年,加州⼤学的计算机科学家 Eric Brewer 提出的,指的是在⼀个分布式系统中,Consistency(⼀致性)、 Availability(可⽤性)、Partition tolerance(分区容错性),三者不可兼得(我们常说的鱼和熊掌不可兼得)。CAP 原则也是NoSQL 数据库的基⽯。
2、CAP 原则的三个指标
1、⼀致性(Consistency,C):在分布式系统中的所有数据备份,在同⼀时刻是否同样的值。(等同于所有节点访问同⼀份最新的数据副本)。
2、可⽤性(Availability,A):在⼀个分布式系统的集群中⼀部分节点故障后,该集群是否还能够正常响应客户端的读写请求。(对数据更新具备⾼可⽤性)。
3、分区容错性(Partition tolerance,P):⼤多数的分布式系统都分布在多个⼦⽹络中,⽽每个⼦⽹络就叫做⼀个区(partition)。分区容错的意思是,区间通信可能失败。⽐如阿⾥巴巴的服务器(不知道各位有没有发现,不管你到那个城市去,你访问的服务器总是该城市的,其中使⽤ 了算法,由于篇幅有限就不再这⼉⼀⼀讲解了),⼀台服务器放在上海,另⼀台服务器放在北京,这就是两个区,它们之间可能存在⽆法通信的情况。在⼀个分布式系统中⼀般分区容错是⽆法避免的,因此可以认为 CAP 中的 P 总是成⽴的。CAP 理论告诉我们,在 C 和 A 之间是⽆法同时做到。
3、区别
Spring Cloud Eureka -> AP
Spring Cloud Netflix 在设计 Eureka 时就紧遵AP原则(尽管现在2.0发布了,但是由于其闭源的原因 ,博主⼀直⽆法进⼀步的研究,但是⽬前 Ereka 1.x 任然是⽐较活跃的)。Eureka Server 也可以运⾏
多个实例来构建集群(后⾯专门的⽂章讲解),解决单点问题,但不同于 ZooKeeper 的选举 leader 的过程,Eureka Server 采⽤的是Peer to Peer 对等通信。这是⼀种去中⼼化的架构(参看:微服务与微服务架构思想与原则),⽆ master/slave 之分,每⼀个 Peer 都是对等的。在这种架构风格中,节点通过彼此互相注册来提⾼可⽤性,每个节点需要添加⼀个或多个有效的 rviceUrl 指向其他节点。每个节点都可被视为其他节点的副本。
在集群环境中如果某台 Eureka Server 宕机,Eureka Client 的请求会⾃动切换到新的 Eureka Server 节点上,当宕机的服务器重新恢复后,Eureka 会再次将其纳⼊到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会在节点间进⾏复制(replicate To Peer)操作,将请求复制到该 Eureka Server 当前所知的其它所有节点中。
当⼀个新的 Eureka Server 节点启动后,会⾸先尝试从邻近节点获取所有注册列表信息,并完成初始化。Eureka Server 通过getEurekaServiceUrls() ⽅法获取所有的节点,并且会通过⼼跳契约的⽅式定期更新。默认情况下,如果 Eureka Server 在⼀定时间内没有接收到某个服务实例的⼼跳(默认周期为30秒),Eureka Server 将会注销该实例(默认为90秒,如果某个 eureka.instance.lea-expiration-duration-in-conds 进⾏⾃定义配置)。当 Eureka Server 节点在短时间内丢失过多的⼼跳时,那么这个节点就会进⼊⾃我保护模式(后⾯有⽂章会谈及关于 Eureka Server 的⾃我保护机制)。
Apache Zookeeper -> CP
与 Eureka 有所不同,Apache Zookeeper 在设计时就紧遵CP原则,即任何时候对 Zookeeper 的访问请求能得到⼀致的数据结果,同时系统对⽹络分割具备容错性,但是 Zookeeper 不能保证每次服务请求都是可达的。从 Zookeeper 的实际应⽤情况来看,在使⽤Zookeeper 获取服务列表时,如果此时的 Zookeeper 集群中的 Leader 宕机了,该集群就要进⾏ Leader 的选举,⼜或者 Zookeeper
集群中半数以上服务器节点不可⽤(例如有三个节点,如果节点⼀检测到节点三挂了 ,节点⼆也检测到节点三挂了,那这个杀鸡焉用牛刀
节点才算是真的挂了)简易版牛奶布丁
,那么将⽆法处理该请求。所以说,Zookeeper 不能保证服务可⽤性。
当然,在⼤多数分布式环境中,尤其是涉及到数据存储的场景,数据⼀致性应该是⾸先被保证的,这也是 Zookeeper 设计紧遵CP原则的另⼀个原因。但是对于服务发现来说,情况就不太⼀样了,针对同⼀个服务,即使注册中⼼的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者虽然拿到可能不正确的服务实例信息后尝试消费⼀下,也要胜过因为⽆法获取实例信息⽽不去消费,导致系统异常要好(淘宝的双⼗⼀,京东的⼳六⼋就是紧遵AP的最好参照)。
4、结束语
ZooKeeper 基于 CP,不能保证⾼可⽤,Eureka 基于AP,能保证⾼可⽤。作为注册中⼼⽽⾔,配置是不经常变动的,只有当新版本发布或者服务器出故障时会变动。CP 不合适于配置经常变动的,⽽ AP 在遇到问题时可以牺牲其⼀致性来保证系统服务的⾼可⽤性,既返回旧数据。
Eureka从理论上讲作为系统服务的注册中⼼是最适合的。也有不少⼈认为,在现实⽣产环境中他(她)遇到的很多项⽬都采⽤的是Zookeeper + Dubbo 实现的服务注册与发现,那是因为你们的集群(业务流量需求)还不够庞⼤,流量⼩,⼀般环境运⾏都⽐较稳定的,基本上不会遇到注册中⼼的实例(节点)半数以上都挂了的情况,问题也不会那么的明显罢了,或根本就遇不到。
所以在实际⽣产环境中,选择 Zookeeper 还是选择 Eureka ,这个就要取决于系统架构师对于业务环境的权衡了。
好了,关于 Eureka 与 zookeeper 的区别、原理及各⾃优缺点 就写到这⼉了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留⾔哦,我会⼀⼀详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望⼤家多多