Spring Cloud 探索 | Eureka 高可用部署及 unavailable-replicas 問題
Eureka Server除了單點執行之外,還可以通過執行多個例項,並進行互相註冊的方式來實現高可用的部署。所以我們只需要將Eureke Server配置其他可用的 serviceUrl 就能實現高可用部署。
下面我們在上篇文章的基礎上來實現Eureka Server的高可用部署。部署圖如下圖所示:
將 application.yml 檔案複製三分:application-9001.yml,application-9002.yml,application-9003.yml,分別新增配置項如下:
application-9001.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9001
eureka:
instance:
hostname: eureka-9001.com
instance-id: eureka-9001
client:
service-url:
defaultZone: http://lpf:[email protected]-9002.com:9002/eureka,http://lpf:[email protected] -9003.com:9003/eureka
logging.level.root: info
application-9002.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9002
eureka:
instance:
hostname: eureka-9002.com
instance-id: eureka-9002
client:
service-url:
defaultZone : http://lpf:[email protected]-9001.com:9001/eureka,http://lpf:[email protected]-9003.com:9003/eureka
logging.level.root: info
application-9003.yml
spring:
application:
name: eureka-server
security:
user:
name: lpf
password: root
server.port: 9003
eureka:
instance:
hostname: eureka-9003.com
instance-id: eureka-9003
client:
service-url:
defaultZone: http://lpf:[email protected]-9001.com:9001/eureka,http://lpf:[email protected]-9002.com:9002/eureka
logging.level.root: info
最後,在 hosts 檔案中新增如下內容:
127.0.0.1 eureka-9001.com
127.0.0.1 eureka-9002.com
127.0.0.1 eureka-9003.com
注意:要把 application.yml 檔案中的內容註釋掉,否則會影響 Eureka 的叢集部署。因為Spring Boot優先載入 application.yml 中的內容。
最後的最後,通過 spring.profiles.active 屬性來分別啟動三臺伺服器:
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9001
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9002
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9003
此時訪問 9001 的註冊中心:http://eureka-9001.com:9001/ ,如下圖所示,我們可以看到 registered-replicas 中已經有 9002 和 9003 節點的 eureka-server 了。同樣地,訪問 9002 的註冊中心:http://eureka-9002.com:9002/ ,能看到 registered-replicas 中已經有 9001 和 9003 節點,並且這些節點在可用分片(available-replicase)之中。我們也可以嘗試關閉 9001,重新整理http://eureka-9002.com:9002/ ,可以看到 9001 的節點變為了不可用分片(unavailable-replicas)。
相信很多小夥伴在實驗的時候都會出現這樣一個問題:節點出現在 unavailable-replicas 下。下面我們來說一下可能的幾種原因:
原因一:prefer-ip-address 配置項設定錯誤
比如,9001 伺服器設定了prefer-ip-address: true,那麼它註冊到 9002 和 9003 伺服器時應該使用 defaultZone:http://yourIP:9001/eureka/ ,但此時可以發現使用的仍然是 hostname 名,導致錯誤發生。
另一種原因是,三個9001、9002 和 9003 都設定了prefer-ip-address: true,導致最後解析出來的 hostname 都是相同的IP,使副本不可用。
原因二:register-with-eureka 配置項設定錯誤
看網上很多部落格和資料都把此項設定成了 false,此時 eureka 不會註冊到其他伺服器上,所以出現錯誤。
原因三:其他原因
還有一些其他原因大家可以參考這裡:Eureka高可用,節點均出現在unavailable-replicas下
大家有沒有一個疑問:服務例項的註冊資訊會在各個 eureka server 之間同步,那麼,如果幾個伺服器的某個配置引數不一致會出現什麼情況,比如:eureka.server.eviction-interval-timer-in-ms: 7000。
經過測試,每個伺服器會按照自己配置的時間間隔清理登錄檔。