---
# System prepended metadata

title: '2-3: Managing Update Conflicts in Bayou, a Weakly Connected Replicated Storage System'

---

# 2-3: Managing Update Conflicts in Bayou, a Weakly Connected Replicated Storage System

## 名詞定義

* Bayou(系統)是指這篇論文提出的輕量級分散式檔案儲存系統。
* Application(應用程式)是使用Bayou這個系統來存儲資料的程式，也是會直接與Bayou系統互動的client。
* User(使用者)是使用application提供的功能的人。
* 三者的關係大概是這樣，箭頭代表使用的意思:
    $$User \rightarrow Appication \rightarrow Bayou$$
* Server是指Bayou系統中存儲資料與做運算的node。

## Abstract

Bayou是一個強調高可用性的輕量級分散式檔案儲存系統。

特點: 
* 可以運行在運算能力較為不足的硬體上(例如: laptop、PDAs)、或運行在網路較差的環境。
* 使用write log (update operation) 作為修改的依據，**如果每個server的log都一致，那就可以保證每個server在檔案系統上的檔案會一致**。
* 當網路不通時，Bayou可以**直接寫在client上**。當網路恢復時再與server同步各自擁有的log。這保證了**Bayou的高可用性**。
* Bayou有能力去偵測各個server log的conflict，並利用**使用者自訂的mergeproc去解決conflict**，使各個server的log保持一致。
* 當使用者自訂的mergeproc失敗時，可以將該conflict mark起來，將來系統管理員可以手動的解決該conflict。
* Bayou只保證**eventual consistency**。
* 為了保持server間的log一致，Bayou針對log提供兩個操作。
    * undo某條log上的operation。
    * redo某條log上的operation。
* 當server A傳遞write operations給server B時，server B會先undo write log直到該write operations的第一個write operation，再redo整個writer operations，這樣就可以保證一致性。

## 1. Introduction

* Bayou設計的運行環境
    * client有時可能會與server斷聯。
    * client的頻寬很小。
    * 所有server可能永遠不會同時連接。
* 為了保證高可用性，Bayou系統有以下幾個特點:
    * 不使用quorum or lock去保證consistency。
    * 資料隨時都可以讀，包含在資料因為自動merge失敗而在等待管理員解決時與系統正在解決conflict時，但系統會回傳該資料當下的狀態。
    * 系統有可能會回傳過時或與其他node不同步的資料給使用者。
* 系統將處理過時資料的責任delegate給應用程式，且應用程式必須提供偵測conflict與mergeproc的方式，讓應用程式可以根據應用情境去設計這兩個function。
* Contributions:
    * 提供一個general的框架給使用者自定義conflict detection與mergeproc。
    * 提供一個方法去管理log。使其符合eventual consistency。
        * 對於每條log定義了兩個state，分別是tentative與committed，前者代表可能因為conflict被覆蓋的log，後者則相反。
    * 證明各個replica一定最終一定會相同(eventual consistency)
    * 探討系統的security。

## 2. Bayou Applications
:::info
***這邊只是在說明應用情境，應該可以跳過***
:::
:::spoiler
說明Bayou適合運用在多人協作且非即時性的系統，以下提出了兩個例子。
* Meeting room scheduler
    * 使用者可以在Bayou中的某一台機器上針對同一個meet預訂多個會議時間，這個操作會被本地機器當成一個tentative update operation，之後會與其他機器交流並決定該條update operation是要被commit還是取消。
    * 使用者可以在Bayou中的某一台機器讀到目前全部會議的schedule，但其中過時的資料會被mark起來，代表其是有可能會變動的，而已經commit的預訂則是不會再被改變的。
* Bibliographic database
    * 使用者可以在Bayou中的某一台機器上針對論文查詢，查詢到的論文可能不是最新的版本。
    * 使用者可以在Bayou中的某一台機器增加新的論文或修改原有的論文，這個操作會被當成一個tentative update operation。
    * 每篇論文會被assign一個unique id，但因為concurrent write的關係，有可能不同的兩篇論文擁有同一個unique id，系統會再產生另一個unique id賦予給其中一篇論文，令這兩篇論文都有unique id。
    * 因為concurrent write，也有可能發生同樣的論文在兩個不同的機器被寫入，而有了兩個不同的unique id，則系統會將重複的論文自動刪除。
:::

## 3. Bayou’s Basic System Model
![image](https://hackmd.io/_uploads/rybcco4Ca.png)
在Bayou系統裡，有兩種角色:
* server:
    * 負責**儲存資料與處理client請求**的角色
    * 本身含有兩個API，**Read與Write**，開放給client使用。
    * **與client通信的API以RPC的方式為主**。
    * 與其他server交換資訊時是採用anti-entropy的方式通訊。
    :::info
    anti-entropy其實就是點對點的通訊，而不是像傳統網路中使用broadcast來通訊。作者有說明根據某一個理論，就算是使用anti-entropy通訊，最終system上的所有server也會趨於同步。但使用anti-entropy通訊最後達到convergence的速度被很多個因素所影響，例如發送request的頻率、選擇要發送給哪個server的演算法，但作者說因為這些主要取決於使用Bayou的應用程式的scenario，所以這篇論文不討論。
    :::
* client:
    * 負責發送請求的角色。
    * client會將server提供的API包裝成stub程式，利用stub程式傳送API request。
    * 在傳送write reqeust時會夾帶額外的資訊，像是conflict detection的方式與mergeproc。且會有一個unique的write id。
    * client可以任意更換與自己連接的server(手機漫遊可能有這個需求)，Bayou會使用session去確保使用者看到inconsistent data的機率降低。

## 4. Conflict Detection and Resolution

### 4.1 Accommodating application semantics

* 為何需要應用程式自己去定義conflict detection與mergeproc?
    * 答: 因為對於不同的應用程式對於conflict的粒度有所不同。
    * 以Bayou Applications中的第一個例子 Meeting room scheduler來解釋的話:
        * 粒度過大: 規定在file層面會conflict，那會很常conflict，這代表兩個不同的operation對於同一個檔案的replica修改就算conflict。
        * 粒度過小: 規定在record層面會conflict，也就是兩個不同的operation永遠不會conflict，因為他們必定屬於兩個不同的record。
        * 因此粒度的選擇應該由應用程式自訂，以這個例子來說，conflict的定義應該是現在系統中有沒有兩個不同的meeting預定在同個時間且同一個會議室。

* 系統讓應用程式可以自訂兩個操作，***dependency checks(conflict detection) and merge procedures(mergeproc)***。write operation的流程如下
    * ![image](https://hackmd.io/_uploads/B15fXTNCp.png)

### 4.2 Dependency checks

* 系統透過conflict detection的function可以去偵測讀寫衝突與寫寫衝突。

### 4.3 Merge procedures

* 在發生衝突時，server會call mergeproc來自動解決衝突。
* 當mergeproc失敗時，server會將失敗的merge儲存進log，並等待人工解決conflict。

## 5. Replica Consistency

* 要確保server會符合eventual consistency，需要滿足以下兩個條件:
  * server上的log最終會一樣。
  * 所有write operation的操作必須是deterministic，也就是write operation不具有隨機性。
* server上的write operation的格式，包含timestamp(由系統的real time clock與logical clock產生)，以及一個unique的write ID。
$$<timestamp, ID\ of\ server\ that\ assigned\ it>$$
* server上的log最頂層會是committed的write，再來則是tentative的write，兩者皆按照timestamp排序。
* 所有server必須要被指定相同大小的CPU運算資源與相同大小的Memory，因為如果硬體資源不同的話，可能會造成有些write operation在某些server成功，在某些server卻失敗。

## 6. Write Stability and Commitment
* 對於一個write operation在某一個server上何時能被稱作穩定?
   在該server上，timestamp小於該write operation的操作都被寫入了，那這個write operation本身就能被稱作穩定。
* Bayou提交方式:
  * 選出一個primary server去提交它。
  * 對於負責提交該data的primary server，所有針對該data的write operation一旦經由anti-entropy傳到該server，經過排序後就會被提交，也就是從tentaive轉換成committed。提交後再經由anti-entropy傳到與之相連的其他server。
  * 並不能保證write operation的提交順序和時間順序一致，舉例來說:
  
    > * A更新<-,10,A>W1，B更新<-,20,B>W2，主节点为C，正常下应该：W1,W2
    > * A由于一直断线，C先看到B，W2=<5,20,B>，并将其提交
    > * A终于上限，C看到A，W1=<6,10,A>，并将其提交
    > * 此时顺序变为W2,W1

* 這個方式的優勢是就算primary server暫時不可用，也不影響讀寫操作。因為在這期間的操作會變成tentative並存在其他server上，等到primary server恢復時，還是可以將那些操作轉變為committed。

## 7. Storage System Implementation Issues

* Bayou使用的存儲系統應該要提供以下幾種操作:
  * 有效率的寫入log。
  * 有效率的undo/redo write operation。
  * 要可以有效率的展現log中的full view(包含tentative與committed的操作)、committed view(只包含committed的操作)。
  * 支援server之間的anti-entropy通訊。
* 系統架構圖:
![image](https://hackmd.io/_uploads/ryK5-FI0a.png)
* 在這圖中:
  * Memory
    * Tuple Store可以當成是一個SQL的資料庫，裡面存儲著實際上被寫入的那些資料，每個data有額外附加2個bit，代表該資料目前在哪個view中。
      * 01：只存在full view中。
      * 10：存在于commit view，也存在于full view中。
      * 11：存在于Stable Storage中（被checkpoint了）。
    :::info
    Tuple Store有分為在memory裡的部分與在stable storage裡的部分，前者是有被apply tentative write operation的狀態，後者則是作為checkpoint的作用，用來在server故障時恢復資料。
    :::
    * Undo Log裡面紀錄了tentative write operation如果要撤銷的話需要執行的操作。
    * 在記憶體中的write log保存了所有的tentative write operation與部分的committed write operation。
    * C向量紀錄在Write Log中執行最後一個commited write operation後的timestamp，F向量紀錄在Write Log中執行最後一個tentative write operation後的timestamp，這兩個向量的作用是在進行anti-entropy通訊時保證相同的write operation不會被重複執行。
  * Stable Storage
    * 在Stable Storage中的write log保存了已經穩定的committed write operation。
    * O向量紀錄了server最近被丟棄的write operation的timestamp，這裡的丟棄是指在Memory的write log中被轉移到Stable Storage的操作。這個向量的功能與上面兩個向量一致。
* 當server接收到write operation的pseudo code
![image](https://hackmd.io/_uploads/ByUG9Y80p.png)

## 8. Access Control

> 以一个data collection为粒度，并通过非对称加密，实现访问控制和相互认证。
Bayou使用3种认证来授予、委托和收回data collection的访问权：
> * AC[PU,P,D]：授予用户权限P（如read, write, server）于data collectionD，PU为用户的公钥
> * D[PU,C,PY]：将公钥为PY的用户下的证书C委托给另一个公钥为PU的用户
> * R[C,PY]：收回公钥为PY的用户下的证书C

* 在一個client發出一個write operation給某一個server時，該server會驗證client的證書且確認該client是否有權限去更改該data。在該write operation被傳送給該data所屬的primary server時，primary server在要commit該write operation時會在檢查一次該client是否有權限做這件事。

## 9. Status and Experience

![image](https://hackmd.io/_uploads/BJ_QpSuAa.png)
![image](https://hackmd.io/_uploads/rk74THO0p.png)
![image](https://hackmd.io/_uploads/SksNTBOCa.png)


## 10. Conclusions

Bayou是一個針對移動應用程序的存儲基礎設施，僅依賴於弱連接性的假設。為了應對任意的網絡分區，該系統建立在點對點的客戶端-服務器和服務器-服務器通信基礎上。為了提供高可用性，Bayou採用弱一致性複製，使客戶能夠連接到任何可用的服務器進行讀取和寫入操作。支持自動衝突檢測和解決使應用程序能夠有效處理並發更新。該系統通過確保所有更新最終傳播到所有服務器，使服務器按照全局順序執行更新，並確保所有服務器以一致的方式解決任何更新衝突，從而保證最終一致性。

## Reference:
https://www.cs.utexas.edu/~lorenzo/corsi/cs380d/papers/p172-terry.pdf
https://keys961.github.io/2019/04/30/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB-Bayou/



