Eureka Server unavailable-replicas 問題排查分享

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

最近公司項目準備遷移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://m.163en.com(可以是主機名、域名等非IP地址):8761/eureka/,http://amd5.cn:8761/eureka/。

此時還需要配置eureka.instance.hostname=${spring.application.name},如果你要自定義hostname,這里自己手動定義,比如eureka.instance.hostname=m.163en.com。

可以參考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

      初來乍到,多多關照!