《重新定义Spring Cloud实战》——3.6.3 Eureka高可用原理
3.6.3 Eureka高可用原理
由于Eureka是基于部署在Amazon的背景下设计的,因此其原生支持了Amazon的Region及AvailabilityZone。
这里分为如下几点来阐述一下:
1)Region,默认情况下资源在Region之间是不会复制的。不过Eureka Client提供了fetch-remote-regions-registry配置,这个配置在dataCenterInfo是Amazon时才生效,其作用是拉取远程Region的注册信息到本地。
2)AvailabilityZone,默认Eureka Client的eureka.client.prefer-same-zone-eureka配置为true,也就是在拉取serviceUrl的时候,优先选取与应用实例处于同一个zone的Eureka Server列表。
eureka:
client:
register-with-eureka: true
fetch-registry: true
region: region-east
service-url:
zone1: http://localhost:8761/eureka/
zone2: http:// localhost:8762/eureka/
availability-zones:
region-east: zone1,zone2
instance:
metadataMap.zone: zone1
比如上述配置,client端配置了一个region,该region下面有两个zone,分别是zone1和zone2,而该应用实例的metadataMap信息中zone为zone1,即该应用实例会选取service-url.zone这个server列表来进行注册及查询等操作。
如果eureka.client.prefer-same-zone-eureka配置为false,则默认返回的ZoneOffset为0,即取availZones的第一个zone。
1. Client端高可用
从上面的故障演练,我们可以看到Client端的高可用可以分为如下几点。
1)在Client启动之前,如果没有Eureka Server,则可以通过配置eureka.client.backup-registry-impl从备份registry读取关键服务的信息。
2)在client启动之后,若运行时出现Eureka Server全部挂掉的情况:本地内存有localRegion之前获取的数据,在Eureka Server都不可用的情况下,从Server端定时拉取注册信息回来更新的线程CacheRefreshThread会执行失败,本地localRegion信息不会被更新。
3)在client启动之后,若运行时出现Eureka Server出现部分挂掉的情况:这种情况,如果预计恢复时间比较长,可以人工介入,可以通过配置文件剔除挂掉的Eureka Server地址,Client端会定时刷新serviceUrl,不过一般Client太多,这类操作不太方便,所以一般也不需要这样做,因为Client端维护了一个Eureka Server的不可用列表,一旦请求发生Connection error或者5xx的情况则会被列入该列表,当该列表的大小超过指定阈值则会重新清空。在重新清空的情况下,Client默认是采用RetryableEurekaHttpClient进行请求,numberOfRetries为3,因此也能够在一定程度保障Client的高可用。
2. Server端高可用
由于Eureka Server采用的是peer to peer的架构模式,因而也就无所谓Server端的高可用,主要的高可用都在Client端进行处理了。不过Server端也支持了跨region基本的高可用,可以通过配置remoteRegionUrlsWithName来支持拉取远程region的实例信息,如果当期region要访问的服务实例都挂了,那么Server端就会fallback到远程region的该服务实例。具体在这段代码中:eureka-core-1.9.2-sources.jar!/com/netflix/eureka/registry/AbstractInstanceRegistry.java,disableTransparentFallback默认为false,有兴趣的读者可以深入了解下。
public Applications getApplications() {
boolean disableTransparentFallback = serverConfig.disableTransparentFallbackToOtherRegion();
if (disableTransparentFallback) {
return getApplicationsFromLocalRegionOnly();
} else {
return getApplicationsFromAllRemoteRegions(); // Behavior of falling back to remote region can be disabled.
}
}
另外一点就是Eureka Server有SELF PRESERVATION机制,在现实环境中,网络抖动、闪断等因素可能会造成Client端未能及时向Server端续约,按照租约的相关约定,Server端就需要剔除该实例信息,如果大面积出现这类情况,那么可能是误判,因此SELF PRESERVATION机制引入一个阈值,如果最近一分钟接收到的续约的次数小于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。
- 点赞
- 收藏
- 关注作者
评论(0)