搜尋文件

輸入關鍵字,搜尋標題與正文。

    分散式系統文件 08/08

    網路分割與 CAP 的適用邊界

    本文提要

    當跨主機或跨機房的網路連線中斷時,節點之間被切分為無法互通的孤島,這稱為網路分割(Network Partition)。 在分割期間,任何分散式系統都無法在保持完全線性的同時,承諾所有健康節點都能成功回應請求。

    18px · 寬鬆行距

    閱讀設定

    排版預覽 · 示範文字(可捲動)

    檔案與目錄

    Linux 以一棵從根目錄 / 開始的樹狀結構組織檔案。目錄用來整理檔案,也可以包含其他目錄。

    pwd
    ls -la /home
    18px

    16、18、20、22px;隨瀏覽器文字大小縮放。

    欄寬套用於背景文章;此處預覽字級與行距。手機正文自動配合螢幕。

    文件與本文目錄
    本主題文件

    當跨主機或跨機房的網路連線中斷時,節點之間被切分為無法互通的孤島,這稱為網路分割(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 的第一步,是必須採用形式證明的一手嚴格定義,而非民間泛化的口號:

    1. 一致性(Consistency, C):
      • 論文明確定義此處的 C 是原子一致性/線性一致性(Linearizability)。
      • 所有讀寫操作表現得如同在單一無副本的原子暫存器上瞬間生效;一旦寫入完成,後續任何讀取必須看見該寫入或更新的數值。
      • 重要防護:這不是關聯式資料庫 ACID 中的 C(不變式完整性),也不是最終一致性。
    2. 可用性(Availability, A):
      • 論文嚴格定義為:每一個向未崩潰節點發出的非失敗請求,都必須獲得一個非錯誤的成功回應(non-error response)。
      • 重要防護:這不是雲端服務 SLA 宣稱的「99.99% 可用性」,也沒有規定 50 毫秒以內等延遲門檻;但它嚴格禁止系統直接回傳「伺服器內部錯誤(500/503)」或無限期掛起(hang)。
    3. 分區容錯性(Partition Tolerance, P):
      • 系統在網路任意遺失訊息或發生分割時,依然能持續維持其定義的性質。

    參考 Gilbert & Lynch(2012):Perspectives on the CAP Theorem。

    分割發生時的殘酷抉擇:CP vs AP

    為什麼當網路發生分割時,線性一致性(C)與可用性(A)不可兼得?

    假設系統有兩個副本節點:節點 $G_1$ 位於分區 A,節點 $G_2$ 位於分區 B。兩節點之間的網路斷開,無法互相通訊:

    TEXT
    [ Client 1 ]                   [ Client 2 ]
          |                              |
          v                              v
    [ 節點 G1 (分區 A) ]  <- X ->  [ 節點 G2 (分區 B) ]
       (健康無崩潰)                  (健康無崩潰)
    
    1. Client 1 向節點 $G_1$ 送出寫入請求,將文章匯出狀態由 PENDING 更新為 RUNNING。
    2. 由於跨分區網路斷開,$G_1$ 無法將該更新即時同步給 $G_2$。
    3. 此時,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 模型:

    TEXT
    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)。

    貫穿案例:文章匯出服務的分割策略

    面對網路分割,文章匯出服務應如何設計其邊界?

    1. 若採 CP 策略(如配額扣除與支付確認):
      • 當節點無法與多數派節點取得通訊時,直接回報 503 Service Unavailable,拒絕建立匯出工作。
      • 代價:部分使用者在分割期間無法操作;
      • 收益:絕對防止系統在分區兩側發行重複的工作編號,也防止發生超出配額的幽靈扣款。
    2. 若採 AP 策略(如文章點閱統計與快取呈現):
      • 兩側節點在斷網期間各自允許客戶端讀寫,回傳本地最新可得數據。
      • 代價:使用者在重新整理時可能看到不一致的計數;
      • 收益:服務持續對外保持響應,不中斷讀者的閱讀體驗。

    第二階段總結與出口

    至此,我們完成了第二階段的四篇核心架構:

    1. 05 一致性模型:建立了以操作區間為尺度的客觀合約(Linearizability vs Causal vs Eventual)。
    2. 06 複寫與切換:揭露了單主架構在切換時的遺失寫入與裂腦威脅。
    3. 07 Quorum 修復:證明了單靠 $W + R > N$ 無法自動帶來強一致,並引出版本向量與背景修復。
    4. 08 網路分割與 CAP:劃定了實體斷網下 CP 與 AP 的物理邊界。

    這四篇向我們揭示了一個殘酷的事實:單純的多副本與多數派交集,無法自動解決誰有權決定狀態、誰是合法領導者的問題。

    為了在不穩定的網路與隨機崩潰的世界中,讓整個叢集對「唯一的日誌順序」達成安全且無爭議的共同決定,第三階段將正式進入分散式系統的核心心臟:共識、安全性與不可能性邊界(見分散式系統知識索引)。