分散式系統中的一個重要議題是資料的複製(replication)。複製資料通常出於兩個目的:提升可靠性或改善效能。而複製帶來的主要難題是如何維持副本(replica)之間的一致性——直觀地說,當某一份拷貝被更新時,必須確保其他拷貝也跟著更新,否則副本之間就會出現差異。
本章依序探討「複製資料的一致性到底是什麼意思」以及「達成一致性的各種方式」:
- 先從總體介紹出發,說明複製為何有用、它與可擴展性(scalability)的關係。
- 接著聚焦一致性的精確意涵。一類重要的**一致性模型(consistency model)**假設多個行程(process)同時存取共享資料,一致性即以「行程在讀寫共享資料時可以期待什麼」來定義。
- 資料為中心的一致性模型在大規模分散式系統中往往難以有效率地實作,許多情境其實可以採用更簡單、也更容易實作的模型——其中一類就是客戶端為中心的一致性模型(client-centric consistency model),只從單一(可能會移動的)客戶端視角看一致性。
- 一致性只是故事的一半,還得考慮它如何被實作。這裡有兩個大致獨立的議題:其一是副本管理,包含副本伺服器的放置與內容的散布;其二是一致性協定(consistency protocol),即副本如何被保持一致。多數應用需要較強的一致性(更新要或多或少立即傳播到各副本),本章討論其各種實作選項,也涵蓋作為特例的快取(caching)協定。
本章重點#
- 複製資料的兩大理由:可靠性與效能;代價是引入一致性問題,而維持一致性可能嚴重拖累效能,唯一的出路往往是適度放鬆一致性。
- 連續一致性(continuous consistency):以數值偏差、過時(staleness)偏差、操作排序偏差三個軸來為不一致性設界限。
- 操作的一致排序:循序一致性(sequential consistency)提供並行程式設計者所期待的語意——所有人以相同順序看到所有寫入;因果一致性(causal consistency)則只要求有依賴關係的操作依其依賴順序執行。
- 更弱的模型以同步變數(如鎖)「框住」一連串讀寫操作,雖需程式設計者明確配合,但通常比純循序一致性更容易有效率地實作。
- 客戶端為中心的一致性:不考慮資料被多人共享,只保證單一客戶端換連到新副本時,該副本會先補上這個客戶端先前操作過的資料。
- 更新傳播的三個抉擇:傳播什麼(通知、狀態或操作)、傳到哪裡、由誰發動(推送或拉取)。
- 一致性協定:主要副本式(primary-based)協定把所有更新導向主要拷貝以取得全域排序;複製寫入式(replicated-write)協定把更新同時送往多個副本,排序因此更困難。