分佈式架構之CAP理論/AP架構/CP架構

上一篇梳理一下 CAP定理:https://blog.csdn.net/Soinice/article/details/96782876

著名的CAP理論指出,一個分佈式系統不可能同時滿足C(一致性)、A(可用性)、和P(分區容錯性)。由於分區容錯性P在分佈式系統中必須要保證的,因此我們只能在A和C之間進行權衡。

因此: 
Zookeeper保證的是CP, 
Eureka則是AP。

但是對CAP/AP/CP很不理解,於是查閱資料,做一個簡單的瞭解。

Zoopkeeper保證CP

當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊信息,但是不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但是zk會出現這樣的一種情況,當master節點因網路故障與其他節點失去聯繫時,剩餘的節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30~120s,且選舉期間整個zk集羣是都是不可用的,這就導致在選舉期間註冊服務癱瘓,在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的註冊長期不可用是不能容忍的。

Eureka保證AP

Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊時如果發現連接失敗,則會自動切換至其他的節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況: 
1.Eureka不再從註冊列表中移除因爲長時間沒有收到心跳而應該過期的服務 
2.Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用) 
3.當前網絡穩定時,當前實例新的註冊信息會被同步到其它節點中 
因此,Eureka可以很好的應對因網絡故障導致節點失去聯繫的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。

Eureka服務治理機制與Dubbo服務治理機制的比較

Eureka支持健康檢查,自我保護等。

Zookeeper爲CP設計,Eureka爲AP設計。

作爲服務發現產品,可用性優先級較高,一致性的特點並不重要,寧可返回錯誤的數據,也比不反回結果要好得多。

服務列表變更Zookeeper服務端會有通知,Eureka則通過長輪詢來實現,Eureka未來會實現watch機制。

取與舍

CAP理論提出就是針對分佈式數據庫環境的,所以,P這個屬性是必須具備的。
P就是在分佈式環境中,由於網絡的問題可能導致某個節點和其它節點失去聯繫,這時候就形成了P(partition),也就是由於網絡問題,將系統的成員隔離成了2個區域,互相無法知道對方的狀態,這在分佈式環境下是非常常見的。
因爲P是必須的,那麼我們需要選擇的就是A和C。
大家知道,在分佈式環境下,爲了保證系統可用性,通常都採取了複製的方式,避免一個節點損壞,導致系統不可用。那麼就出現了每個節點上的數據出現了很多個副本的情況,而數據從一個節點複製到另外的節點時需要時間和要求網絡暢通的,所以,當P發生時,也就是無法向某個節點複製數據時,這時候你有兩個選擇:
選擇可用性 A(Availability),此時,那個失去聯繫的節點依然可以向系統提供服務,不過它的數據就不能保證是同步的了(失去了C屬性)。
選擇一致性C(Consistency),爲了保證數據庫的一致性,我們必須等待失去聯繫的節點恢復過來,在這個過程中,那個節點是不允許對外提供服務的,這時候系統處於不可用狀態(失去了A屬性)。

最常見的例子是讀寫分離,某個節點負責寫入數據,然後將數據同步到其它節點,其它節點提供讀取的服務,當兩個節點出現通信問題時,你就面臨着選擇A(繼續提供服務,但是數據不保證準確),C(用戶處於等待狀態,一直等到數據同步完成)。

文章參考:

https://blog.csdn.net/zhumengguang/article/details/80156792 
https://blog.csdn.net/u013058742/article/details/83541905 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章