- 分布式數據庫原理、架構與實踐
- 李海翔
- 1634字
- 2021-10-20 15:26:06
2.2 結果一致性
在分布式對等網絡中,存在需要就某個問題達成一致的情況,問題可能是多種多樣的,但最終目標是在整個系統內就最終結果取得一致,本書稱這類問題為“結果一致性”。
拜占庭將軍問題描述的是某些成員節點(單計算機系統)或網絡鏈路(通信系統)出現錯誤,甚至被蓄意破壞者控制的情況。分布式系統需要采取某種行動解決此類問題,而采取何種行動,其過程就需要通過某種規則/協議進行規范。在規則/協議的規范下,取得系統范圍內的一致共識,即達成結果一致,這就是共識問題,即結果一致性問題。但需要注意的是,達成共識未必是拜占庭將軍問題所獨有的,拜占庭將軍問題中的達成共識屬于節點間無信任關系的共識問題,而節點間存在信任關系時也有需要達成共識。
2.2.1 共識問題形象化描述:拜占庭將軍問題
著名的拜占庭將軍問題是被Lamport在參考文獻[86]中用來描述結果一致性的一個故事。這個問題本質上是分布式對等網絡通信容錯問題,即客觀上保證多節點對通信結果達成一致。更廣泛的理解是,拜占庭將軍問題是一個如何讓分布式系統的所有節點保持共識和在特定條件下保持正確性的問題。其故事背景如下。
拜占庭位于現在土耳其的伊斯坦布爾,是東羅馬帝國的首都。當時的拜占庭羅馬帝國國土遼闊,擁有多支軍隊(分布式系統),每支軍隊分別由一位將軍帶領。因為軍隊駐地間相距很遠,故將軍與將軍(每位將軍都是一個單獨的節點)之間只能靠信差傳消息。
發生戰爭的時候,所有將軍必需達成共識(目的:保證所有節點間對最終發出的數據/消息或做出的決定保持一致),以決定是否去攻打敵人的陣營。但是,這些將軍中可能有叛徒和敵軍間諜,這些叛徒會擾亂或左右決策的過程(多個節點之間的消息傳遞不可靠,這是分布式系統的典型特征,需要在設計算法時特別考慮)。
現實情況:在已知有叛徒(部分節點不可靠,傳遞的消息可能會延遲發送、多次發送或丟失、被篡改[1]。但分布式系統的一致性協議,如Paxos、Raft等,不考慮被篡改的可能,只考慮消息丟失的情況,這是因為Lamport先生在(參考文獻[162])中對問題進行了限定,算法保證了消息一定不可被篡改)的情況下,忠誠的將軍在不受叛徒影響(只有大部分節點可靠整個分布式系統才可靠,但不知道哪些節點可靠)的情況下如何達成一致的協議,就是拜占庭將軍問題。
參考文獻[86]證明,當錯誤節點個數不超過總節點個數的1/3時(n>=3m+1,n表示總節點個數,m表示容忍的錯誤節點個數),存在有效的算法,使得所有成員最終接受大多數成員做出的決定,即忠誠的將軍們總能達成一致的結果。所以一個分布式系統中,節點通信故障(節點或連接節點的網絡)的個數不超過分布式系統中的全部節點個數的1/3時,此分布式系統仍然能保持可用性。分布式系統為支持高可用的特性,多采用多副本機制存儲數據,而副本個數即由此規則確定。例如,要容忍單節點故障,需要4個副本(3×1+1);要容忍2個節點故障,需要7個副本(3×2+1)。但是,需要注意的是,拜占庭將軍問題容忍了消息篡改,而現在設計分布式數據庫系統時,多不考慮消息篡改問題,因此上述算法并不實用。多副本構建的可用性和可靠性依賴的是多數派技術。
2.2.2 結果一致性的應用
拜占庭將軍問題在分布式數據庫系統中的應用分為兩種。這兩種應用情況都可通過對通信過程的規范達成最終取得一致結果的效果。
- 應用情況一:當同一份數據存在多個副本時(高可用的要求),所有副本之間如何達到數據的一致性。所以,拜占庭將軍問題不是事務的一致性問題,而是分布式一致性問題。
- 應用情況二:多個節點(含有同一份數據)之間如何就某個問題達成一致,如怎么從多個候選者中選擇出一個Leader(領導者)。
通常在分布式數據庫中,不需要考慮消息篡改的情況,因此分布式數據庫中面臨的并不是真正的拜占庭將軍問題,而是拜占庭將軍問題的簡化版本。3.5節和3.6節將討論結果一致性的解決方案。
[1]引自參考文獻[162]:Messages can take arbitrarily long to be delivered, can be duplicated, and can be lost, but they are not corrupted.(消息交付可以花很長時間,可以復制,可以丟失,但不能被篡改。)注意,消息沒有被篡改是非拜占庭將軍問題,消息被篡改則是拜占庭將軍問題。
- MySQL 8從入門到精通(視頻教學版)
- Python GUI Programming Cookbook
- Redis Essentials
- JavaScript:Moving to ES2015
- 51單片機C語言開發教程
- Microsoft 365 Certified Fundamentals MS-900 Exam Guide
- 從零開始:UI圖標設計與制作(第3版)
- C++ System Programming Cookbook
- NGUI for Unity
- Three.js權威指南:在網頁上創建3D圖形和動畫的方法與實踐(原書第4版)
- 3D Printing Designs:The Sun Puzzle
- H5匠人手冊:霸屏H5實戰解密
- Visual C#(學習筆記)
- Getting Started with Backbone Marionette
- Learning Rust