12.30 分佈式系統 CAP 理論

優質文章,及時送達

面试准备 - 分布式系统 CAP 理论

鏈接 | github.com/pkwenda/Blog/issues/28

CAP 理論是一個被說爛了也聽爛了的話題,但是還是選擇花點時間做整理,做些橫向拓展,加點自己的感受,認認真真討論一下。

之前看阮一峰老師寫的文章不錯,我之前覺得總有點難懂,現在我覺得是有點問題

我覺得阮老師說的 Availability 理解不對,分佈式和具體「哪臺」沒什麼關係。Partition tolerance 的解釋也沒讓我豁然開朗。

CAP 簡介

1998 年,有個哥們提出了分佈式系統的三個指標:

CAP (Consistency、Availablity 、Partition-tolerance ) 其中:

Consistency

  • 一致性

這哥們說,分佈式系統所有數據備份,在「同一時刻」,必須是「同樣的」。

面试准备 - 分布式系统 CAP 理论

比如圖床服務:後臺是三臺機器 A、B、C 做支撐,上傳一張圖片,通過網關最終可能是 A 處理的,隨後「馬上」請求這張圖片,通過網關輪詢算法,這個請求極有可能不落在 A 上了,那麼他說:不管落在 B、C 哪個機器上,該圖片必須存在並返回,否則,就不是『一致性』

如果就有多個分區要執行寫操作,如果分佈式存儲系統「分片」同步、或集群系統的「主從」同步總會有個先後順序,在這個先後順序中,就產生了不一致的問題,這時候你:

  • 要麼接受同一個數據在各個存放點上同步過程中的「暫時」不一致。

  • 要麼你要「強一致性」,那麼同步操作就會影響你的「可用性」。

常見的一致性的級別整理,想看的可以看看

Availability

  • 可用性

這哥們說: 在集群中一部分節點故障後,集群整體是否還能響應客戶端的讀寫請求,即使集群中的某個結點宕機了,依舊不影響你的任何請求。

這條非常好理解,就是字面意思

Partition tolerance

  • 分區容忍性

這哥們說:如果集群中的機器被分成了兩部分,這兩部分不能互相通信,系統是否能繼續正常工作

這個 CAP 中的 P 是最誤導我的,以至於今天我對 CAP 依舊無法侃侃而談,特此整理的原因。

我對「分區容忍性」的疑問

很多人說 “一致性,可用性,分區容忍性,只能任意選擇其中兩個”,乍一看是沒錯,但是 AC 滿足嗎?

普遍到「百度百科」原話也是這樣寫的:

<code>CAP原則的精髓就是要麼AP,要麼CP,要麼AC,但是不存在CAP。
/<code>

我的疑問:保證了 AC,那麼 P 就沒辦法保證,

試想:機器間不能通信,網絡分區,如何保證數據的一致性?如何同步數據?

AP CP 我都能理解,平常工作中也都能看到影子:

比如 AP(Eureka)選擇了可用性、 CP(Zookeeper、HDFS)都選擇了一致性,但是 AC 的模型在哪裡?如何做到不會通信失敗呢?

有人說:CAP理論作者太教條!只要各地的分佈式機器保持一個量級,且把無法通信的機器踢下去,那就是 CAP!

又有人說:那不行,如果網絡抖動,你踢的太多,數據分片達不到要求也不行!

cloudera facebook原文(cloudera官網原文已失效)

參考上文翻譯

作者的意思是,只能CP或者AP 因為由於網絡問題,將系統的成員隔離成了2個區域,互相無法知道對方的狀態,這在分佈式環境下是非常常見的。所以說只能從C和A中選一個。所以 P 必選。要建一個永遠不發生多相關故障的網絡,對於分佈式系統來說是不切實際的。所以設計者必須在一致性(C)和可用性(A)之間做選擇。

當然以上都是教條的按照 CAP 理論進行的討論,其實在現實中不需要如此糾結。

總結

在分佈式環境下面,P 是鐵定存在的,也就是隻要我們有多臺機器,那麼網絡隔離分區就一定不可避免,所以在設計系統的時候我們就要選擇到底是設計的是 AP 系統還是 CP 系統,但實際上,我們只要深入理解下 CAP,就會發現其實有時候系統設計上面沒必要這麼糾結,主要表現在:

網絡分區出現的概率雖然市場發生,但是我們可以感知心跳強行剔除下線,將流量平均分往其他節點,畢竟誰也不能保證網絡百分百穩定,不出現網絡分區。自然而然的沒必要刻意 A、C 中選一個,而是可以都做得不錯。也就是「百度百科」說的 AC 系統。

CAP 裡面規定 A 是 100% 的可用性,但實際上,我們只需要提供 high availability,也就是像網關一樣,全年不宕不可能,但是滿足 99.99% 或者 99.999% 等幾個 9 就可以了。

收穫

對 CAP 的 P 又有了進一步的概念,有了一些新的理解,又看了下 Paxos,實在是比較複雜本來想也寫寫,但是理解的還不好怕寫不好

下次再說。

阮一峰老師:https://www.ruanyifeng.com/blog/2018/07/cap.html

cloudera cap : https://pt-br.facebook.com/notes/cloudera/cap-confusion-problems-with-partition-tolerance/385772907002/

cloudera cap 翻譯:http://zzyongx.github.io/blogs/cap-confusion-problems-with-partition-tolerance.html

常見的一致性的級別:https://github.com/pkwenda/Blog/blob/master/snippets/consistency.md

- END -


分享到:


相關文章: