1. 程式人生 > >Eureka vs Zookeeper

Eureka vs Zookeeper

進行 網絡 重新 直接 分布式 要求 列表 自我 當前

著名的CAP理論指出,一個分布式系統不可能同時滿足C(一致性)、A(可用性)和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還有客戶端緩存功能(註:Eureka分為客戶端程序與服務器端程序兩個部分,客戶端程序負責向外提供註冊與發現服務接口)。所以即便Eureka集群中所有節點都失效,或者發生網絡分割故障導致客戶端不能訪問任何一臺Eureka服務器;Eureka服務的消費者仍然可以通過Eureka客戶端緩存來獲取現有的服務註冊信息。甚至最極端的環境下,所有正常的Eureka節點都不對請求產生相應,也沒有更好的服務器解決方案來解決這種問題
時;得益於Eureka的客戶端緩存技術,消費者服務仍然可以通過Eureka客戶端查詢與獲取註冊服務信息,這點很重要。

因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。

Eureka vs Zookeeper