分布式共識算法
什么是一致性
CAP theorem(CAP 理論)
-
對於一個分布式系統,不能 t時刻同時滿足以下三點:
- 一致性(Consistency)
- 可用性(Availability)
- 分區容錯性(Partition tolerance)
-
一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。CAP 定理告訴我們,剩下的 C 和 A 無法同時做到。
-
一致性和可用性,為什么不可能同時成立?答案很簡單,因為可能通信失敗(即出現分區容錯)。
-
業界普遍做法:
- 采取AP,保證分布式高可用,並通過弱一致性或最終一致性來同步數據。系統可以不同時達到CAP,而是分時達到。
-
CAP 理論說在一個系統中對某個數據不存在一個算法同時滿足 Consistency, Availability, Partition-tolerance。
- 在一個系統中,可以對某些數據做到 CP, 對另一些數據做到 AP,就算是對同一個數據,調用者可以指定不同的算法,某些算法可以做到 CP,某些算法可以做到 AP。
-
BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的簡寫,BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分布式實踐的結論,是基於CAP定理逐步演化而來的,其核心思想是即使無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,采用適當的方式來使系統達到最終一致性(Eventual consistency)。
-
以算法划分,到能分出幾類:
- 以Leader選舉為主的一類算法,比如paxos、viewstamp,就是現在zookeeper、Chuby等工具的主體
- 以分布式事務為主的一類主要是二段提交,這些分布式數據庫管理器及數據庫都支持
- 以若一致性為主的,主要代表是Cassandra的W、R、N可調節的一致性
- 以租賃機制為主的,主要是一些分布式鎖的概念,目前還沒有看到純粹“分布式”鎖的實現
- 以失敗探測為主的,主要是Gossip和phi失敗探測算法,當然也包括簡單的心跳
- 以弱一致性、因果一致性、順序一致性為主的,開源尚不多,但大都應用在Linkedin、Twitter、Facebook等公司內部
- 當然以異步解耦為主的,還有各類Queue
-
參考資料:
一致性模型
- 需要一致性的根源是數據不能存在單節點上。
- 弱一致性模型, 只要最終一致就行
- DNS(Domain Name System)
- Gossip(Cassandra的通信協議)
- 強一致性模型
- 同步
- Paxos, Paxos其實是一個共識算法。系統的最終一致性,不僅需要達成共識,還取決於client的行為。
- Ratf(multi-paxos)
- ZAB(multi-paxos)
- 強一致性算法:
- 需要主從同步,主從同步復制, 但也會導致一定的問題: 一個節點的失敗,Master阻塞,導致整個集群不可用,保證了一致性,可用性卻大大降低。
- Master 接受寫請求
- Master 復制日志到 slave
- Master 等待, 直到所有從庫返回
- 多數派: 問題:並發環境下,無法保證系統正確性,順序非常重要。
- 每次寫都保證寫入大於N/2個節點,每次讀保證從大於N/2個節點中讀。
- 需要主從同步,主從同步復制, 但也會導致一定的問題: 一個節點的失敗,Master阻塞,導致整個集群不可用,保證了一致性,可用性卻大大降低。
強一致性算法
Paxos 算法
- Paxos 算法衍生為三類:
- Basic Paxos
- 潛在問題,難實現、效率低(2輪RPC)、活鎖(liveness)
- Multi Paxos
- Fast Paxos
- Basic Paxos
- 參考資料
Raft 算法
- 划分成三個子問題:
- Leader Election
- Log Replication
- Safety
- 重新定義角色
- Leader
- Follower
- Candidate
- Raft要求系統在任意時刻最多只有一個Leader,正常工作期間只有Leader和Followers。
- 擁有最新的已提交的log entry的Follower才有資格成為Leader。
- Raft采用對整個系統進行snapshot來解決,snapshot之前的日志都可以丟棄。
- 參考資料:
ZAB 算法
- 基本與Raft相同。
- 在一些名詞的叫法上有些區別:如ZAB將某一個leader周期稱為epoch,而raft則稱為term。
- 實現上也有些許不同:Raft保證日志連續性,心跳方向為leader至follower。ZAB剛好相反。
- 參考資料: