分散式設計理論之CAP
什麼是分散式系統
拿一個最簡單的例子,就比如說我們的圖書管理系統。之前的系統包含了所有功能,比如使用者註冊登入、管理員功能、圖書借閱管理等。這叫做集中式系統。也就是一個人幹了好幾件事。
後來隨著功能的增多,使用者量也越來越大。集中式系統維護太麻煩,擴充性也不好。於是就考慮著把這些功能分開。通俗的理解就是原本需要一個人乾的事,現在分給n個人幹,各自幹各自的,最終取得和一個人乾的效果一樣。
稍微正規一點的定義就是:一個業務分拆多個子業務,部署在不同的伺服器上。然後透過一定的通訊協議,能夠讓這些子業務之間相互通訊。
既然分給了n個人,那就涉及到這些人的溝通交流協作問題。想要去解決這些問題,就需要先聊聊分散式系統中的CAP理論。千萬不要被這個看起來高大上的概念迷惑住。
CAP是什麼
CAP定理(CAP theorem),又被稱作布魯爾定理(Brewer’s theorem),指的是在一個分散式系統中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性)這三個基本需求,最多隻能同時滿足其中的2個。
CAP的每個單項含義:
Consistency(一致性):指資料在多個副本之間能夠保持一致的特性,一般特指寫操作之後的讀操作,必須返回該值。舉例來說,某條記錄是 v0,使用者向 G1 伺服器發起了一個寫操作,將其改為 v1,那麼後續讀取出來的值應該是v1而不是v0。 Availability(可用性):指系統提供的服務必須一直處於可用的狀態,每次請求都能獲取到非錯的響應,但是不保證獲取的資料是最新的資料。 Partition tolerance(分割槽容錯性):分散式系統在遇到任何網路分割槽故障的時候,仍然能夠對外提供滿足一致性和可用性的服務,除非整個網路環境都發生了故障。
理解CAP理論的最簡單方式是想象兩個節點分處分割槽兩側:允許至少一個節點更新狀態會導致資料不一致,即喪失了C性質。如果為了保證資料一致性,將分割槽一側的節點設定為不可用,那麼又喪失了A性質。除非兩個節點可以互相通訊,才能既保證C又保證A,這又會導致喪失P性質。
論證CAP定理
通常來說,分割槽容錯是無法避免的,因此可以認CA的P總是成立。CAP定理告訴我們,剩下的C和A無法同時做到,下面是一個詳細的推論過程來展示CA之間的矛盾。
網路中有兩個節點N1和N2,可以簡單的理解N1和N2分別是兩臺計算機,他們之間網路可以連通,N1中有一個應用程式A,和一個資料庫V,N2也有一個應用程式B和一個資料庫V。現在,A和B是分散式系統的兩個部分,V是分散式系統資料儲存的兩個子資料庫。
在滿足一致性的時候,N1和N2中的資料是一樣的,V0=V0。 在滿足可用性的時候,使用者不管是請求N1或者N2,都會得到立即響應。 在滿足分割槽容錯性的情況下,N1和N2有任何一方當機,或者網路不通的時候,都不會影響N1和N2彼此之間的正常運作。
此時假設使用者向N1機器請求資料更新,程式A更新資料庫V0為V1。分散式系統將資料進行同步操作M,將V1同步到N2中V0,使得N2中的資料V0也更新為V1,N2中的資料再響應N2的請求。
根據CAP原則定義,系統的一致性、可用性和分割槽容錯性細分如下:
一致性:N1和N2的資料庫V之間的資料是否完全一樣。 可用性:N1和N2對外部的請求能否做出正常的響應。 分割槽容錯性:N1和N2之間的網路是否互通。
這是正常運作的場景,也是理想的場景。作為一個分散式系統,它和單機系統的最大區別,就在於網路。現在假設一種極端情況,N1和N2之間的網路斷開了,我們要支援這種網路異常。相當於要滿足分割槽容錯性,能不能同時滿足一致性和可用性呢?還是說要對他們進行取捨?
假設在N1和N2之間網路斷開的時候,有使用者向N1傳送資料更新請求,那N1中的資料V0將被更新為V1。由於網路是斷開的,所以分散式系統同步操作M無法進行,所以N2中的資料依舊是V0。這個時候,有使用者向N2傳送資料讀取請求,由於資料還沒有進行同步,應用程式沒辦法立即給使用者返回最新的資料V1,怎麼辦呢?這裡就有兩種選擇:
犧牲資料一致性,保證可用性。響應舊的資料V0給使用者。 犧牲可用性,保證資料一致性。阻塞等待,直到網路連線恢復,資料更新操作M完成之後,再給使用者響應最新的資料V1。
CAP原理的應用
網際網路場景:
對於多數大型網際網路應用的場景,主機眾多、部署分散,而且現在的叢集規模越來越大,所以節點故障、網路故障是常態,而且要保證服務可用性達到N個9,即保證P和A,捨棄C(退而求其次保證最終一致性)。雖然某些地方會影響客戶體驗,但沒達到造成使用者流失的嚴重程度。
對於涉及到錢財這樣不能有一絲讓步的場景,C必須保證。網路發生故障寧可停止服務(或者只讀不寫),這是保證CA,捨棄P
資料庫領域:
依據CAP理論,從應用的需求不同,我們選型資料庫時,可以從三方面考慮:
考慮CA,這就是傳統上的關係型資料庫(RMDB) 考慮CP,主要是一些Key-value資料庫,典型代表為google的Big Table 考慮AP,主要是一些面向文件的適用於分散式系統的資料庫,如SimpleDB
下面是一張流傳非常廣泛的圖,它展示了按照CAP中三選二對資料庫系統的分類:
最後
我們明白了CAP的矛盾、原理、應用之後,在平時的工作中的取捨也就會更加清楚明瞭了,我們需要清楚什麼場合下選用哪種特性。
舉例來說,釋出一張網頁到 CDN,多個伺服器有這張網頁的副本。後來發現一個錯誤,需要更新網頁,這時只能每個伺服器都更新一遍。一般來說,網頁的更新不是特別強調一致性。短時期內,一些使用者拿到老版本,另一些使用者拿到新版本,問題不會特別大。當然,所有人最終都會看到新版本。所以,這個場合就是可用性高於一致性。
大家也可以多思考一些其他特定的場景,然後分析一下到底應該選用哪種特性,歡迎留言討論。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925694/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分散式系統之CAP理論雜記分散式
- 分散式理論(一) - CAP定理分散式
- Java分散式系統設計:CAP定理與BASE理論Java分散式
- 分散式系統的 CAP 理論分散式
- 【分散式】CAP理論及其應用分散式
- 分散式系統理論基礎2 :CAP分散式
- 分散式系統:CAP 理論的前世今生分散式
- 分散式事務及其CAP和base理論分散式
- Linux下分散式系統以及CAP理論分析Linux分散式
- 分散式從 ACID、CAP、BASE 的理論推進分散式
- 10分鐘瞭解分散式CAP、BASE理論分散式
- 分散式必備理論基礎:CAP和BASE分散式
- CAP理論之思考
- CAP理論
- 看《大明王朝1566》聊分散式中的CAP和BASE理論分散式
- 分散式理論(二) - BASE理論分散式
- 看完這篇,保證讓你真正明白:分散式系統的CAP理論、CAP如何三選二分散式
- cap理論賞析
- 分散式系列七: 分散式事務理論分散式
- 分散式理論學習分散式
- 4.9 CAP和BASE理論
- 正確理解CAP理論
- 架構設計 | 分散式事務①概念簡介和基礎理論架構分散式
- 分散式系統CAP定理教程分散式
- 分散式事務(2)---TCC理論分散式
- 分散式事務理論加實戰分散式
- (1)分散式事務理論基礎分散式
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- 分散式理論(四) - 3PC協議分散式協議
- 分散式理論(三) - 2PC協議分散式協議
- 總結下分散式主要理論知識分散式
- 分散式系統理論基礎8:zookeeper分散式協調服務分散式
- CAP理論—最通俗易懂的解釋
- 分散式系統中的CAP、ACID、BASE概念分散式
- 分散式系統的經典基礎理論分散式
- 分散式系統理論基礎6:Raft、Zab分散式Raft
- 分散式ID設計方案分散式
- 奈學乾貨分享:分散式CAP實踐分析分散式