Eureka Server unavailable-replicas 问题排查分享

2020年7月31日15:14:39 1 5,819 ℃

最近公司项目准备迁移kubernetes,于是在测试的过程中遇到了Eureka Server常见的unavailable-replicas问题,对于Eureka 高可用部署出现副本不可用,也比较简单,其实就几个参数配置问题。以下两个参数必须设置为true(默认为true)(单节点部署的时候,设置成false):

eureka.client.registerWithEureka=true (eureka 实例之间互相发现)

eureka.client.fetchRegistry=true (eureka 实例之间信息同步)

主要分两种情况:

第一种情况,eureka.instance.preferIpAddress=true,这个时候应该配置eureka.client.serviceUrl.defaultZone=http://ip:8761/eureka/,http://ip:8761/eureka/,因为此时主机的hostname为IP地址,此时就会将hostname的值和serviceUrl里面的IP做比较,如果此时配置的是服务器的主机名称,就会导致两者不相等出现unavailable-replicas。

第二种情况,eureka.instance.preferIpAddress=false,这个时候应该配置eureka.client.serviceUrl.defaultZone=http://www.amd5.cn(可以是主机名、域名等非IP地址):8761/eureka/,http://amd5.cn:8761/eureka/。

此时还需要配置eureka.instance.hostname=${spring.application.name},如果你要自定义hostname,这里自己手动定义,比如eureka.instance.hostname=www.amd5.cn。

可以参考spring官网的文档https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html 

eureka unavailable-replicas的详细分析可以参考https://www.cnblogs.com/lonelyJay/p/9940199.html 分析得比较详细。

随便参数就这么几个,但是发现实际使用中出现问题还是比较麻烦的。阿汤博客这里简单分享下自己使用过程中遇到的问题,希望对你有帮助。

因为kubernetes pod的ip是随时变换的,所以在在配置eureka.client.serviceUrl.defaultZone的时候,只能采用k8s内部域名,所以按照正常的配置一步一步部署,当部署好Eureka Server的时候,发现副本不可用,首先是怀疑自己参数配置有错误,于是仔细检查核对发现配置没问题,那为什么会出现unavailable-replicas这种情况呢,网上大部分资料都是说着几个参数的配置问题,基本没有其他情况会导致unavailable-replicas。

然后开怀疑是kubernetes部署或kubernetes内部网络问题导致,然后一一排查,不采用变量换成手动配置hostname,还是无果,最后尝试把eureka.instance.preferIpAddress改成true,手动填写docker容器的IP测试,此时副本状态为available-replicas。

现在慢慢有了点方向,初步判断eureka.instance.preferIpAddress配置没有生效,或有其他原因导致eureka自己获取的hostname并不是我配置hostname,导致了unavailable-replicas。于是我在两台物理机上部署了两个Eureka Server,然后采用eureka.instance.preferIpAddress=false的方式,发现也是unavailable-replicas。

然而可以排除kubernetes部署和配置的问题,问题应该出在eureka服务本身,于是本地debug测试,把配置清空以后,debug发现eureka.instance.preferIpAddress的值被强制设置了为了true,而官方默认配置为false。问题慢慢有了眉目,开始把eureka服务所有依赖去掉,只保留原生的打包部署测试,发现完全正常,如下图:

Eureka Server unavailable-replicas 问题排查分享

然后开始一个依赖,一个依赖添加,打包部署测试,终于在引入discovery-plugin-starter-eureka依赖打包部署以后,出现了unavailable-replicas,因为这个依赖包是开源项目的,于是去问了此开源项目的负责人,他回复是把eureka.instance.preferIpAddress强制设置了为true。

到此困扰了两天的问题,终于找到了原因,找到原因以后处理就比较简单了,要么不引用,要么改源码为false。

有时候遇到一些互联网找不到答案的问题,排查的思路比较重要,其次就是一定要动手一步步测试(这个过程很繁琐、纯体力活),只是靠冥想和推理,永远也得不到结果。

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

    • avatar 库里 6

      初来乍到,多多关照!