当前位置:   article > 正文

Eureka server 数据同步原理能说下吗?eureka自我保护机制是什么?_eureka集群同步

eureka集群同步

数据同步原理

Eureka 是一个服务注册中心,在 Eureka 的设计里面,为了保证 Eureka 的高可用性, 提供了集群的部署方式。Eureka 的集群部署采用的是两两相互注册的方式来实现,也就是说每个 Eureka Server 节点都需要发现集群中的其他节点并建立连接,然后通过心跳的方式来维持这个连接的状态。(如图),Eureka Server 集群节点之间的数据同步方式非常简单粗暴,使用的是对等复制的方式来实现数据同步。也就是说,在 Eureka Server 集群中,不存在所谓主从节点,任何一个节点都可以接收或者写入数据。一旦集群中的任意一个节点接收到了数据的变更,就直接同步到其他节点上。
这种无中心化节点的数据同步,需要考虑到一个数据同步死循环的问题,也就是需要区分 Eureka Server 收到的数据是属于客户端传递来的数据还是集群中其他节点发过来的同步数据。Eureka 使用了一个时间戳的标记来实现类似于数据的版本号来解决这个问题。
另外,从 Eureka 的数据同步方案来看,Eureka 集群采用的是 AP 模型,也就是只提供高可用保障,而不提供数据强一致性保障。之所以采用 AP,我认为注册中心它只是维护服务之间的通信地址,数据是否一致对于服务之间的通信影响并不大。 而注册中心对 Eureka 的高可用性要求会比较高,不能出现因为 Eureka 的故障导致服 务之间无法通信的问题。

续期

服务续期和服务注册非常相似,服务注册在Eureka Client程序启动之后开启,并同时开启服务续期的定时任务

在eureka-client-1.6.2.jar的DiscoveryClient类下有renew()方法,其代码如下:

  1. /**
  2. * Renew with the eureka service by making the appropriate REST call
  3. */
  4. boolean renew() {
  5. EurekaHttpResponse<InstanceInfo> httpResponse;
  6. try {
  7. httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(),
  8. instanceInfo.getId(), instanceInfo, null);
  9. logger.debug("{} - Heartbeat status: {}",
  10. PREFIX + appPathIdentifier,
  11. httpResponse.getStatusCode());
  12. if (httpResponse.getStatusCode() == 404) {
  13. REREGISTER_COUNTER.increment();
  14. logger.info("{} - Re-registering apps/{}",
  15. PREFIX + appPathIdentifier,
  16. instanceInfo.getAppName());
  17. return register();
  18. }
  19. return httpResponse.getStatusCode() == 200;
  20. } catch (Throwable e) {
  21. logger.error("{} - was unable to send heartbeat!", PREFIX + appPathIdentifier, e);
  22. return false;
  23. }
  24. }

另外,EurekaServer的续约接口在eureka-core:1.6.2.jar的com.netflix.eureka包下的InstanceResource类下,接口方法为renewLease(),它是一个RESTfulAPI接口。为了减少本章的篇幅,省略了大部分代码的展示。其中有一个registry.renew()方法,即服务续约,代码如下:

  1. @PUT
  2. public Response renewLease(...参数省略){
  3. // 代码省略
  4. boolean isSuccess=registry.renew(app.getName(),id, isFromReplicaNode);
  5. // 代码省略
  6. }

可以跟踪 registry.renew 的代码继续深入研究,和追踪服务注册的源码类似,在此不再赘述。服务续约有两个参数是可以配置的(官方建议不要修改):

  1. Eureka Client 发送续约心跳的间隔。(默认为30秒)
  2. Eureka Server 在多长时间内没有收到心跳将实例剔除的时间参数。(默认为90秒)

配置方法:分别在 Eureka Client 和 Eureka Server 的配置文件 application.yml 中加以下的配置: 

  1. eureka.instance.leaseRenewalIntervalInSeconds
  2. eureka.instance.leaseExpirationDurationInSeconds

自我保护机制

Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
​​​​​​​

当有一个新的 Eureka Server 出现时,它尝试从相邻 Peer 节点获取所有服务实例注册表信息。如果从相邻的 Peer 节点获取信息时出现了故障, Eureka Server 会尝试其他的 Peer 节点。如果 Eureka Server 能够成功获取所有的服务实例信息,则根据配置信息设置服务续约的阈值。

在任何时间,如果 Eureka Server 接收到的服务续约低于为该值配置的百分比(默认为 15 分钟内低于 85%),则Eureka Server开启自我保护模式,即不再剔除注册列表的信息。

这样做的好处在于,如果是 Eureka Server 自身的网络问题而导致 Eureka Client 无法续约,Eureka Client 的注册列表信息不再被删除,也就是 Eureka Client 还可以被其他服务消费。

默认情况下, Eureka Server 的自我保护模式是开启的,如果需要关闭,则在配置文件添加以下代码:

  1. eureka:
  2. server:
  3. enable-self-preservation: false

为什么 Eureka Client 获取服务实例很慢

1. Eureka Client 的注册延迟

Eureka Client 启动之后,不是立即向 Eureka Server 注册的,而是有一个延迟向服务端注册的时间。通过跟踪源码,可以发现默认的延迟时间为 40 秒,源码在 eureka-client-1.6.2.jar 的DefaultEurekaClientConfig 类中,代码如下:

  1. public int getInitialInstanceInfoReplicationIntervalSeconds() {
  2. return configInstance.getIntProperty(
  3. namespace + INITIAL_REGISTRATION_REPLICATION_DELAY_KEY, 40
  4. ).get();
  5. }

2. Eureka Server 的响应缓存

Eureka Server 每 30 秒更新一次响应缓存,可通过更改配置 eureka.server.responseCacheUpdateIntervalMs 来修改。所以即使是刚刚注册的实例,也不会立即出现在服务注册列表中。

3. Eureka Client 的缓存

Eureka Client 保留注册表信息的缓存。 该缓存每 30 秒更新一次(如前所述)。 因此, Eureka Client刷新本地缓存并发现其他新注册的实例可能需要 30 秒。

4. LoadBalancer 的缓存

Ribbon 的负载平衡器从本地的 Eureka Client 获取服务注册列表信息。 Ribbon 本身还维护了缓存,以避免每个请求都需要从 Eureka Client 获取服务注册列表。此缓存每 30 秒刷新一次(可由 ribbon.ServerListRefreshInterval 配置),所以可能至少需要 30 秒的时间才能使用新注册的实例。

综上因素,一个新注册的实例,默认延迟 40 秒向服务注册中心注册,所以不能马上被Eureka Server 发现。另外,刚注册的 Eureka Client 也不能立即被其他服务调用,原因是调用方由于各种缓存没有及时获取到最新的服务注册列表信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/416306?site
推荐阅读
相关标签
  

闽ICP备14008679号