分布式共識算法


分布式共識算法

什么是一致性

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)。

  • 以算法划分,到能分出幾類:

    1. 以Leader選舉為主的一類算法,比如paxos、viewstamp,就是現在zookeeper、Chuby等工具的主體
    2. 以分布式事務為主的一類主要是二段提交,這些分布式數據庫管理器及數據庫都支持
    3. 以若一致性為主的,主要代表是Cassandra的W、R、N可調節的一致性
    4. 以租賃機制為主的,主要是一些分布式鎖的概念,目前還沒有看到純粹“分布式”鎖的實現
    5. 以失敗探測為主的,主要是Gossip和phi失敗探測算法,當然也包括簡單的心跳
    6. 以弱一致性、因果一致性、順序一致性為主的,開源尚不多,但大都應用在Linkedin、Twitter、Facebook等公司內部
    7. 當然以異步解耦為主的,還有各類Queue
  • 參考資料:

一致性模型

  • 需要一致性的根源是數據不能存在單節點上。
  • 弱一致性模型, 只要最終一致就行
    • DNS(Domain Name System)
    • Gossip(Cassandra的通信協議)
  • 強一致性模型
    • 同步
    • Paxos, Paxos其實是一個共識算法。系統的最終一致性,不僅需要達成共識,還取決於client的行為。
    • Ratf(multi-paxos)
    • ZAB(multi-paxos)
  • 強一致性算法:
    • 需要主從同步,主從同步復制, 但也會導致一定的問題: 一個節點的失敗,Master阻塞,導致整個集群不可用,保證了一致性,可用性卻大大降低。
      1. Master 接受寫請求
      2. Master 復制日志到 slave
      3. Master 等待, 直到所有從庫返回
    • 多數派: 問題:並發環境下,無法保證系統正確性,順序非常重要。
      • 每次寫都保證寫入大於N/2個節點,每次讀保證從大於N/2個節點中讀。

強一致性算法

Paxos 算法

  • Paxos 算法衍生為三類:
    • Basic Paxos
      • 潛在問題,難實現、效率低(2輪RPC)、活鎖(liveness)
    • Multi Paxos
    • Fast 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剛好相反。
  • 參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM