1. 程式人生 > >服務註冊與發現-Eureka (高可用設計)

服務註冊與發現-Eureka (高可用設計)

功能 num -a 特點 解決方案 一個 subst 同步 進程

什麽是高可用

部署需要考慮的是什麽:

1、系統遇到單點失效問題,如何能夠快速切換到其他節點完成任務

2、如何應對網絡故障,即系統如何設計成“故障開放型”(expecting failure)的

典型的問題包括:

1、意外故障(box failure)

2、高延遲

3、網絡分割問題(註:由於交換機故障導致交換機底下的子網間不能互訪)

高可用的表現

1、對於Service發現服務而言,寧可返回某服務5分鐘之前在哪幾個服務器上可用的信息,也不能因為暫時的網絡故障而找不到可用的服務器

2、如果出現類似網絡分割的問題,網絡中的各個節點也能被訪問到,沒有丟失,確保健康的服務任然有效

說一說CAP定理

C- 數據一致性;

A-服務可用性;

P-服務對網絡分區故障的容錯性

EUREKA的解決方案

Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、作為輪詢負載均衡器,並提供服務的故障切換支持。Eureka一開始就被設計成高可用可伸縮的Service發現服務,這兩個特點也是Netflix公司開發所有平臺的兩個特色。Eureka就是為發現服務所設計的,它有獨立的客戶端程序庫,同時提供心 跳服務、服務健康監測、自動發布服務與自動刷新緩存的功能。

具體表現如下:

1、在Eureka平臺中,如果某臺服務器宕機,客戶端請求會自動切換到新的Eureka節點;當宕機的服務器重新恢復後,Eureka會再次將其納入到服務器集群管理之中;而對於它來說,所有要做的無非是同步一些新的服務註冊信息而已

2、Eureka內置了心跳服務,用於淘汰一些“瀕死”的服務器,但是當網絡分割故障發生時, 這也是非常危險的,會殺死原本健康的服務,幸運的是,Netflix考慮到了這個缺陷。如果Eureka服務節點在短時間裏丟失了大量的心跳連接(註:可能發生了網絡故障),那麽這個 Eureka節點會進入”自我保護模式“,同時保留那些“心跳死亡“的服務註冊信息不過期。此時,這個Eureka節點對於新的服務還能提供註冊服務,對 於”死亡“的仍然保留,以防還有客戶端向其發起請求。當網絡故障恢復後,這個Eureka節點會退出”自我保護模式“。所以Eureka的哲學是,同時保 留”好數據“與”壞數據“總比丟掉任何”好數據“要更好,所以這種模式在實踐中非常有效。

3、Eureka還有客戶端緩存功能(註:Eureka分為客戶端程序與服務器端程序兩個部分,客戶端程序負責向外提供註冊與發現服務接口)。 所以即便Eureka集群中所有節點都失效,或者發生網絡分割故障導致客戶端不能訪問任何一臺Eureka服務器,Eureka服務的消費者仍然可以通過 Eureka客戶端緩存來獲取現有的服務註冊信息。

補充:Eureka的自我保護機制

在默認配置中,Eureka Server在默認90s沒有得到客戶端的心跳,則註銷該實例,但是往往因為微服務跨進程調用,網絡通信往往會面臨著各種問題,比如微服務狀態正常,但是因為網絡分區故障時,Eureka Server註銷服務實例則會讓大部分微服務不可用,這很危險,因為服務明明沒有問題。

為了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下參數,可啟動保護機制

eureka.server.enable-self-preservation=true

它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能發送了網絡故障),那麽這個節點將進入自我保護模式,不再註銷任何微服務,當網絡故障回復後,該節點會自動退出自我保護模式。

服務註冊與發現-Eureka (高可用設計)