SpringCloud 注册中心 Eureka 集群是怎么保持数据一致的?

服务注册中心不可能是单点的,一定会有一个集群,那么集群中的服务注册信息如何在集群中保持一致的呢?

首先要明确的是 Eureka 是弱数据一致性的。

下面从2个方面来说明:

  1. 什么是弱数据一致性
  2. Eureka 是如何同步数据的

1. 弱数据一致性

我们知道 ZooKeeper 也可以实现数据中心,ZooKeeper 就是强一致性的。

分布式系统中有一个重要理论:CAP。

该理论提到了分布式系统中的3个特性:

  • Consistency 数据一致性

分布式系统中,数据会存在多个副本中,有一些问题会导致写入数据时,一部分副本成功、一部分副本失败,造成数据不一致。

满足一致性就要求对数据的更新操作成功后,多副本的数据必须保持一致。

  • Availability 可用性

在任何时候客户端对集群进行读写操作时,请求能够正常响应。

  • Partition Tolerance 分区容忍性

发生通信故障时,集群被分割为多个无法通信的分区时,集群仍然可用。

CAP 理论指出:这3个特性不可能同时满足,最多满足2个。

P?是客观存在的,不可绕过,那么就是选择?C?还是选择?A

ZooKeeper 选择了?C,就是尽可能的保证数据一致性,某些情况下可以牺牲可用性。

Eureka 则选择了?A,所以 Eureka 具有高可用性,在任何时候,服务消费者都能正常获取服务列表,但不保证数据的强一致性,消费者可能会拿到过期的服务列表。

Eureka 的设计理念:保留可用及过期的数据总比丢掉可用的数据好。

2. Eureka 的数据同步方式

2.1 复制方式

分布式系统的数据在多个副本之间的复制方式,主要有:

  • 主从复制

就是?Master-Slave?模式,有一个主副本,其他为从副本,所有写操作都提交到主副本,再由主副本更新到其他从副本。

写压力都集中在主副本上,是系统的瓶颈,从副本可以分担读请求。

  • 对等复制

就是?Peer to Peer?模式,副本间不分主从,任何副本都可以接收写操作,然后每个副本间互相进行数据更新。

对等复制模式,任何副本都可以接收写请求,不存在写压力瓶颈,但各个副本间数据同步时可能产生数据冲突。

Eureka 采用的就是?Peer to Peer?模式。

2.2 同步过程

Eureka Server 本身依赖了 Eureka Client,也就是每个 Eureka Server 是作为其他 Eureka Server 的 Client。

Eureka Server 启动后,会通过 Eureka Client 请求其他 Eureka Server 节点中的一个节点,获取注册的服务信息,然后复制到其他 peer 节点。

Eureka Server 每当自己的信息变更后,例如 Client 向自己发起注册、续约、注销请求, 就会把自己的最新信息通知给其他 Eureka Server,保持数据同步。

如果自己的信息变更是另一个Eureka Server同步过来的,这是再同步回去的话就出现数据同步死循环了。

Eureka Server 在执行复制操作的时候,使用?HEADER_REPLICATION?这个 http header 来区分普通应用实例的正常请求,说明这是一个复制请求,这样其他 peer 节点收到请求时,就不会再对其进行复制操作,从而避免死循环。

还有一个问题,就是数据冲突,比如 server A 向 server B 发起同步请求,如果 A 的数据比 B 的还旧,B 不可能接受 A 的数据,那么 B 是如何知道 A 的数据是旧的呢?这时 A 又应该怎么办呢?

数据的新旧一般是通过版本号来定义的,Eureka 是通过?lastDirtyTimestamp?这个类似版本号的属性来实现的。

lastDirtyTimestamp?是注册中心里面服务实例的一个属性,表示此服务实例最近一次变更时间。

比如 Eureka Server A 向 Eureka Server B 复制数据,数据冲突有2种情况:

(1)A 的数据比 B 的新,B 返回 404,A 重新把这个应用实例注册到 B。

(2)A 的数据比 B 的旧,B 返回 409,要求 A 同步 B 的数据。

还有一个重要的机制:hearbeat 心跳,即续约操作,来进行数据的最终修复,因为节点间的复制可能会出错,通过心跳就可以发现错误,进行弥补。

例如发现某个应用实例数据与某个server不一致,则server放回404,实例重新注册即可。

3. 小结

  • Eureka 是弱数据一致性,选择了 CAP 中的 AP。
  • Eureka 采用 Peer to Peer 模式进行数据复制。
  • Eureka 通过 lastDirtyTimestamp 来解决复制冲突。
  • Eureka 通过心跳机制实现数据修复。

原文地址:https://blog.51cto.com/14570694/2457308

时间: 2024-11-09 11:54:48

SpringCloud 注册中心 Eureka 集群是怎么保持数据一致的?的相关文章

springcloud费话之Eureka集群

  目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud费话之Eureka接口调用(feign) springcloud费话之断路器(hystrix in feign) 一.容灾server集群 复制上例中的server项目两个,分别命名为x-server2和x-server3,修改yml配置 ①端口:三个服务器的端口分别为9010,9011,901

Spring-Cloud学习之Eureka集群搭建

一.为什么需要集群 上一篇文章讲解了如何搭建单个节点的eureka,这篇讲解如何搭建eureka集群,这里的集群还是本地不同的端口执行三个eureka,因为条件不要允许,没有三台电脑,所以大家将就一下吧,eureka集群的目的就是防止一个点故障导致,整个服务瘫痪的问题,成为单点故障,因为一个点出问题,还有另一个点顶上去,代替这个点工作,所以集群也实现了高可用.高性能 二.集群的原理 每一个注册点都配置有其它点的url,能够与其他server点进行数据的同步,当服务向一个点注册时,该店就会把该服务

SpringCloud注册中心集群化及如何抗住大型系统的高并发访问

一.场景引入 本人所在的项目由于直接面向消费者,迭代周期迅速,所以服务端框架一直采用Springboot+dubbo的组合模式,每个服务由service模块+web模块构成,service模块通过公司API网关向安卓端暴 露restful接口,web模块通过dubbo服务向service模块获取数据渲染页面.测试环境dubbo的注册中心采用的单实例的zookeeper,随着时间的发现注册在zookeeper上的生产者和消费者越来越多,测试 人员经常在大规模的压测后发现zookeeper挂掉的现象

SpringCloud之Eureka集群

前面我们介绍了SpringCloud注册中心Eureka,但是存在一个单点故障的问题,一个注册中心远远不能满足实际的生产环境,现在我们介绍一下如何搭建一个Eureka集群. 一:集群环境搭建 我们先建两个注册中心工程,一个叫eureka_register_master,一个叫eureka_register_salve.master的端口是7998,salve的端口是7999. eureka_register_master的配置文件application.properties如下: server.

springcloud(二):注册中心Eureka

http://www.ityouknow.com/spring-cloud.html Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组件之一. 背景介绍 服务中心 服务中心又称注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等,比如dubbo admin后台的各种功能. 有了服务中心调用关系会有什么变化,画几个简图来帮忙理解 项目

SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式. 例如: 配置管理(configuration management),服务发现(servicediscovery),断路器(circuit breakers),智能路由( intelligen

spring cloud(二)服务(注册)中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组件之一. 背景介绍 服务中心 服务中心又称注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等,比如dubbo admin后台的各种功能. 有了服务中心调用关系会有什么变化,画几个简图来帮忙理解 项目A调用项目B 正常调用项目A请求项目B 有了服务中心之后,任何一个服务都不能直接去掉用

SpringCloud----服务注册中心Eureka

一 Eureka服务治理体系1.1 服务治理   服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装.主要负责完成微服务架构中的服务治理功能. Eureka服务治理体系如下: 1.2 服务注册  在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号.服

微服务架构:Eureka集群搭建

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 服务注册.发现是微服务架构的关键原理之一,由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就必然引入一个服务注册发现的问题,也就是说服务提供方要注册报告服务地址,服务调用方要能发现目标服务.在我们的微服务架构中我们采用了Eureka来完成微服务的注册与发现.微服务通过Eureka进行注册,服务调用方通过Eureka找到目标服务.由于服务提供方以集群方式提供服务,Eureka也采用集群的方式来