當跨主機或跨機房的網路連線中斷時,節點之間被切分為無法互通的孤島,這稱為網路分割(Network Partition)。 在分割期間,任何分散式系統都無法在保持完全線性的同時,承諾所有健康節點都能成功回應請求。
本文接續 Quorum 與衝突修復,為第二階段「多份狀態能承諾什麼」劃下邊界總結,並為後續引出共識與不可能性邊界的必要性。
查證日期:2026-11-04。CAP 證明與定義參考 Gilbert 與 Lynch(2012)原作者回顧論文;PACELC 模型參考 Abadi(2012)。未執行實體網路斷線實驗,文中推演均為概念例子。
什麼是網路分割
在理想模型中,網路只是有延遲的傳輸管線。但在實體世界中,交換器故障、光纖被施工挖斷、雲端跨區連線中斷、防火牆規則誤設,或是單一主機陷入數十秒的作業系統凍結,都會造成:
- 節點群被分割為兩組或多組各自內部可通訊、但群與群之間完全斷絕聯絡的孤島。
- 在各個孤島內部,主機硬體與應用程式本身依然處於完全健康、無崩潰(non-failing)的狀態。
網路分割不是軟體工程師可以透過程式碼消除的假象,而是分散式實體世界必須面對的物理事實。
CAP 定理的一手精確定義
CAP 定理由 Eric Brewer 於 2000 年提出猜想,後由 Seth Gilbert 與 Nancy Lynch 於 2002 年給予形式證明,並於 2012 年發表回顧。 理解 CAP 的第一步,是必須採用形式證明的一手嚴格定義,而非民間泛化的口號:
- 一致性(Consistency, C):
- 論文明確定義此處的 C 是原子一致性/線性一致性(Linearizability)。
- 所有讀寫操作表現得如同在單一無副本的原子暫存器上瞬間生效;一旦寫入完成,後續任何讀取必須看見該寫入或更新的數值。
- 重要防護:這不是關聯式資料庫 ACID 中的 C(不變式完整性),也不是最終一致性。
- 可用性(Availability, A):
- 論文嚴格定義為:每一個向未崩潰節點發出的非失敗請求,都必須獲得一個非錯誤的成功回應(non-error response)。
- 重要防護:這不是雲端服務 SLA 宣稱的「99.99% 可用性」,也沒有規定 50 毫秒以內等延遲門檻;但它嚴格禁止系統直接回傳「伺服器內部錯誤(500/503)」或無限期掛起(hang)。
- 分區容錯性(Partition Tolerance, P):
- 系統在網路任意遺失訊息或發生分割時,依然能持續維持其定義的性質。
參考 Gilbert & Lynch(2012):Perspectives on the CAP Theorem。
分割發生時的殘酷抉擇:CP vs AP
為什麼當網路發生分割時,線性一致性(C)與可用性(A)不可兼得?
假設系統有兩個副本節點:節點 $G_1$ 位於分區 A,節點 $G_2$ 位於分區 B。兩節點之間的網路斷開,無法互相通訊:
[ Client 1 ] [ Client 2 ]
| |
v v
[ 節點 G1 (分區 A) ] <- X -> [ 節點 G2 (分區 B) ]
(健康無崩潰) (健康無崩潰)
- Client 1 向節點 $G_1$ 送出寫入請求,將文章匯出狀態由
PENDING更新為RUNNING。 - 由於跨分區網路斷開,$G_1$ 無法將該更新即時同步給 $G_2$。
- 此時,Client 2 緊接著向節點 $G_2$ 送出讀取請求:
- 若選擇保證可用性(AP, Availability):
- 根據定義,未崩潰的 $G_2$ 必須成功回應 Client 2,不能回傳錯誤或等待網路恢復。
- 由於 $G_2$ 尚未收到 $G_1$ 的同步,它只能將本地現有的舊狀態
PENDING回覆給 Client 2。 - 結果:Client 1 已經完成的寫入,Client 2 卻讀到了舊值,直接破壞了線性一致性(C 違約)。
- 若選擇保證線性一致性(CP, Consistency):
- 為了防止 Client 2 讀到陳舊狀態違背線性契約,$G_2$ 必須拒絕回傳舊資料,它只能回傳「無法處理(503)」或拒絕連線;或者 $G_1$ 當初在無法同步給 $G_2$ 時就直接拒絕 Client 1 的寫入。
- 結果:健康的節點回傳了錯誤或拒絕服務,直接破壞了可用性定義(A 違約)。
這證明了在網路可被分割的現實世界中,一旦分割發生,系統必然要在 CP 與 AP 之間擇一立足。
迷思澄清:「三選二」的誤導與 PACELC 模型
業界最常見的口號是「CAP 定理告訴我們三者只能選二」。這種說法是危險的誤導:
- P(Partition)不是一種功能選項:架構師無法「選擇不要 P」,因為沒有任何軟體架構能命令實體光纖永遠不斷、路由器永不故障。
- 平時沒有分割時,不需要犧牲可用性:當網路正常運作時,系統可以同時擁有線性一致性與高可用性。
為了解釋平時與故障時的完整取捨,Daniel Abadi 於 2012 年提出了 PACELC 模型:
If Partition (P):
Trade off: Availability (A) versus Consistency (C)
Else (E):
Trade off: Latency (L) versus Consistency (C)
- 若發生網路分割(If Partition):系統必須在可用性(A)與一致性(C)之間權衡。
- 否則正常運作時(Else):系統必須在延遲(Latency, L)與一致性(Consistency, C)之間權衡。例如:為了在正常時維持強一致,每次寫入依然必須付出等待跨節點確認的網路延遲往返代價(PC/EC);若追求極致低延遲,則允許在正常時以非同步背景複寫承接讀取(PA/EL)。
貫穿案例:文章匯出服務的分割策略
面對網路分割,文章匯出服務應如何設計其邊界?
- 若採 CP 策略(如配額扣除與支付確認):
- 當節點無法與多數派節點取得通訊時,直接回報
503 Service Unavailable,拒絕建立匯出工作。 - 代價:部分使用者在分割期間無法操作;
- 收益:絕對防止系統在分區兩側發行重複的工作編號,也防止發生超出配額的幽靈扣款。
- 當節點無法與多數派節點取得通訊時,直接回報
- 若採 AP 策略(如文章點閱統計與快取呈現):
- 兩側節點在斷網期間各自允許客戶端讀寫,回傳本地最新可得數據。
- 代價:使用者在重新整理時可能看到不一致的計數;
- 收益:服務持續對外保持響應,不中斷讀者的閱讀體驗。
第二階段總結與出口
至此,我們完成了第二階段的四篇核心架構:
- 05 一致性模型:建立了以操作區間為尺度的客觀合約(Linearizability vs Causal vs Eventual)。
- 06 複寫與切換:揭露了單主架構在切換時的遺失寫入與裂腦威脅。
- 07 Quorum 修復:證明了單靠 $W + R > N$ 無法自動帶來強一致,並引出版本向量與背景修復。
- 08 網路分割與 CAP:劃定了實體斷網下 CP 與 AP 的物理邊界。
這四篇向我們揭示了一個殘酷的事實:單純的多副本與多數派交集,無法自動解決誰有權決定狀態、誰是合法領導者的問題。
為了在不穩定的網路與隨機崩潰的世界中,讓整個叢集對「唯一的日誌順序」達成安全且無爭議的共同決定,第三階段將正式進入分散式系統的核心心臟:共識、安全性與不可能性邊界(見分散式系統知識索引)。