Eureka Server unavailable-replicas 問(wèn)題排查分享

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

最近公司項(xiàng)目準(zhǔn)備遷移kubernetes,于是在測(cè)試的過(guò)程中遇到了Eureka Server常見(jiàn)的unavailable-replicas問(wèn)題,對(duì)于Eureka 高可用部署出現(xiàn)副本不可用,也比較簡(jiǎn)單,其實(shí)就幾個(gè)參數(shù)配置問(wèn)題。以下兩個(gè)參數(shù)必須設(shè)置為true(默認(rèn)為true)(單節(jié)點(diǎn)部署的時(shí)候,設(shè)置成false):

eureka.client.registerWithEureka=true (eureka 實(shí)例之間互相發(fā)現(xiàn))

eureka.client.fetchRegistry=true (eureka 實(shí)例之間信息同步)

主要分兩種情況:

第一種情況,eureka.instance.preferIpAddress=true,這個(gè)時(shí)候應(yīng)該配置eureka.client.serviceUrl.defaultZone=http://ip:8761/eureka/,http://ip:8761/eureka/,因?yàn)榇藭r(shí)主機(jī)的hostname為IP地址,此時(shí)就會(huì)將hostname的值和serviceUrl里面的IP做比較,如果此時(shí)配置的是服務(wù)器的主機(jī)名稱(chēng),就會(huì)導(dǎo)致兩者不相等出現(xiàn)unavailable-replicas。

第二種情況,eureka.instance.preferIpAddress=false,這個(gè)時(shí)候應(yīng)該配置eureka.client.serviceUrl.defaultZone=http://www.zhongjima.net(可以是主機(jī)名、域名等非IP地址):8761/eureka/,http://amd5.cn:8761/eureka/。

此時(shí)還需要配置eureka.instance.hostname=${spring.application.name},如果你要自定義hostname,這里自己手動(dòng)定義,比如eureka.instance.hostname=www.zhongjima.net。

可以參考spring官網(wǎng)的文檔https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html 

eureka unavailable-replicas的詳細(xì)分析可以參考https://www.cnblogs.com/lonelyJay/p/9940199.html 分析得比較詳細(xì)。

隨便參數(shù)就這么幾個(gè),但是發(fā)現(xiàn)實(shí)際使用中出現(xiàn)問(wèn)題還是比較麻煩的。阿湯博客這里簡(jiǎn)單分享下自己使用過(guò)程中遇到的問(wèn)題,希望對(duì)你有幫助。

因?yàn)閗ubernetes pod的ip是隨時(shí)變換的,所以在在配置eureka.client.serviceUrl.defaultZone的時(shí)候,只能采用k8s內(nèi)部域名,所以按照正常的配置一步一步部署,當(dāng)部署好Eureka Server的時(shí)候,發(fā)現(xiàn)副本不可用,首先是懷疑自己參數(shù)配置有錯(cuò)誤,于是仔細(xì)檢查核對(duì)發(fā)現(xiàn)配置沒(méi)問(wèn)題,那為什么會(huì)出現(xiàn)unavailable-replicas這種情況呢,網(wǎng)上大部分資料都是說(shuō)著幾個(gè)參數(shù)的配置問(wèn)題,基本沒(méi)有其他情況會(huì)導(dǎo)致unavailable-replicas。

然后開(kāi)懷疑是kubernetes部署或kubernetes內(nèi)部網(wǎng)絡(luò)問(wèn)題導(dǎo)致,然后一一排查,不采用變量換成手動(dòng)配置hostname,還是無(wú)果,最后嘗試把eureka.instance.preferIpAddress改成true,手動(dòng)填寫(xiě)docker容器的IP測(cè)試,此時(shí)副本狀態(tài)為available-replicas。

現(xiàn)在慢慢有了點(diǎn)方向,初步判斷eureka.instance.preferIpAddress配置沒(méi)有生效,或有其他原因?qū)е耬ureka自己獲取的hostname并不是我配置hostname,導(dǎo)致了unavailable-replicas。于是我在兩臺(tái)物理機(jī)上部署了兩個(gè)Eureka Server,然后采用eureka.instance.preferIpAddress=false的方式,發(fā)現(xiàn)也是unavailable-replicas。

然而可以排除kubernetes部署和配置的問(wèn)題,問(wèn)題應(yīng)該出在eureka服務(wù)本身,于是本地debug測(cè)試,把配置清空以后,debug發(fā)現(xiàn)eureka.instance.preferIpAddress的值被強(qiáng)制設(shè)置了為了true,而官方默認(rèn)配置為false。問(wèn)題慢慢有了眉目,開(kāi)始把eureka服務(wù)所有依賴(lài)去掉,只保留原生的打包部署測(cè)試,發(fā)現(xiàn)完全正常,如下圖:

Eureka Server unavailable-replicas 問(wèn)題排查分享

然后開(kāi)始一個(gè)依賴(lài),一個(gè)依賴(lài)添加,打包部署測(cè)試,終于在引入discovery-plugin-starter-eureka依賴(lài)打包部署以后,出現(xiàn)了unavailable-replicas,因?yàn)檫@個(gè)依賴(lài)包是開(kāi)源項(xiàng)目的,于是去問(wèn)了此開(kāi)源項(xiàng)目的負(fù)責(zé)人,他回復(fù)是把eureka.instance.preferIpAddress強(qiáng)制設(shè)置了為true。

到此困擾了兩天的問(wèn)題,終于找到了原因,找到原因以后處理就比較簡(jiǎn)單了,要么不引用,要么改源碼為false。

有時(shí)候遇到一些互聯(lián)網(wǎng)找不到答案的問(wèn)題,排查的思路比較重要,其次就是一定要?jiǎng)邮忠徊讲綔y(cè)試(這個(gè)過(guò)程很繁瑣、純體力活),只是靠冥想和推理,永遠(yuǎn)也得不到結(jié)果。

【騰訊云】云服務(wù)器、云數(shù)據(jù)庫(kù)、COS、CDN、短信等云產(chǎn)品特惠熱賣(mài)中

發(fā)表評(píng)論取消回復(fù)

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

目前評(píng)論:1   其中:訪(fǎng)客  0   博主  0

    • avatar 庫(kù)里 6

      初來(lái)乍到,多多關(guān)照!