Quorum一致性協議
一個分布式數據庫系統中通常是一系列密切關聯的操作組成完整的系統. 分布式系統最基本的要保證一致性, 分區性通常是無法避免的, 在這種情況下盡力通過軟件協議做到最大可用性. 根據CAP理論知道三者往往不可以兼得, 只能取其二.
回憶下CAP理論
-
C
Consistency: 保證返回客戶端最新的一致性數據
-
A
Availablility: 任何一個沒有發生故障的節點必須在有限的時間內返回結果
-
P
Paritition Tolerance: 網絡分區發生時系統依然可以提供服務
也既是在分布式系統中CP的情況下, 如何通過軟件/協議邏輯控制盡可能的滿足A
在這里很重要的一點就是C協議, 怎么樣做到分布式系統中所有的節點都同意就某一個值性能更新?
2PC/3PC/Paxos...都是來解決這個問題的方案, 甚至Google Chubby的作者Mike Burrows說過這個世界上只有一種一致性算法, 那就是Paxos, 其它的算法都是殘次品.
不過今天暫且不討論Paxos, 來看看Quorum一致性協議是怎么做的.
基本的Quorum協議要求所有參與者應用一項決議前必須先同意. 假如一個分布式的DB系統, 有兩個節點A和B, 數據在A和B之前完成復制, 任何一個節點的數據變更都會在一定的時間內同步到另外的節點. 客戶端無需感知底層的DB系統是否是分布式的, 它所要關系的是無論連接到哪一個節點, 都應該讀取到相同的數據(同一狀態).
DB系統主要由兩類操作: write/update 和 read
R表示Quorum中read節點的數量
W表示Quorum中writes/updates節點的數量
N表示系統中的節點數量
如果R=1, W=1, 也就是R+W=N=2, 客戶端在A節點進行寫入, 從B節點完成讀取, 這種情況下客戶端可能無法得到一致性的數據;
如果R=2, W=1, 也就是R+W>N, 客戶端可以在任意的A或者B節點進行寫入, 但是客戶端需要同時讀取節點A和B的數據, 這種情況是可以保證客戶端得到最新的數據狀態, 這也就是一些NOSQL DB通常說的雙讀(read repair);
如果W=2, R=1, 也就是R+W>N, 顯而易見這種情況下客戶端同時寫入節點A和B, 讀取任意一份數據即可滿足一致性結果要求.
R+W>N, 這就是Quorum一致性協議.