Eureka与Zookper的区别

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Eureka与Zookper的区别

Eureka与Zookper的区别

了解什么是CAP?

CAP 原则又称 CAP 定理,1998年,加州大学的计算机科学家 Eric Brewer 提出的,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得(我们常说的鱼和熊掌不可兼得)。CAP 原则也是 NoSQL 数据库的基石。

CAP原则三指标20200401134307494.png

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 都是对等的。在这种架构风格中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的 serviceUrl 指向其他节点。每个节点都可被视为其他节点的副本。


在集群环境中如果某台 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.lease-expiration-duration-in-seconds 进行自定义配置)。当 Eureka Server 节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式(后面有文章会谈及关于 Eureka Server 的自我保护机制)。


Apache Zookeeper -> CP


与 Eureka 有所不同,Apache Zookeeper 在设计时就紧遵CP原则,即任何时候对 Zookeeper 的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是 Zookeeper 不能保证每次服务请求都是可达的。从 Zookeeper 的实际应用情况来看,在使用 Zookeeper 获取服务列表时,如果此时的 Zookeeper 集群中的 Leader 宕机了,该集群就要进行 Leader 的选举,又或者 Zookeeper 集群中半数以上服务器节点不可用(例如有三个节点,如果节点一检测到节点三挂了 ,节点二也检测到节点三挂了,那这个节点才算是真的挂了),那么将无法处理该请求。所以说,Zookeeper 不能保证服务可用性。


当然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是 Zookeeper 设计紧遵CP原则的另一个原因。但是对于服务发现来说,情况就不太一样了,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者虽然拿到可能不正确的服务实例信息后尝试消费一下,也要胜过因为无法获取实例信息而不去消费,导致系统异常要好(淘宝的双十一,京东的幺六八就是紧遵AP的最好参照)。

总结

ZooKeeper 基于 CP,不能保证高可用,Eureka 基于AP,能保证高可用。作为注册中心而言,配置是不经常变动的,只有当新版本发布或者服务器出故障时会变动。CP 不合适于配置经常变动的,而 AP 在遇到问题时可以牺牲其一致性来保证系统服务的高可用性,既返回旧数据。


Eureka从理论上讲作为系统服务的注册中心是最适合的。也有不少人认为,在现实生产环境中他(她)遇到的很多项目都采用的是 Zookeeper + Dubbo 实现的服务注册与发现,那是因为你们的集群(业务流量需求)还不够庞大,流量小,一般环境运行都比较稳定的,基本上不会遇到注册中心的实例(节点)半数以上都挂了的情况,问题也不会那么的明显罢了,或根本就遇不到。


所以在实际生产环境中,选择 Zookeeper 还是选择 Eureka ,这个就要取决于系统架构师对于业务环境的权衡了。


转载自:

原文:https://blog.csdn.net/Hello_World_QWP/article/details/85247142



相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
缓存 负载均衡 算法
Eureka——服务注册与发现框架
Eureka——服务注册与发现框架
14 1
|
9月前
|
缓存
SpringCloud源码剖析-Eureka Server服务剔除
1.从registry中移除服务, 2.从overriddenInstanceStatusMap状态map中移除服务状态 3.添加到最近取消队列 4.调用Lease.cancel方法,将租约对象中的逐出时间修改为当前时间 5.修改服务的InstanceInfo的状态为DELETE 6.添加到最近修改队列 7.更新服务最后修改时间 8.使ReponseCache缓存无效
60 0
SpringCloud源码剖析-Eureka Server服务剔除
|
9月前
|
Java
SpringCloud源码剖析-Eureka Server的自动配置
这里和EureakClientAutoConfiguration差不多,都是由主启动类上的@SpringBootApplication标签中的@EnableAutoConfiguration启动自动配置,通过AutoConfigurationImportSelector来扫描classpath下的starter包中的自动配置类
32 0
|
9月前
|
存储 缓存 API
四.SpringCloud源码剖析-Eureka Client服务发现
什么是服务发现?微服务启动,所有服务提供者会向EurekaServer注册自己,从而在EurekaServer形成一个服务注册表,而消费者服务会定时从EurekaServer拉取服务注册表并缓存到本地,这个流程叫服务注册。当消费者服务向提供者服务发起调用时就会从服务注册表中找到目标服务的通信地址发起访问,那么EurekaClient是怎么从EurekaServer拉取服务注册表的呢?前一章节我们研究了《[Eureak服务注册](https://blog.csdn.net/u014494148/article/details/106907911)》流程,这一章节我们来研究一下Eureak服务发现
四.SpringCloud源码剖析-Eureka Client服务发现
|
9月前
|
存储 缓存 网络架构
SpringCloud源码剖析-Eureka Client服务发现
我们可以看到 eurekaTransport.queryClient 得到一个EurekaHttpClient,使用的是其装饰器EurekaHttpClientDecorator.getApplications方法获取服务注册列表,这样的代码其实就是通过Rest方式去获取服务清单 最后通过 localRegionApps.set把服务存储到本地区域,然后调用AbstractJerseyEurekaHttpClient.getApplications获取所有的服务注册列表,跟踪一下源码
35 0
|
9月前
|
缓存 监控 API
三.SpringCloud源码剖析-Eureka Client服务注册
在上一章《[Eureka Client 初始化过程](https://blog.csdn.net/u014494148/article/details/107982920)》中我们了解到,应用程序在启动的时候就会初始化Eureka并触发Eureka的自动注册,最终会调用`DiscoveryClient`进行服务注册,我们来跟踪一下DiscoveryClient是如何实现服务注册与发现的。
三.SpringCloud源码剖析-Eureka Client服务注册
|
9月前
|
缓存 监控 调度
SpringCloud源码剖析-Eureka Client服务注册
程序启动EurekaClientAutoConfiguration被加载,EurekaClient在EurekaClientAutoConfiguration 中通过“延迟@Lazy”注册。同时EurekaAutoServiceRegistration 监听启动事件,调用 EurekaServiceRegistry的register方法进行注册,该方法会触发EurekaClient的创建 。
61 0
|
9月前
|
缓存
SpringCloud源码剖析-Eureka Server服务下线
1.从registry中移除服务, 2.从overriddenInstanceStatusMap状态map中移除服务状态 3.添加到最近取消队列 4.调用Lease.cancel方法,将租约对象中的逐出时间修改为当前时间 5.修改服务的InstanceInfo的状态为DELETE 6.添加到最近修改队列 7.更新服务最后修改时间 8.使ReponseCache缓存无
40 0
|
9月前
|
Java API
七.SpringCloud源码剖析-Eureka Server的自动配置
前面的章节我们针对于Eureak Client的初始化 ,服务注册 ,服务发现,服务续约,取消注册功能进行了分析,接下来我们围绕Eureka的核心功能对Server端进行分析,本章将会分析Eureka Server的启动过程。
七.SpringCloud源码剖析-Eureka Server的自动配置
|
算法 NoSQL Java
简单回顾 Nacos 与 Eureka 的区别|学习笔记
快速学习简单回顾Nacos与Eureka的区别
189 0

热门文章

最新文章