分散式資料一致性理解
點選藍色“ 喬志勇筆記 ”關注我喲
加個“ 星標 ”,第一時間獲取推送的文章哦!
一、基本概念:
1、關聯資料之間的邏輯關係是否正確 (資料約束一致). 理解為垂直方向的冗餘
2、由於資料的複製,不同資料節點中的資料內容是否完整並且相同(資料副本一致) ,理解為水平方向的冗餘
二、一致性模型
一致性模型主要可以分為兩類:
能夠保證所有程序對資料的讀寫順序都保持一致的一致性模型稱為 強一致性模型 ,
而不能保證的一致性模型稱為 弱一致性模型
(1)強一致性模型
1、線性一致性(Linearizable Consistency)
cap中的一致性指的就是線性一致性,目前而言線性一致性是無法實現的,做的最好就是Google的Spanner
2、順序一致性(Sequential Consistency)
(2)弱一致性模型
1、因果一致性(Causal Consistency)
2、最終一致性(Eventual Consistency)
base 理論中的E就是最終一致
3、以客戶端為中心的一致性(Client-centric Consistency)
以客戶端為中心的一致性包含了四種子模型:
-
單調讀一致性(Monotonic-read Consistency):如果一個程序讀取資料項 x 的值,那麼該程序對於 x 後續的所有讀操作要麼讀取到第一次讀取的值要麼讀取到更新的值。即保證客戶端不會讀取到舊值。
-
單調寫一致性(Monotonic-write Consistency):一個程序對資料項 x 的寫操作必須在該程序對 x 執行任何後續寫操作之前完成。即保證客戶端的寫操作是序列的。
-
讀寫一致性(Read-your-writes Consistency):一個程序對資料項 x 執行一次寫操作的結果總是會被該程序對 x 執行的後續讀操作看見。即保證客戶端能讀到自己最新寫入的值。
-
寫讀一致性(Writes-follow-reads Consistency):同一個程序對資料項 x 執行的讀操作之後的寫操作,保證發生在與 x 讀取值相同或比之更新的值上。即保證客戶端對一個數據項的寫操作是基於該客戶端最新讀取的值。
三、共識演算法(水平問題)
一致性問題是結果,共識是為達到這個結果所要經過的過程,或者說一種手段。
-
拜占庭錯誤。表示通過偽造資訊進行惡意響應產生的錯誤。
-
非拜占庭錯誤。沒有進行響應產生的錯誤
解決「 拜占庭錯誤 」的稱作Byzantine Fault Tolerance(BFT)類演算法,解決「 非拜占庭錯誤 」的稱作Crash Fault Tolerance(CFT)類演算法
(1)BFT型別演算法
BFT型別演算法又有2個分支。「 基於確定性的 」和「 基於概率的 」。
先聊聊「基於確定性的」,此類演算法表示一旦對某個結果達成共識就不可逆轉,即共識是最終結果。它的代表作是PBFT(Practical Byzantine Fault Tolerance)演算法
再聊聊「基於概率的」,此類演算法的共識結果則是臨時的,隨著時間推移或某種強化,共識結果被推翻的概率越來越小,成為事實上的最終結果。它的代表作是PoW(Proof of Work)演算法
(2)CFT類演算法
CFT類演算法解決的是分散式系統中存在故障,但不存在惡意節點的場景(即可能訊息丟失或重複,但無錯誤訊息)下的共識達成問題
「Paxos」演算法
Raft演算法
Zookeeper裡的「ZAB」(ZooKeeper Atomic Broadcast)演算法也是CFT類演算法,是以Fast Paxos演算法為基礎實現的
四、分散式事務(垂直問題)
分散式系統的事務,不得不提到被廣為流傳的兩個理論:「 CAP 」、「 BASE 」。
(1)「CAP」為基礎解決方案
1、兩階段提交(2PC)[5]
2、三階段提交(3PC)[6]
3、TCC
注意冪等性
(2) 「BASE」理論為基礎的解決方案
1、非同步訊息——本地訊息表
2、非同步訊息——不支援事務的MQ
3、非同步訊息——支援事務的MQ
目前唯一支援事務的MQ框架是RockerMQ
4、Saga
必須要額外確保 執行了「回滾」之後再接收到「正向請求」,等於“請求無效”的效果
5、Gossip協議
參考文章: 分散式系統:一致性模型
最終一致性的實現方式
近期文章:
如果你喜歡本文
請長按二維碼,關注 喬志勇筆記