---
# System prepended metadata

title: '1-1 Perspectives on the CAP Theorem:'
tags: [CAP Theorem]

---

# 1-1 Perspectives on the CAP Theorem:


:::info
**最重要的結論** 
**consistency 資料一致性 availability 可用性 partition tolerate 分割容錯性**
==三者只能取其二，無法同時滿足==
:::
### The CAP Theorem
- CAP的定義:
    - ==**consistency**==: 每個server保證能夠回傳最新的==正確結果==
    - ==**availability**==: 每個request在任何情況下都能最終得到response（但在現實的系統中就算最終能得到結果，但太久才得到response視為不具availability)
    - ==**partition tolerate**==: 當出現分區時（封包延遲或遺失、連接中斷、塞車等），系統能夠繼續執行

CAP therorem可以用一句話來概括: 
In a network subject to communication failures, it is impossible for any web service to implement an atomic read/write shared memory that guarantees a response to every request.

###  Theoretical Context
- #### Consistent, Availability, and Partition-Tolerance

    - ==***safety property***==: nothing bad ever happens，也就是說，任何節點在每個execution後結果都是正確的，==consistency屬於safety==
 
     - ==***liveness property***==:eventually something good happens，也就是說，只要時間夠長，最終一定會有結果，==availability屬於liveness==
     
    從此觀點來看，容易產生分區的系統是不可能在保證safety & liveness的情況下做到atomic地讀/寫暫存器

- #### Agreement is Impossible
   :::info
   Consensus（共識）
   : 系統中每個process $p_{i}$ 有初始值 $v_{i}$，若要有共識有三個必要條件。
   :::
    * ==**agreement**==:最終每個process須輸出相同值，也就是每個節點必須有相同的決定
    * ==**validity**==:每個process輸出值必定為某個process的輸入值，換句話說，最終的共識來自某一節點
    * ==**termination**==:最終一定會有個輸出結果，演算法不會無限的執行下去，能做出最終決定

    很明顯，agreement和validity具safety property，而termination具liveness property，也==因此safety property 和 liveness property必須做出取捨。==
    
    consensus是建立replicated state machine的關鍵，為了提高availability可能多準備幾個複製節點來備份;為了提高consistency，在每次執行時都會進行更新，必須在每次更新達成一致，尤其是更新的順序。
    
    consensus的safety條件比CAP theroem中更加嚴格;在分散的節點atomic的讀/寫記憶體更加難以實現，引用的論文的結論為即使在沒有分區的系統中，consensus仍舊無法達成，部份protocol 聲稱能達成agreement & validity，但是演算法卻無法停止，無法做出最終決定。

- #### Coping with the Safety/Liveness Trade-off for Consensus
    接下來這段主要在探討兩個問題
    :::warning
    1. 若在***足夠不可靠***的分散式系統中無法同時達成safety & liveness，那能達到上述兩個條件的系統可靠程度要多高？大部分人著手於網路的同步性上，i.e.,網路要多可靠才能同時滿足consistency & availability?
    
    2. 既然網路是不可靠的，那consistency的上限在哪裡？
    :::
    :::info
     **Synchrony:**
    若網路滿足三個條件即視為同步
        
        1. 每個process都有個自己的clock, 且每個clock是同步的
        2. 每段訊息在已知且固定的時間傳輸完畢
        3. 每段訊息傳輸速率一致且固定
        
    上述系統是以回合制傳輸的，一回合內能傳輸一些訊息，並接收所有被傳遞的訊息，可能還會做某些local的計算
    :::
    若系統完全同步，在最多${f}$個server故障時，只須${f + 1}$回合就能達成共識，但現實系統不可能完全同步，那現實中要多同步才能解決共識的問題？
    
    因此提出了 ==**部份同步**(**最終同步**)== 概念的系統，也就是說在某段期間可能是不同步的，但沒關係，只要系統穩定的同步運行夠久，最終還是能達成同步，達成共識。近期某些研究證明，此類系統共識保守估計至少需要${f + 2}$回合來達成穩定的同步
    
    此外，在完全同步系統中任何的數量的server故障都能夠解決，在非同步系統只要一個節點失敗共識就不可能達成，部份同步(最終同步)系統，整個系統有${n}$個server，那此系統故障節點==最多只能少於${n / 2}$==，否則無法達成共識
        
     另一種解決方法是 *Failure detectors*，Chandra 和 Toueg 提出並證明failure detector Ω 是解決共識問題的最弱條件，其封裝一個領導者選舉服務，就算某些節點故障了，他也擁有夠多資訊來達成共識，這在實際系統中相當常用，通常稱為 primary/master

:::warning
接著探討第二個問題，若系統中有${f}$個節點故障，那我們能達到consistency的最大程度是多少？
:::
 Chaudhuri 提出 *set agreement*的概念，和*consensus*不同之處在於最後的輸出值可以不同，以一擁有k個節點的集合為例，${k-agreement}$最多有${k}$個不同的輸出值，有較弱的一致性

*consensus*就是 ${1-agreement}$，另一篇論文證明了 ==${k-agreement}$可以能容忍最多${k - 1}$個節點故障，因此*consensus*無法容忍任何節點故障。==

換句話說，==${k - 1}$個節點故障了，${k-agreement}$就是系統consistency能達成的上限了==

### Practical Implications

:::info
既然在容易產生分區的系統中，consistency和availability兩者無法兼得勢必得犧牲一個，我們接著來探討兩者取捨之間的差異。
:::
有趣的是，實際的系統可能會將大系統切分為多個子系統，子系統可能會有不同的取捨方式，甚至兩者無法保證，但仍舊有不俗的表現。

- **Best Effort Availability**
    在網路相當穩定且可靠，不常出現故障，不易產生分區的情形下（e.g.所有節點在同個datacenter)，我們傾向選擇Consistency guarantee、best effort Availability，也就是盡力達成availability但不保證。

    Google的Chubby Lock是個典型的例子，Chubby的每個"Cell"都位於同個datacenter，網路相當穩定不易形成分區，因此提供了strong consistenct、high availability
- **Best Effort Consistency**
    在某些系統中availability是不可割捨的且更需要快速得到response，就算回傳結果未必是最新的也無傷大雅。

    Web Cache系統是個典型的例子，由於網頁的使用者位於全球各地，使用者提出了一個request，鄰近的server cache可以快速回傳response給使用者。若cache更新了，但將所有cache更新需要一些時間，不同使用者可能看到不同的網頁內容，雖然內容有點過時了，但沒關係，因為使用者沒有耐心等候網頁更長的載入時間，因此response速度才是最關鍵的，可犧牲一些consistency。
    
- **Trading Consistency for Availability**
    Consistency和Availability的取捨需要一些精準的調整，舉例來說對某些服務來說一小時前的舊資料是可以接受的，但無法接受一天前的舊資料，或是前一小時的網路狀況很好，因此我們應該提高consistency的程度，另一方面，若存在一個長時間的分區可能無法達到當初設計的consistency程度

    以航班座位預訂系統為例，最初空位比較多，就算consistency程度比較低，資料是過時比較久的也沒問題，但隨著空位越來越少，我們也需要更精準的資料來確定沒有超賣座位，因此需要拉高consistency的標準，這例子就非常需要動態調整consistency的程度。
    
- **Segmenting Consistency and Availability**
    許多系統不只有一個統一的要求，系統的某些部份可能需要strong consistency，另一些可能需要high availability，下面探討一些可能被分割的維度。
    * **Data partitioning**
        : 不同的資料型態可能需要不同程度的consistency and Availability。
        
        以購物平台為例，購物車需要較高的availability以快速回應用戶的requests，偶爾的incosistent是可接受的;商品資訊顯示稍微過時的資訊也沒關係，但是結帳/帳單/購物紀錄需要相當高的cosistent，因為使用者會因為結帳跟當初顯示的資訊不同而生氣。
    * **Operation partitioning**
        : 不同操作可能需要不同程度的consistency and Availability。
        
        舉個簡單的例子，一個資料庫若只進行*讀取*的操作的話，能保證高availability，但在分區存在的時候，對資料進行修改可能沒有回應，就沒有availability可言。
        
        此外，不同類型的update可能需要不同程度的consistency，一個*購買*的操作要guarantee consistency，但在*查詢*的操作，可能回傳過時的資訊。
    * **Functional partitioning**
        : 將service劃分不同的subservice，每個subservice可能有不同的需求。
        
        像前面提及的Chubby在提供coarse-grain locks需要strong consistency，但也有提供另一項服務處理DNS解析，提供相對較弱的consistency但high availability，因此就算是同個服務也可能有不同程度的consistency & availability 的取捨
    * **User partitioning**
        : 網路的分區及性能往往跟實際的地理距離有關，將用戶根據地理位置分群是個明智之舉

        像是Craigslist在美國東西岸都擁有datacenter，Craigslist讓加州的用戶連上西岸的server來得到更高的availability，且連上西岸data center的用戶間，能達到更穩定、更高的consistency，東岸也是如此。

        某些社群網站也是做類似的用戶分群，因為東岸的用戶往往是和東岸的用戶互動，根據地理距離能更容易達到更好的表現。
    * **Hierarchical partitioning**
        :  某些系統可能會具有階層的組織，可以根據階層來分割
        
        最上層的組織可能是包含全球的資料庫，往下層可能是根據地區分割成更小的資料庫，在不同階層提供不同的consistency & availability
        
### The CAP Theorem in Future Systems
- Scalability
    : 如果一個系统能輕鬆的增大規模、有效率地利用新資源以處理loading 就具Scalability

    因此strongly consistency也會隨著系統規模變大變得更難以達成
- Tolerating attacks
    : CAP theorem關注的是網路分區，也就是某些Server間可能無法可靠的溝通。
    
    但隨著網路攻擊越來越頻繁，越來越難以忽略，像是每天可能都會有DDOS等攻擊，若系統要考慮這些情況，我們無法簡單將其視為分區來處理，而需要更多的思考理解。

- Mobile wireless networks
    : CAP Theorem 起初是針對WAN所提出的
    
    時至今日，越來越多的網路流量來自行動裝置，有許多情況的取捨跟之前相同，也有許多需要難以解決需要重新提出解決方案的情境，因為行動網路的特性相當不同，常常發生封包遺失相當頻繁且延遲劇烈變化，根據應用程式可能還要考慮行動裝置的地理位置。