架構師都該懂的 CAP 定理

来源:https://www.cnblogs.com/one12138/archive/2020/07/19/13341366.html
-Advertisement-
Play Games

面對可能出現的網路延遲,不可預估的請求流量等情況,設計一個分散式系統,我們通常圍繞系統高可用,數據一致性的目標去規劃和實現,想要完全實現這個目標,卻並非易事。由此,分散式系統領域誕生了一個基本定理,即 CAP 定理,用於指導分散式系統的設計,從系統高可用,數據一致性,網路容錯三個角度將分散式系統的特 ...


18eea7b27ba8f7663ea857abf6896a63

面對可能出現的網路延遲,不可預估的請求流量等情況,設計一個分散式系統,我們通常圍繞系統高可用,數據一致性的目標去規劃和實現,想要完全實現這個目標,卻並非易事。由此,分散式系統領域誕生了一個基本定理,即 CAP 定理,用於指導分散式系統的設計,從系統高可用,數據一致性,網路容錯三個角度將分散式系統的特性抽成一個分區容錯一致性模型。這樣一來,讓系統設計者只需根據業務場景特點,進行權衡設計適合業務場景的分區容錯一致性模型即可,很大程度簡化了分散式系統設計的難度。

也因此,CAP 定理是架構師所必須要掌握的內容,它影響著架構師對分散式系統的技術選型,技術決策。既然如此重要,接下來,我們就一起學習下 CAP 定理吧。

什麼是 CAP

CAP 定理最初是由加州大學伯克利分校的電腦科學家埃里克·布魯爾(Eric Brewer)在 2000 年的 ACM PODC 上提出的一個猜想,也因此被叫做布魯爾定理。後來在 2002 年,麻省理工學院的賽斯·吉爾伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)發表了 CAP 定理的證明,讓它成為分散式系統領域公認的一個定理。

CAP 定理指出了,在一個跨區域網路連接,共用數據的分散式系統中,一致性(Consistency),可用性(Availability)和分區容錯性(Partition Tolerance) 這三個約束屬性最終只能同時滿足二個。

76ACB251-D01B-4965-BB90-9D1C3CE074DD

下麵是關於這三個屬性的簡單描述:

  • 一致性:客戶端進行讀操作得到的數據永遠是最近一次寫入的數據,要求了對數據讀寫的強一致性。
  • 可用性:客戶端的請求在限定時間內總能從非故障的系統節點得到正常的響應,其中不能有超時,不能出錯如 502之類。
  • 分區容錯性:就是出現網路分區現象,即節點間無法正常通信,數據同步出現延時等情況時,系統仍能繼續提供服務。

需要註意的是,CAP 描述了一個常規的分散式系統場景:有網路連接,且數據跨節點進行共用。如果在整個系統中,數據只有一份,並且其他節點沒有對應的副本,也不需要進行跨節點的數據共用,這樣分散式系統就不是 CAP 關心的對象了,也談不上結合 CAP 定理去設計和實施。

深入認識 CAP

瞭解 CAP 基本概念之後,我們再來分別對 C,A,P 三個屬性進一步學習下,加深對 CAP 的理解。

C:一致性

這裡的一致性從不同角度有著各自的描述方式,在分散式系統中表現是每個節點的數據是相同;而對於客戶端,表現是讀操作所得到的結果永遠是最新寫入的。其中需要明確的是,對於分散式系統節點來說,是可能出現某個時刻擁有不同的數據的情況:如果在某個節點執行原子性操作時,對於執行過程中的節點數據跟其他節點就並不完全一致,只有原子性操作執行完成後,節點的數據才會繼續保持同步。比如常見的事務操作,只有事務提交後,客戶端才能讀取到事務寫入的數據,失敗則回滾為舊的數據,不會出現讀取事務中間寫入數據的情況。

一致性要求了在分散式環境下的操作要就像在單機上完成的一樣,當客戶端發起寫請求時,收到寫請求的節點會及時響應,並將更新的數據同步到另一個節點,保證數據一致性。具體的工作流程,如下所示:

  1. 客戶端向節點 1 發送寫操作,將數據 X 更新為 1 ,
  2. 更新操作成功,系統將更新的數據從節點 1 同步到節點 2,將節點 2 的舊數據 X 也更新為 1。
  3. 客戶端再向節點 2 發送讀操作獲取數據 X 時,就會得到 X 最新的值:1。

7385C9D0-5AAC-4D83-A0EA-742A8B3511EF

一致性強調了數據的強一致,這一點要求對於一些系統可以說是十分重要的。比如電商系統的庫存扣減,金融系統的轉賬扣款等場景,任何出現一致性的問題,都可能會造成很嚴重的後果。

A:可用性

介紹完一致性,再來看下可用性,雖然可用性概念相對簡單,但重要程度跟一致性一樣。要讓系統滿足可用性,就是要保證無論除了所有節點出現故障的情況外,系統都能返回有效的響應,允許響應給客戶端是舊的數據,但不能出現響應失敗,超時的情況。

可用性強調的是服務可用,但不保證數據的正確性。用一個簡單的例子來描述分散式系統的可用性如下:允許客戶端向節點 1 或者節點 2 發起讀操作,當其中某一個節點故障了,不管節點間數據是否一致,只要有節點服務能收到請求,就響應 X 的值,這樣就說明這兩個節點服務是滿足可用性。

61EA8CAE-9971-496C-9AD6-DF0020CF0F36

在可用性的描述,還值得一提的是關於什麼算有效的響應。要返回有效的響應,不能超時,也不能出錯,結果不一定是正確的,比如返回了舊數據,但是客戶端接收到後是能進行正常業務處理的。

P:分區容錯性

講完 C 和 A 之後,最後再講一下 P: 分區容錯性。由於分散式系統多個節點往往部署在多個網路環境下進行相互通信,就難免出現一些網路故障,如網路丟包,網路消息延遲,網路中斷等情況,會導致節點間的通信出現問題,數據同步操作無法完成,分區容錯性就要求了系統即使在網路分區出現的情況下,能仍繼續對客戶端提供服務。

7BD54C0E-8D21-40AB-9F24-689B96AD9860

因為分散式系統與單機不同,它涉及到了多節點間的通信和數據交互,避免不了網路問題,如果沒有分區容錯性,就意味著系統不允許出現節點間的通信出現任何錯誤,錯誤就意味著系統不可用,這在絕大數系統中無法接受的。因此對節點間的分區故障容錯是必須要考慮的,也是 CAP 定理中分區容錯性通常首先要保證的原因。

如何應用 CAP 定理

瞭解完 CAP 定理的一致性(C),可用性(A)和分區容錯性(P)之後,我們再來看下如何使用這個定理。CAP 定理指明瞭 C,A,P三個屬性無法同時滿足,而在必有網路交互和數據同步的情況下,就一定會有延遲和數據丟失的情況,對於這種情況我們又必須接受且保證系統不能掛掉。所以分區容錯性是必須要保證的,剩下的就是在一致性 (C)和可用性(A)之間做選擇了。選擇了一致性,保證數據正確性,但也意味系統可能存在不可用的情況;而選擇可用性,保證服務的高可用,但也意味數據可能出現不一致性的情況。接下來就探討下應用採用 CP 架構,AP 架構所各自的特點,以及如何根據不同的分散式場景選擇適合的架構策略。

CP

對於 CP 架構的分散式系統來說,為了保證一致性,當出現網路分區後,如果節點 1 上數據 X 已經更新為 2,但由於節點 間數據同步的通道已經中斷,節點 1 數據無法同步到節點 2,節點 2 上的數據 X 還是 1。此時如果客戶端訪問節點 2 的數據 X,節點 2 就需要返回錯誤,提示系統發生了錯誤,直到節點間的數據保持同步。當然這樣的處理方式明顯違背了可用性的要求,因此在 CAP 定理只能滿足 CP。

7385C9D0-5AAC-4D83-A0EA-742A8B3511EF

如果一個分散式場景需要很強的一致性,或者能容忍系統長時間無響應但是數據要保持一致的情況,就比較適合使用 CP 架構設計對應的分散式系統。這樣的系統一旦發生網路分區會導致數據無法同步情況,就要犧牲系統的可用性,直到節點數據達到一致後再響應。在開源社區中採用 CP 架構的應用不少,比如 Redis,HBase,MongoDB,ZooKeeper,Etcd,Consul 等都是放棄了一定可用性而選擇 CP 屬性。

AP

如果採用 AP 架構設計的分散式系統,為了保證可用性,當網路分區發生後,同樣節點 1 上數據 X 已經更新為 2,但由於節點間數據同步的通道已經中斷,節點 1 數據無法同步到節點 2,節點 2 上的數據 X 還是 1。這是客戶端訪問節點 2 獲取數據 X 時,收到是正常的響應,舊數據 X = 1,而實際上當前最新的數據 X 已經是 2 了,這裡就不滿足一致性的要求了,因此在 CAP 定理只能滿足 AP。

19FDEDFA-391D-4718-B870-F0CD83AB28AE

同樣適合 AP 的場景有很多,比如一些查詢系統,電商系統的商品查詢等,大多數為了保證系統的可用性,而犧牲一定的數據一致性,這樣也保證了用戶體驗,在開源界中採用 AP 模型的典型應用有 Eurka,Cassandra。

必須三選二嗎

提到了 CAP 定理,大多數人都認為無論什麼情況,分散式系統只能在 C 和 A 中選擇一個。但這裡的前提是系統發生了網路分區情況,如果系統沒有發生網路分區的情況,也就是說 P 不存在的時候,我們就沒有必要放棄 C 或者 A,因此進行架構設計時也應該考慮沒有分區情況下如何保證 CA。除此之外,一個分散式系統不一定只能從 AP 與 CP 中做選擇,內部不同模塊所應對的場景也不同,完全有可能是一個模塊採用 AP 架構,另一個模塊採用 CP 架構。作為優秀的架構師,不應該受到大多數人對 CAP 定理所認識的局限,設計出符合自身業務場景的分散式系統才是重中之重。

總結

本文主要瞭解和認識 CAP 定理,以及每個 C,A,P 的含義,以及 CAP 定理的應用。掌握 CAP 定理,對架構師來說非常重要。因為對於分散式系統來說,網路故障在所難免,如何在出現網路故障的時候,維持系統按照正常的行為邏輯運行就顯得尤為重要。一個合格的架構師需要是能結合實際的業務場景和具體需求,基於 CAP 定理來進行權衡和設計可用且穩定的分散式系統。

參考資料

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 不帶註釋的 <script>function ajax(json) { json.type = json.type ? json.type : 'get'; json.async = json.async == false ? false : true; json.contentType = jso ...
  • 我一直思考框架設計該如何簡單,如何降低開發者難度,最後想出了相處了一個比較滿意的框架設計。 框架大致分為 前端UI -後端API-資料庫: 前端UI和後端API通過DTO 模型交互 後端API和資料庫通過ORM 模型交互 資料庫以及ORM模型之間的關係: 鑒於項目可能復用多個資料庫,後端工程師可能需 ...
  • 使用Mvvm 架構目的 一 :為了使開發快速,界面設計和界面交互可以同時進行。 二: 為了方便測試,交互功能的測試可以完全脫離wpf控制項。 Wpf mvvm 架構如下: 在wpf 中 ,V界面數據更改後,直接修改M,那樣VM 就可以直接從M 中獲取到最新值。當 V界面觸發事件如(保存,修改等),VM ...
  • 《Java編程思想》是一本好書,但同時也是晦澀難懂,其一是知識本身的難度,其二這本書是翻譯過來的,而且是直譯。我也是嘗試了好多次才又拿起了這本書啃,沒想到今天突然感覺發現了寶藏。 接下來我就羅列一下今晚的收穫吧: Sun對Java的設計目標:為程式員減少複雜性。(雖然Sun被收購了,還是謝謝Sun, ...
  • 解決IDEA/pycharm提示Untrusted Server's certificate 證書不可用( Server's certificate is not trusted ) ...
  • 官方參考文檔: go install google.golang.org/protobuf/cmd/protoc-gen-go 安裝protobuf go 插件 https://developers.google.com/protocol-buffers/docs/reference/go-gene ...
  • 一:為什麼學習代理模式: 代理模式實際上是SpringAOP的底層! 【SpringAOP 和 SpringMVC (面試必問)】 二:代理模式(基本概念): 基本概念:代理模式的核心作用就是通過代理,控制對對象的訪問。這跟實際中是一樣的,例如說我們租房子時遇到的中介,這就是一個代理,比如有人要找中 ...
  • 使用示例: $atomic = new Swoole\Atomic(); $serv = new Swoole\Server('127.0.0.1', '9501'); $serv->set([ 'worker_num' => 1, 'log_file' => '/dev/null' ]); // ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...