1. 程式人生 > >轉載 CAP原理這樣理解最簡單

轉載 CAP原理這樣理解最簡單

前言 眾所周知,CAP理論是架構師在設計分散式系統過程中,處理資料一致性問題時必須考慮的基石級理論(聖經級的,V)。大意是說,在分散式網路分割槽環境中,資料的一致性、可用性和分割槽容忍性三者之間,至多隻能保證兩者,無法三者同時保證。對於CAP理論,個人剛接觸時感覺很容易理解,不就是講的一個在分散式環境下魚和熊掌不能兼得的問題嗎?誠然,如果從直觀上泛泛而談,的確不難,即在多節點的網路環境中,當要求資料強一致性時,一定會犧牲掉可用性,反之亦然。

然而,在最近的一次公司內部技術分享會上,一個同事問我,能不能順便通俗易懂地給大家講一下關於CAP理論如何理解?我隨即問了在場的其他幾個同事,大家也認為可以給大家仔細講一下,原因是大家對CAP理論的理解基本也處於是懂非懂的狀況。最先提問的同事的問題點在於,大家普遍認為關係型資料庫多采用CA,而NoSql多采用AP,然而為什麼大多數關係型資料庫又支援Master-Slave式的分割槽複製功能呢?難道關係型資料庫是CAP理論的一個例外?

理解第一步:分散式是前提 為了徹底講清楚這個問題,首先需要明白的是,CAP理論的主要場景是在分散式環境下,在單機環境下,基本可不考慮CAP問題。如果不明白什麼是分散式場景,請看下面這張圖(此圖借用自如何正確理解CAP理論一文)。圖中除最上面那臺標記為“客戶端”電腦以外的部分(包括橫著的那根粗線,以及A\B\C三個節點)共同組成了一個分散式系統。

理解第二步:C、A、P準確定義 其次,需要搞清楚Eric Brewer大神對CAP三者的準確定義。這裡借用一下維基百科CAP理論一文中關於C、A、P三者的定義。(其實也試圖想參考國人的某百科,但發現貌似仍然講得不清不楚)。

Consistency Availability Partition tolerance Every read receives the most recent write or an error Every request receives a (non-error) response – without guarantee that it contains the most recent write The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes 三者的定義及個人理解如下:

Consistency:一致性,原文翻譯過來是說,對於任何從客戶端發達到分散式系統的資料讀取請求,要麼讀到最新的資料要麼失敗。換句話說,一致性是站在分散式系統的角度,對訪問本系統的客戶端的一種承諾:要麼我給您返回一個錯誤,要麼我給你返回絕對一致的最新資料,不難看出,其強調的是資料正確。

Availability:可用性,原文翻譯過來是說,對於任何求從客戶端發達到分散式系統的資料讀取請求,都一定會收到資料,不會收到錯誤,但不保證客戶端收到的資料一定是最新的資料。換句話說,可用性是站在分散式系統的角度,對訪問本系統的客戶的另一種承諾:我一定會給您返回資料,不會給你返回錯誤,但不保證資料最新,強調的是不出錯。

Partition tolerance:分割槽容忍性,這個詞有點怪,如果直接看中文的確有點不太好理解。那麼看原文翻譯怎麼說的,分散式系統應該一直持續執行,即使在不同節點間同步資料的時候,出現了大量的資料丟失或者資料同步延遲。 (PS:V,您瞧瞧,包容度多高,簡直是打不死的小強,現在應該能夠理解為什麼用tolerance容忍度這個詞了吧。) 換句話說,分割槽容忍性是站在分散式系統的角度,對訪問本系統的客戶端的再一種承諾:我會一直執行,不管我的內部出現何種資料同步問題,強調的是不掛掉。

理解第三步:串起來,So easy 搞明白三個字母的準確含義之後,結合到上面那張圖,應該比較容易理解了。

對於一個分散式系統而言,P是前提,必須保證,因為只要有網路互動就一定會有延遲和資料丟失,這種狀況我們必須接受,必須保證系統不能掛掉。試想一下,如果稍微出現點資料丟包,我們的整個系統就掛掉的話,我們為什麼還要做分散式呢?所以,按照CAP理論三者中最多隻能同時保證兩者的論斷,對於任何分散式系統,設計時架構師能夠選擇的只有C或者A,要麼保證資料一致性(保證資料絕對正確),要麼保證可用性(保證系統不出錯)。

PS:其實維基百科的原文裡面也有這麼一段,說的也是上面的意思,我就不翻譯了: CAP is frequently misunderstood as if one has to choose to abandon one of the three guarantees at all times. In fact, the choice is really between consistency and availability only when a network partition or failure happens; at all other times, no trade-off has to be made.

結語 最後回答一下本文開頭俺的同事關於關係資料庫的問題,個人理解,其實關係型資料庫同時保證CA時,指的並非是分散式環境下,簡單地說就是單機環境下。如果在Master-Slave類複製式分散式環境下,預設保證的是CP,用過Mysql Master-Slave或者Mssql的複製-訂閱模式的同仁應該知道,一旦主從機資料複製時出錯,出現數據不一致的情況,必須人工干預或者重新同步。