奈學乾貨分享:分散式CAP實踐分析
CAP的前世今生
1.1 起源
CAP理論,被戲稱為“帽子理論”,CAP是Eric Brewer在2000年ACM研討會上出了一個想法:“一致性、可用性和分割槽容錯性三者無法在分散式系統中被同時滿足,並且最多隻能滿足其中兩個!”
2002年,Seth Gilbert和Nancy Lynch採用反正法證明了猜想:“如果三者可同時滿足,則因為允許P的存在,一定存在Server之間的丟包,如此則不能保證C。” 在該證明中,對CAP的定義進行了更明確的宣告。
C:一致性被稱為原子物件,任何的讀寫都應該看起來是“原子”,或序列的。寫後面的讀一定能讀到前面寫的內容,所有的讀寫請求都好像被全域性排序。
A:對任何非失敗節點都應該在有限時間內給出請求的回應。(請求的可終止性)
P:允許節點之間丟失任意多的訊息,當網路分割槽發生時,節點之間的訊息可能會完全丟失。
但是隻證明了CAP三者不可能同時滿足,並沒有證明任意二者都可滿足的問題;所以該證明被認為是一個收窄的結果,在之後10年裡受到各種質疑。
1.2 重新詮釋
2012年,Brewer和Lynch針對所有的質疑進行了回應,重新詮釋CAP。“3箇中的2個”表述是不準確的,在某些分割槽極少發生的情況下,三者也能順暢地配合。CAP不僅僅是發生在整個系統中,可能是發生在某個子系統或系統的某個階段。把CAP理論的證明侷限在原子讀寫的場景,並申明不支援資料庫事務之類的場景。一致性場景不會引入使用者agent,只是發生在後臺叢集之內。把分割槽容錯歸結為一個對網路環境的陳述,而非之前一個獨立條件。引入了活(liveness)和安全屬性(safety),在一個更抽象的概念下研究分散式系統,並認為CAP是活性與安全屬性之間權衡的一個特例。其中的一致性屬於liveness,可用性屬safety。
網路存在同步、部分同步;一致性性的結果也從僅存在一個到存在N個(部分一致);引入了通訊週期round,保證N個一致性結果。
總結:縮小CAP適用的定義,消除質疑的場景;展示了CAP在非單一一致性結果下的廣闊的研究結果。
CAP的分析
2.1 組成
Consistency:一致性
Availability:可用性
Partition tolerance:分割槽容忍性
2.2 Consistency
從論文上看:操作之後的讀操作,必須返回該值。
從百科上看:在分散式系統中的所有資料備份,在同一時刻是否同樣的值。
總結:在分散式系統中,C代表任何人在任何地點、任何時間,訪問任何資料 結果都是一致的。
2.3 Availability
從論文上看:只要收到使用者的請求,伺服器就必須給出回應。
從百科上看:在叢集中一部分節點故障後,叢集整體是否還能響應客戶端的讀寫請求。
總結:在分散式系統中,A代表服務在任何時候都要是可用的、可訪問。
2.4 Partition tolerance
從論文上看:直譯叫“分割槽容錯”,意思是區間通訊可能失敗。
從百科上看:分割槽相當於對通訊的時限要求。
總結:分割槽容錯=分割槽+容錯。分散式系統因為多例項部署,面臨多個子網路,多個子網路存在網路通訊的需求;因為網路通訊的不可靠性造成分割槽的存在。而分割槽的存在,不可避免出現資料和可用性問題,需要有容錯機制來處理。
實踐分析
3.1 A與P的差異
從上述的描述中,因為兩者都有容錯可用的描述,我們很容易將A 跟 P 混淆在一起。接下去,我們們從各個維度去分析C 與P的差異。
1、從關注點來說,A關注的是使用者對分散式系統的可用要求;P關注的是分散式系統例項間的網路連通性。
2、從要求上來看,A從外部的視角,要求分散式系統在正常響應時間內一直可用;P從例項節點的視角出發,在遇到某節點或節點間通訊故障的時候,要求分散式系統整體對節點的容錯及恢復性。
3、從受眾上分析,A針對的是使用者,P針對的是服務例項。
3.2 CP與AP
三者的組合,產生了AC、AP、CP三個組合。但在分散式環境中,多例項部署是基本條件,因為網路的不可靠性,造成了P成了硬性條件。所以結果就轉化成了CP、AP兩個分支。
CP、AP分支代表的是硬性條件,在這個基礎上去追求利益化才是這個分支的本質問題。如果是粗暴的對另外一個選項直接放棄,那這個世界就太simple、easy了,而且也不符合我們們對系統的期望和基本使用。這就是2012年重新詮釋後CAP的最終狀態意義,“三選二”是一個偽命題。
基於這個2012年CAP的最終意義,我們們發現CP不是簡單的放棄A,而是保障CP的硬性條件去追求A。所以產生了過半寫入這樣非常經典的使用方式:過半寫入後,分散式節點可以根據少數服從多數完成資料的一致性要求。因此產生了最大的效益
1、分散式例項的更高可用性,對所有例項不在全部寫入成功才認為是成功。
2、分散式例項的更快響應性,使用廣播快速獲取過半結果後直接認定結果。依靠補充手段實現資料的一致性。
說完CP的改變,再說說AP的對應調整升級。我們們為了高可用放棄資料的一致性,其實這個說法是不嚴謹,也是錯誤的。資料一致性是系統的基本要求。那麼要怎麼理解AP,應該從髒讀、幻讀來說,場景允許資料的短暫不一致,接受資料的最終一致性。
1、資料的嚴謹性是系統的一個要求,但允許資料的一定延遲是AP存在的意義。
2、系統的高可用可以滿足更多的群體,從這個的目標上,所以AP是比較友好的
因為分散式系統,系統是多層面的組合型存在,所以我們並不會說一個系統是AP還是CP。我們是根據系統的業務場景去選擇CP和AP,但是高可用是網際網路分散式應用的特性,所以我們絕大部分情況是追求AP,儘量讓系統滿足更多的使用者。然後基於某些場景資料的強一致性必要性去選擇CP。
總結
在分散式環境下,對cap的要求。不管cp 還是ap,並不是完全丟棄另一個,而是優先順序問題;在滿足C或者A的基礎上去追求另外一個,結論如下:
1、CP--在強一致性的底線上追求可用性 (案例-過半寫入)。
2、AP—在高可用的基礎上追求資料的一致性(案例-最終一致性)。
3、系統以AP為基調,在一些資料高即時、一致性場景使用CP進行補充。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2695111/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 乾貨 | 獨創分散式網路負載均衡最佳實踐分散式負載
- Spring Security 實戰乾貨:分散式物件SharedObjectSpring分散式物件Object
- 分散式系統知識分享:正確理解CAP定理分散式
- Linux下分散式系統以及CAP理論分析Linux分散式
- 乾貨分享!JAVA診斷工具Arthas在Rainbond上實踐~JavaAI
- 好程式設計師分享乾貨 彈性分散式資料集RDD程式設計師分散式
- 分散式理論(一) - CAP定理分散式
- 分散式系統CAP定理教程分散式
- 奈學教你五分鐘學會分散式事務分散式
- 5000+字硬核乾貨!Redis 分散式叢集部署實戰Redis分散式
- TensorFlow分散式實踐分散式
- 分散式鎖實踐分散式
- 乾貨分享:螞蟻金服前端框架和工程化實踐前端框架
- 前端乾貨之JS最佳實踐前端JS
- Asp.Net Core&CAP實現分散式事務ASP.NET分散式
- 分散式系統的 CAP 理論分散式
- 【分散式】CAP理論及其應用分散式
- 分散式設計理論之CAP分散式
- 乾貨分享:容器 PaaS 新技術架構下的運維實踐架構運維
- 乾貨分享!懸浮按鈕設計規範和經典實踐
- 【乾貨】分庫分表最佳實踐
- 乾貨分享 | 3個Zbrush實用減面工具分享ZBrush
- 乾貨分享:智慧工廠時代下大資料 + 智慧的深度實踐大資料
- 分散式系統關鍵路徑延遲分析實踐分散式
- Java後端學習路線乾貨分享Java後端
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- kratos分散式事務實踐分散式
- 分散式中灰度方案實踐分散式
- 乾貨分享!Python網路爬蟲實戰Python爬蟲
- 【乾貨分享】C# 實體類生成工具C#
- 資料視覺化實用乾貨分享視覺化
- 乾貨分享|使用 Istio 實現灰度釋出
- 乾貨 | 京東雲部署Wordpress最佳實踐
- 乾貨收藏!Calico的BGP RouteReflector策略實踐
- 乾貨分享:資料分析的6大基本步驟
- 【乾貨分享】研效優化實踐:AI演算法助力深層BUG挖掘優化AI演算法
- 分散式系統理論基礎2 :CAP分散式
- 分散式系統中的CAP、ACID、BASE概念分散式