天天看點

【分布式理論】之 CAP

文章目錄

  • ​​一、CAP​​
  • ​​概念​​
  • ​​(1) 一緻性(Consistency)​​
  • ​​(2)可用性(Availability)​​
  • ​​(3)分區容忍性(Partition Tolerance)​​
  • ​​二、避免使用 CAP​​
  • ​​為什麼避免使用 CAP?​​
  • ​​(1) 隻能在 CA 和 AP 中選擇嘛?​​
  • ​​(2) CAP 關注的是一個分布式系統嘛?​​
  • ​​(3) 一個系統的選擇需要看實際情況​​
  • ​​三、凡凡認為​​
  • ​​四、引用​​

一、CAP

概念

CAP 有時也代表一緻性,可用性,分區容錯性,系統隻能支援其中兩個特性(CP 或 AP)。

(1) 一緻性(Consistency)

​A read is guaranteed to return the most recent write for a given client​

用戶端,保證讀操作能傳回大部分最近的寫操作結果

(2)可用性(Availability)

​A non-failing node will return a reasonable response within a reasonable amount of time(no error or timeout)​

非故障的節點在合理的時間内傳回合理的響應(不是錯誤和逾時的響應)

(3)分區容忍性(Partition Tolerance)

​The system will continue to function when network paritions occur​

當出現網絡分區後, 系統能夠繼續 “履行職責”

二、避免使用 CAP

主要是 CAP 的局限性

為什麼避免使用 CAP?

圍繞着 CAP 有太多的誤解與困擾,最後反而無法幫助我們更好地了解系統

(1) 隻能在 CA 和 AP 中選擇嘛?

  1. 在網絡正常的時候,系統可以同時保證一緻性(線性化)(C) 和 可用性(A)
  2. 在網絡故障的時候,必須要麼選擇一緻性(線性化)(C),要麼可用性(A)

SO,CAP 忽略了網絡故障。

即:選擇 CA 和 AP,是根據實際情況(條件)下,所處的狀态

(2) CAP 關注的是一個分布式系統嘛?

結論:CAP 關注的粒度是資料,而不是整個系統

一個系統可能處理隻是一種資料,若包含多種類型的資料,有的資料必須選擇 CP,有的資料必須選擇 AP

比如:使用者系統

  1. 使用者基本資訊資料(昵稱、性别和自我介紹等等),選擇 AP
  2. 使用者帳号資料(使用者ID、密碼),選擇 CP

(3) 一個系統的選擇需要看實際情況

舉個例子:

例如,現代多核CPU上的記憶體甚至就是非線性化(不一緻性):如果某個CPU核上運作的線程修改一個記憶體位址,緊接着另一個CPU核上的線程嘗試讀取,則系統無法保證可以讀到剛剛寫入的值,除非使用了記憶體屏障或fence指令

出現這個情況的原因:

每個CPU核都有自己獨立的 cache 和 寄存器。

記憶體通路首先進入 cache 系統,所有修改預設會異步地重新整理到主存。

由于通路 cache 比通路主存要快得多,是以這樣的異步重新整理特性對于現代CPU的特性至關重要。

但,這就導緻出現了多個資料副本(一個主存,另外幾個在不同級别的 cache 中),而副本更新是異步方式,無法保證線性化

So,CAP 理論不适用與當今的多核-記憶體一緻性模型:在計算機内部,我們通常假設通訊是可靠的,即不會假定一個CPU核在與其他核斷開之後還能安然工作。

之是以放棄線性化(一緻性)的原因:性能,而不是為了容錯。

許多分布式資料庫也是類似,它們選擇不支援線性化是為了提高性能,而不是為了保住容錯性

三、凡凡認為

  1. CAP 好處在于:指明了方向或名額,提供了這個幾個角度,讓人們去思考自己的系統
  2. 若太看重 CAP,被這個框住,可能會忽略其他細節(故障)。
  3. 有時跳出架構,從其他角度去看待系統,可能會有另一番收獲。
  4. 理論應該成為我們的助推器,而不是限制器。

四、引用

  1. 《DDIA》
  2. 《從零開始學架構》

繼續閱讀