Contents

Consistency, Availability, Partition Tolerance (CAP)

Consistency, Availability, Partition Tolerance (CAP)

Consistency (一致性), Availability (可用性), Partition Tolerance (部分容錯性) Source : CAP 理論

./feature.png Source : https://www.w3resource.com/mongodb/nosql.php ./cap.png Source : https://github.com/donnemartin/system-design-primer/raw/master/images/bgLMI2u.png

來源:CAP Theorem: Revisited

在一個分散式系統中,只能滿足以下三個項目的任兩項:

  • Consistency 一致性 - 每次讀取都可以得到最新的資料,但偶爾會拿到錯誤
  • Availability 可用性 - 每次讀取都可以得到非錯誤的回應,但不能保證可以得到最新的資料, 不能超時不能吐 error.
  • Partition Tolerance 部分容錯性 - 在任意分區的網路故障情況下,系統仍然能夠持續運行

網路是不可靠的,你的設計必須要確保部分容錯性,所以你只能夠在一致性與可用性中做出取捨。

CP : 一致性與部分容錯性 (保證原子讀寫時)

還是一個分區關掉服務,只提供一個分區的數據來確保一致性 等待分區的節點回覆可能會導致超時錯誤,如果你的系統的需求是需要 保證原子讀寫時, CP 是一個不錯的選擇。 https://robertgreiner.com/content/images/2019/09/CAP-CP.png

AP : 可用性與部分容錯性, 最終一致性

兩個分區都可以服務,但是回傳合理但是不正確的數據 每個進行回覆的節點中的最新版本可能不是最新的,當分區節點解析完畢後,寫入的操作可能需要一些時間來傳播資料。 當你的系統需求需要保證 最終一致性,或當外部系統故障時,系統要能夠繼續運作時,AP 是一個不錯的選擇

在寫入後的讀取操作最終可以看到被寫入的資料(通常在數毫秒內)。資料透過非同步的方式被複製。DNS 或是電子郵件系統使用的就是這種方式,最終一致性在高可用的系統中效果很好。https://robertgreiner.com/content/images/2019/09/CAP-AP.png

CA

所以如果你的分布式系統做到 CA,犧牲 Partition Tolerance,那就是代表你的機房永遠不會出現網路分區,永遠不會掉包 ,那麼完美的機房給我來一打吧… 除非有可能有完美的網路環境,否則 CA 根本就是傳統定義的單機系統,而非分布式系統。所以不要再被騙「我這個分布式儲存系統只能做到 CA」.

比較

FeatureConsulzookeeperetcdeuerka
服務健康檢查服務狀態, 內存, 硬碟等(弱) 長連接 keepalive連接心跳可配支持
多數據中心支持---
kv 儲存服務支持支持支持-
一致性raftpaxosraft-
capcacpcpap
使用接口(多語言能力)支持http 和 dns客戶端http/grpchttp (sidecar)
watch支持全量/支持long polling支持支持long polling支持long polling / 大部分增量
自身監控metrics-metricsmetrics
安全aci / httpsacihttps 支持(弱)-
spring cloud 集成已支持已支持已支持已支持

ACID

ACID 是 Database 為了保證事務(transaction)的正確性而提出來的一個理論

  • Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。
  • Consistency(一致性):在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設約束觸發器級聯回滾等。
  • Isolation(隔離性):資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括未提交讀(Read uncommitted)、提交讀(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

與 CAP 的差異

  • ACID 中的 A(Atomicity)和 CAP 中的 A(Availability)意義完全不同
  • ACID 中的 C 是指資料庫的資料完整性,而 CAP 中的 C 是指分佈式節點中的資料一致性
  • ACID 的應用場景是資料庫事務(transaction),CAP 關注的是分散式系統資料讀寫這個差異點來看

來源及延伸閱讀