Eureka自我保護機制

Eureka自我保護機制

Eureka自我保護機制

我們將上期的註冊進eureka的服務8001,停了,過一會再訪問一下eureka,就會發現報一下錯誤:

Eureka自我保護機制

我們看到8001服務還在,沒有從註冊中心中剔除,但是報錯了:

翻譯過來就是:

緊急情況!eureka可能不正確地聲稱實例在不在的情況下出現。續訂小於閾值,因此不會為了安全而過期實例。

某時刻某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的信息進行保存

1、eureka自我保護

什麼是自我保護模式?

默認情況下,如果EurekaServer在一定時間內沒有接收到某個微服務實例的心跳,

EurekaServer將會註銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與

EurekaServer之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是

健康的,此時本不應該註銷這個微服務。Eureka通過“自我保護模式”來解決這個問題——

當EurekaServer節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節

點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務註冊表中的信息,不

再刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka

Server節點會自動退出自我保護模式。

在自我保護模式中,Eureka Server會保護服務註冊表中的信息,不再註銷任何服務實例。當

它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。

它的設計哲學就是寧可保留錯誤的服務註冊信息,也不盲目註銷任何可能健康的服務實例。一

句話講解:好死不如賴活著

綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有

微服務(健康的微服務和不健康的微服務都會保留),也不盲目註銷任何健康的微服務。使用

自我保護模式,可以讓Eureka集群更加的健壯、穩定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保

護模式。

2、作為服務註冊中心,Eureka比Zookeeper好在哪裡

著名的CAP理論指出,一個分佈式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯

性)。由於分區容錯性P在是分佈式系統中必須要保證的,因此我們只能在A和C之間進行權

衡。

因此

Zookeeper保證的是CP, 一致性和分區容錯性

Eureka則是AP。 可用性和分區容錯性

4.1 Zookeeper保證CP

當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊信息,但不

能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但

是zk會出現這樣一種情況,當master節點因為網絡故障與其他節點失去聯繫時,剩餘節點會

重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集

群都是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk

集群失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間

導致的註冊長期不可用是不能容忍的。

4.2 Eureka保證AP

Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾

個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的

客戶端在向某個Eureka註冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一臺

Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證

強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒

有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況:

1. Eureka不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務

2. Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)

3. 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中

因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像

zookeeper那樣使整個註冊服務癱瘓。


分享到:


相關文章: