跳至主要內容
論文精煉 · Distributed systems

Brewer 猜想與兼具一致性、可用性、分割容錯之 Web 服務的可行性

CAP 的形式化結果:在可能遺失訊息的非同步服務中,無法同時保證原子一致性與可用性。

作者Seth Gilbert、Nancy Lynch(MIT Laboratory for Computer Science) 發表於ACM SIGACT News 33(2),2002 年 6 月,頁 51–59 年份2000–2002
閱讀原始論文 PDF 所有論文

一口氣講完 — 整篇論文的濃縮

Gilbert 與 Lynch 將 Brewer 猜想形式化為一個由網路節點複寫的 read/write data object。他們分別定義 atomic consistency、availability 與 partition tolerance,再以不可區分性建構證明:非同步實作無法同時保證三者。當分割一側已完成寫入,另一側的讀取若收不到該資訊,就只能在「未得知寫入便回應」與「無法終止」之間擇一。論文接著研究部分同步模型,說明有界的時序假設如何容許實用折衷;但在原定義的可用性要求下,分割造成的不可能性仍然存在。

在這篇論文之前 — 它所降落的世界

Eric Brewer 在 2000 年提出猜想:分散式 web service 無法同時提供一致性、可用性與對網路分割的韌性。這篇 2002 年論文補上形式模型與證明。其用語刻意收窄:一致性是 read/write object 的 atomic(linearizable)行為;可用性要求送達非故障節點的每個請求最終得到回應;分割容錯則允許網路在元件之間任意遺失訊息。因此它是在明確假設下的不可能性定理,而不是後來那句「每套系統自由三選二」的口號。

問題 — 當時真正壞掉的地方

  • Brewer 猜想必須先精確定義,才能被證明並用來推理系統。
  • 網路分割一側已完成的寫入,對另一側收到的讀取可能完全不可見。
  • 可用性迫使非故障節點收到的每個請求,即使通訊中斷也必須終止。
  • Atomic consistency 要求操作呈現為一個遵守實際時間先後的序列,因此較晚的讀取不能合法忽略已完成寫入。
  • 在非同步網路中,節點無法靠經過時間區分延遲訊息與已遺失訊息。
  • 加入時序上界會改變可實作的折衷,卻無法讓資訊穿越持續存在的網路分割。

核心概念 — 主要貢獻,以及它們為何成立

精確的三性質模型

論文針對 read/write data object 分別定義 atomic consistency、availability 與 partition tolerance,避免把定理擴張到一致性的所有含義,或可用性的所有營運定義。

非同步不可能性

先假設寫入在一個網路元件中完成,再讓另一個收不到前者訊息的元件收到讀取。可用性要求讀取結束,atomicity 卻要求它反映已完成寫入。讀取端無法區分寫入不同值的執行,因此沒有任何答案能在所有執行中都正確。

關鍵是不可區分性,而非效能

矛盾來自資訊而非數量:在本應給出不同答案的執行中,讀取元件擁有完全相同的本地歷史。更快的機器、重試或更多複本,都無法提供那份缺失資訊。

C 指 atomic consistency

此處的一致性是模擬物件的 atomic consistency(linearizability):每個操作都在 invocation 與 response 之間某一點生效,且順序遵守真實時間。

可用性是存活性保證

可用性要求送達非故障節點的每個請求最終收到回應;它不指定延遲目標,也不要求每個回應都含有最新資料。

分割容錯是網路模型

分割條件允許節點群組之間任意遺失訊息。部署環境若會發生這類故障,它就不是演算法可以單純拒絕的選配功能。

部分同步容許有條件的折衷

後續章節研究帶有時序上界的模型,並說明削弱保證後可成立的條件。這些正面結果依賴新增假設,並未推翻非同步模型下的不可能性。

運作方式 — 具體的機制

物件與執行

客戶端對由分散式節點實作的物件呼叫 read 與 write。即使發生模型允許的通訊故障,正確執行仍須符合指定的安全性與終止性質。

完成一次寫入

客戶端先向一個元件內的節點提交寫入並收到回應,使該寫入在真實時間上早於後續操作。

隔開兩個元件

網路接著遺失把已完成值傳到另一個元件所需的訊息。

在遠端呼叫讀取

客戶端向不知情的元件提交讀取。可用性要求非故障接收者即使收不到訊息,也必須最終回應。

建構兩條不可區分執行

選擇兩條只在已完成寫入值上不同的執行。讀取元件的本地狀態與收到的訊息完全相同,因此兩邊行為必須相同。

導出矛盾

Atomic consistency 要求兩條執行回傳不同結果,但不可區分性迫使行為相同。永遠等待雖可避免答錯,卻會違反可用性。

改變時序模型

論文接著加入部分同步並分析額外時序知識所容許的結果。任何可行組合都以更強假設或削弱某項性質為條件。

論文證明了什麼 — 量測數據與證明

  • 主要結果是非同步網路模型中的形式不可能性證明,而非實驗效能主張。
  • 反例只需要一次已完成寫入、一次較晚讀取,以及遺失將寫入值帶過網路分割的訊息。
  • 對讀取端而言,寫入不同值的兩條執行不可區分;但 atomic consistency 卻要求不同答案。
  • 證明允許實作採取任意內部行為;矛盾來自三項必要性質,而非某個特定協定。
  • 可用性採刻意最低限度的定義——每個非故障節點最終回應——因此違反它不能歸咎於過於嚴格的延遲上界。
  • 論文另行研究部分同步模型,以找出額外時序假設如何改變可行性。

限制與取捨 — 論文自承的,以及後來被發現的

  • 定理針對 read/write object 的 atomic consistency;它不直接刻畫交易、應用不變量或每一種較弱的一致性模型。
  • 可用性只指非故障節點最終回應,未規定實用延遲、錯誤回應或回傳資料的新鮮度。
  • 證明以訊息遺失建模網路分割,並未提供相關性當機、Byzantine 故障或分割癒合後復原的分類。
  • 結果是定性的:它不替系統選設計點、不量測停機機率,也不量化陳舊資料與阻塞操作的商業成本。
  • 部分同步設定中的正面結果仰賴明列的時序與故障假設,不應被解讀為在原始非同步模型中同時滿足三項性質。

它後來變成什麼 — 繼承這個想法的系統

這篇論文把 Brewer 猜想轉化為今日稱為 CAP 的形式化結果。它最持久的貢獻是明確模型與不可區分性證明:網路分割下,linearizable 操作可能必須等待;被要求回應的操作則可能缺少維持 linearizability 所需的資訊。後續系統雖暴露出更細緻的一致性與可用性選項,仍應依本文實際證明的定義與故障模型評估,而不是套用寬鬆的「三選二」口號。

論文原文 — 逐字引用

“It is impossible in the asynchronous network model to implement a read/write data object that guarantees the following properties: Availability and atomic consistency, in all fair executions (including those in which messages are lost).”

定理 1

“In this note, we prove Brewer's conjecture in the asynchronous network model, and then discuss solutions to this dilemma in the partially synchronous model.”

摘要

“When a partition occurs, it is impossible to provide both consistent data and availability.”

§3

術語 — 依本篇論文的用法

Atomic consistency
read/write object 必須看似在 invocation 與 response 之間某一瞬間執行每個操作,且順序符合真實時間的先後。
Availability
非故障節點收到的每個請求最終都必須得到回應,即使執行中發生訊息遺失。
Partition tolerance
即使網路在元件之間任意遺失訊息,實作仍須符合它所宣稱的規格。
Read/write data object
證明使用的簡單複寫抽象:客戶端寫入值並在之後讀值,且操作受 atomic 語意約束。
非同步網路
訊息延遲與行程相對速度沒有已知上界的模型;模型允許訊息延遲或遺失。
不可區分執行
對某節點而言,本地狀態與收到訊息完全相同的執行;即使正確性要求不同結果,該節點仍被迫採取相同行為。
Fair execution
符合模型公平條件的執行;定理 1 要求 availability 與 atomic consistency 在所有 fair execution(包含訊息遺失)中成立。
部分同步模型
對部分處理或通訊設定時序上界的較強模型;論文藉此找出可行的折衷。
網路分割
把節點隔成多個元件的通訊故障,使一個元件產生的資訊可能無法抵達另一個元件。

在時間軸上的位置 — 這篇論文在整段故事中的座標

在時間軸上查看