Eureka Server unavailable-replicas 問題排查分享

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

最近公司項(xiàng)目準(zhǔn)備遷移kubernetes,于是在測試的過程中遇到了Eureka Server常見的unavailable-replicas問題,對于Eureka 高可用部署出現(xiàn)副本不可用,也比較簡單,其實(shí)就幾個(gè)參數(shù)配置問題。以下兩個(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í)就會將hostname的值和serviceUrl里面的IP做比較,如果此時(shí)配置的是服務(wù)器的主機(jī)名稱,就會導(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,這里自己手動定義,比如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)問題還是比較麻煩的。阿湯博客這里簡單分享下自己使用過程中遇到的問題,希望對你有幫助。

因?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ì)檢查核對發(fā)現(xiàn)配置沒問題,那為什么會出現(xiàn)unavailable-replicas這種情況呢,網(wǎng)上大部分資料都是說著幾個(gè)參數(shù)的配置問題,基本沒有其他情況會導(dǎo)致unavailable-replicas。

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

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

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

Eureka Server unavailable-replicas 問題排查分享

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

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

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

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

發(fā)表評論

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

目前評論:1   其中:訪客  0   博主  0

    • avatar 庫里 6

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