一文總結:分布式一致性技術是如何演進的?

2021-01-08 阿里技術

阿里妹導讀:分布式一致性(Consensus)作為分布式系統的基石,一直都是計算機系統領域的熱點。近年來隨著分布式系統的規模越來越大,對可用性和一致性的要求越來越高,分布式一致性的應用也越來越廣泛。縱觀分布式一致性在工業界的應用,從最開始的鼻祖Paxos的一統天下,到橫空出世的Raft的流行,再到如今Leaderless的EPaxos開始備受關注,背後的技術是如何演進的?本文將從技術角度探討分布式一致性在工業界的應用,並從可理解性、可用性、效率和適用場景等幾個角度進行對比分析。

文末福利:《分布式文件存儲系統技術及實現》技術公開課。

分布式一致性

分布式一致性,簡單的說就是在一個或多個進程提議了一個值後,使系統中所有進程對這個值達成一致。

為了就某個值達成一致,每個進程都可以提出自己的提議,最終通過分布式一致性算法,所有正確運行的進程學習到相同的值。

工業界對分布式一致性的應用,都是為了構建多副本狀態機模型(Replicated State Machine),實現高可用和強一致。

分布式一致性使多臺機器具有相同的狀態,運行相同的確定性狀態機,在少數機器故障時整體仍能正常工作。

Paxos

Paxos達成一個決議至少需要兩個階段(Prepare階段和Accept階段)。

Prepare階段的作用:

爭取提議權,爭取到了提議權才能在Accept階段發起提議,否則需要重新爭取。

學習之前已經提議的值。

Accept階段使提議形成多數派,提議一旦形成多數派則決議達成,可以開始學習達成的決議。Accept階段若被拒絕需要重新走Prepare階段。

Multi-Paxos

Basic Paxos達成一次決議至少需要兩次網絡來回,並發情況下可能需要更多,極端情況下甚至可能形成活鎖,效率低下,Multi-Paxos正是為解決此問題而提出。

Multi-Paxos選舉一個Leader,提議由Leader發起,沒有競爭,解決了活鎖問題。提議都由Leader發起的情況下,Prepare階段可以跳過,將兩階段變為一階段,提高效率。Multi-Paxos並不假設唯一Leader,它允許多Leader並發提議,不影響安全性,極端情況下退化為Basic Paxos。

Multi-Paxos與Basic Paxos的區別並不在於Multi(Basic Paxos也可以Multi),只是在同一Proposer連續提議時可以優化跳過Prepare直接進入Accept階段,僅此而已。

Raft

不同於Paxos直接從分布式一致性問題出發推導出來,Raft則是從多副本狀態機的角度提出,使用更強的假設來減少需要考慮的狀態,使之變的易於理解和實現。

Raft與Multi-Paxos有著千絲萬縷的關係,下面總結了Raft與Multi-Paxos的異同。

Raft與Multi-Paxos中相似的概念:

Raft的Leader即Multi-Paxos的Proposer。

Raft的Term與Multi-Paxos的Proposal ID本質上是同一個東西。

Raft的Log Entry即Multi-Paxos的Proposal。

Raft的Log Index即Multi-Paxos的Instance ID。

Raft的Leader選舉跟Multi-Paxos的Prepare階段本質上是相同的。

Raft的日誌複製即Multi-Paxos的Accept階段。

Raft與Multi-Paxos的不同:

Raft假設系統在任意時刻最多只有一個Leader,提議只能由Leader發出(強Leader),否則會影響正確性;而Multi-Paxos雖然也選舉Leader,但只是為了提高效率,並不限制提議只能由Leader發出(弱Leader)。

強Leader在工程中一般使用Leader Lease和Leader Stickiness來保證:

Leader Lease:上一任Leader的Lease過期後,隨機等待一段時間再發起Leader選舉,保證新舊Leader的Lease不重疊。

Leader Stickiness:Leader Lease未過期的Follower拒絕新的Leader選舉請求。

Raft限制具有最新已提交的日誌的節點才有資格成為Leader,Multi-Paxos無此限制。

Raft在確認一條日誌之前會檢查日誌連續性,若檢查到日誌不連續會拒絕此日誌,保證日誌連續性,Multi-Paxos不做此檢查,允許日誌中有空洞。

Raft在AppendEntries中攜帶Leader的commit index,一旦日誌形成多數派,Leader更新本地的commit index即完成提交,下一條AppendEntries會攜帶新的commit index通知其它節點;Multi-Paxos沒有日誌連接性假設,需要額外的commit消息通知其它節點。

EPaxos

EPaxos(Egalitarian Paxos)於SOSP'13提出,比Raft還稍早一些,但Raft在工業界大行其道的時間裡,EPaxos卻長期無人問津,直到最近,EPaxos開始被工業界所關注。

EPaxos是一個Leaderless的一致性算法,任意副本均可提交日誌,通常情況下,一次日誌提交需要一次或兩次網絡來回。

EPaxos無Leader選舉開銷,一個副本不可用可立即訪問其他副本,具有更高的可用性。各副本負載均衡,無Leader瓶頸,具有更高的吞吐量。客戶端可選擇最近的副本提供服務,在跨AZ跨地域場景下具有更小的延遲。

不同於Paxos和Raft,事先對所有Instance編號排序,然後再對每個Instance的值達成一致。EPaxos不事先規定Instance的順序,而是在運行時動態決定各Instance之間的順序。EPaxos不僅對每個Instance的值達成一致,還對Instance之間的相對順序達成一致。EPaxos將不同Instance之間的相對順序也做為一致性問題,在各個副本之間達成一致,因此各個副本可並發地在各自的Instance中發起提議,在這些Instance的值和相對順序達成一致後,再對它們按照相對順序重新排序,最後按順序應用到狀態機。

從圖論的角度看,日誌是圖的結點,日誌之間的順序是圖的邊,EPaxos對結點和邊分別達成一致,然後使用拓撲排序,決定日誌的順序。圖中也可能形成環路,EPaxos需要處理循環依賴的問題。

EPaxos引入日誌衝突的概念(與Parallel Raft類似,與並發衝突不是一個概念),若兩條日誌之間沒有衝突(例如訪問不同的key),則它們的相對順序無關緊要,因此EPaxos只處理有衝突的日誌之間的相對順序。

若並發提議的日誌之間沒有衝突,EPaxos只需要運行PreAccept階段即可提交(Fast Path),否則需要運行Accept階段才能提交(Slow Path)。

PreAccept階段嘗試將日誌以及與其它日誌之間的相對順序達成一致,同時維護該日誌與其它日誌之間的衝突關係,如果運行完PreAccept階段,沒有發現該日誌與其它並發提議的日誌之間有衝突,則該日誌以及與其它日誌之間的相對順序已經達成一致,直接發送異步的Commit消息提交;否則如果發現該日誌與其它並發提議的日誌之間有衝突,則日誌之間的相對順序還未達成一致,需要運行Accept階段將衝突依賴關係達成多數派,再發送Commit消息提交。

EPaxos的Fast Path Quorum為2F,可優化至F + [ (F + 1) / 2 ],在3副本和5副本時,與Paxos、Raft一致。Slow Path 為Paxos Accept階段,Quorum固定為F + 1。

EPaxos還有一個主動Learn的算法,在恢復的時候可用來追趕日誌,這裡就不做具體的介紹了,感興趣的可以看論文。

對比分析

從Paxos到Raft再到EPaxos,背後的技術是怎麼樣演進的,我們可以從算法本身來做個對比,下面主要從可理解性、效率、可用性和適用場景等幾個角度進行對比分析。

1 可理解性

眾所周知,Paxos是出了名的晦澀難懂,不僅難以理解,更難以實現。而Raft則以可理解性和易於實現為目標,Raft的提出大大降低了使用分布式一致性的門檻,將分布式一致性變的大眾化、平民化,因此當Raft提出之後,迅速得到青睞,極大地推動了分布式一致性的工程應用。

EPaxos的提出比Raft還早,但卻長期無人問津,很大一個原因就是EPaxos實在是難以理解。EPaxos基於Paxos,但卻比Paxos更難以理解,大大地阻礙了EPaxos的工程應用。不過,是金子總會發光的,EPaxos因著它獨特的優勢,終於被人們發現,具有廣闊的前景。

2 效率

從Paxos到Raft再到EPaxos,效率有沒有提升呢?我們主要從負載均衡、消息複雜度、Pipeline以及並發處理幾個方面來對比Multi-Paxos、Raft和EPaxos。

負載均衡

Multi-Paxos和Raft的Leader負載更高,各副本之間負載不均衡,Leader容易成為瓶頸,而EPaxos無需Leader,各副本之間負載完全均衡。

消息複雜度

Multi-Paxos和Raft選舉出Leader之後,正常只需要一次網絡來回就可以提交一條日誌,但Multi-Paxos需要額外的異步Commit消息提交,Raft只需要推進本地的commit index,不使用額外的消息,EPaxos根據日誌衝突情況需要一次或兩次網絡來回。因此消息複雜度,Raft最低,Paxos其次,EPaxos最高。

Pipeline

我們將Pipeline分為順序Pipeline和亂序Pipeline。Multi-Paxos和EPaxos支持亂序Pipeline,Raft因為日誌連續性假設,只支持順序Pipeline。但Raft也可以實現亂序Pipeline,只需要在Leader上給每個Follower維護一個類似於TCP的滑動窗口,對應每個Follower上維護一個接收窗口,允許窗口裡面的日誌不連續,窗口外面是已經連續的日誌,日誌一旦連續則向前滑動窗口,窗口裡面可亂序Pipeline。

並發處理

Multi-Paxos沿用Paxos的策略,一旦發現並發衝突則回退重試,直到成功;Raft則使用強Leader來避免並發衝突,Follwer不與Leader競爭,避免了並發衝突;EPaxos則直面並發衝突問題,將衝突依賴也做為一致性問題對待,解決並發衝突。Paxos是衝突回退,Raft是衝突避免,EPaxos是衝突解決。Paxos和Raft的日誌都是線性的,而EPaxos的日誌是圖狀的,因此EPaxos的並行性更好,吞吐量也更高。

3 可用性

EPaxos任意副本均可提供服務,某個副本不可用了可立即切換到其它副本,副本失效對可用性的影響微乎其微;而Multi-Paxos和Raft均依賴Leader,Leader不可用了需要重新選舉Leader,在新Leader未選舉出來之前服務不可用。顯然EPaxos的可用性比Multi-Paxos和Raft更好,但Multi-Paxos和Raft比誰的可用性更好呢。

Raft是強Leader,Follower必須等舊Leader的Lease到期後才能發起選舉,Multi-Paxos是弱Leader,Follwer可以隨時競選Leader,雖然會對效率造成一定影響,但在Leader失效的時候能更快的恢復服務,因此Multi-Paxos比Raft可用性更好。

4 適用場景

EPaxos更適用於跨AZ跨地域場景,對可用性要求極高的場景,Leader容易形成瓶頸的場景。Multi-Paxos和Raft本身非常相似,適用場景也類似,適用於內網場景,一般的高可用場景,Leader不容易形成瓶頸的場景。

思考

最後留下幾個思考題,感興趣的同學可以思考思考,歡迎大家在評論區留言:

1)Paxos的Proposal ID需要唯一嗎,不唯一會影響正確性嗎?

2)Paxos如果不區分Max Proposal ID和Accepted Proposal ID,合併成一個Max Proposal ID,過濾Proposal ID小於等於Max Proposal ID的Prepare請求和Accept請求,會影響正確性嗎?

3)Raft的PreVote有什麼作用,是否一定需要PreVote?

技術公開課

《分布式文件存儲系統技術及實現》

如何選擇分布式存儲系統?設計一個分布式系統需要注意哪些問題?本課程共 15 個課時,結合阿里 Pangu 系統詳解分步式存儲系統的設計要點及解決方法,帶大家學習如何實現一個分步式文件存儲系統。

相關焦點

  • 一文理解分布式架構
    本文轉載自【微信公眾號:手機電腦雙黑客,ID:heikestudio】經微信公眾號授權轉載,如需轉載與原文作者聯繫一、什麼是分布式架構分布式系統(distributed system) 是建立在網絡之上的軟體系統。內聚性:是指每一個資料庫分布節點高度自治,有本地的資料庫管理系統。
  • 聊聊分布式系統的數據一致性
    進入公司以來,先後參與了分布式資料庫、分布式文件系統、NOS對象存儲雲服務等多個大型存儲系統的開發工作。保證各個數據副本間的一致性,是評價存儲系統優劣的核心指標,也是貫穿整個開發過程中的討論重點。一切都完美,對於一個一致性算法真不能要求他更多了。Paxos有個小問題是不能保證消息全序,不過這個事情並不難搞。我們新版本分布式文件系統用的算法PacificA、zookeeper用的ZAB,都解決了這個事情。這些都算是在某些更嚴格要求場景下的Paxos特例。基於狀態機複製來做數據多副本的一致性,要面臨的一個困難是性能可能達不到要求。
  • 引領數據創新,星環科技分布式資料庫KunDB亮相數據技術嘉年華
    星環科技受邀亮相此次嘉年華,與行業內的專家和業界人士一同探討總結數據技術過往十年的歷程與成績,共同展望未來十年的趨勢與目標!星環科技產品研發部趙志強結合當前分布式資料庫的技術需求背景,分享《國產分布式資料庫KunDB開發實踐》主題演講。
  • 一文讀懂數字貨幣的由來、發展和演進
    文|王夢汐 西澤研究院特聘研究員用技術方案解決社會問題的願望總是帶有欺騙性,只有當社會條件和權力關係對此有利時,技術解決方案才能夠完成其任務從農業社會到工業社會,再向信息社會演進,數字金融是數字經濟的血脈,明治維新時期日本近代啟蒙思想家福澤諭吉曾在《西洋事情》中描述「繁盛金幣之融通可為世間之便益」,即金融應是「金幣之融通」的縮寫,因此數字貨幣的融通是數字金融的本質。Birch在《貨幣冷戰》中指出,現存貨幣體系的運作方式,本質上是根據政治、經濟和技術背景臨時商定的制度安排。
  • LinuxONE+分布式資料庫 黃金組合帶來完美分布式體驗
    它的核心思想是容許分布式系統出現短暫性的不一致的狀態,只要能夠在一定時間內,最終達到一致狀態就行。但是如果面對一些重要的系統,它們對一致性的要求非常高,就對分布式系統提出很大的挑戰。因此,分布式系統的使命,並不是要放棄一致性,而是要不斷的去追求更高一致性。
  • 分布式架構概述
    還能在會議室上滔滔不絕,如若無人,讓不懂技術的妹子看你時眼神迷離,就好想落霞與孤鶩齊飛!分布式架構是一個非常複雜的體系,任何技術都不是孤立的存在,任何技術都無法適應所有場景。作為一名分布式系統架構或者資深研發人員,我們必須儘可能多的學習與之相關的各種知識,掌握各種技術的演進路線,正式從一名碼農蛻變成為架構師什麼是分布式?
  • DTCC2020阿里雲李飛飛:雲原生分布式資料庫與數據倉庫系統點亮數據...
    趨勢二:雲計算加速資料庫系統演進關鍵詞:商業起步 - 開源 - 分析 - 異構NoSQL - 雲原生、一體化分布式、多模、HTAP資料庫系統架構演進關鍵詞:單節點、共享狀態、分布式完美的Partition Sharing是不存在的,這些是分布式業務需要解決的核心挑戰,以及在這個架構需要做到的高一致性保障。雲原生的架構,本質上底下是分布式共享存儲,上面是分布式共享計算池,中間來做計算存儲解耦,這樣可以非常好地提供彈性高可用的能力,做到分布式技術集中式部署,對應用透明。
  • 盤點:關於分布式系統的經典基礎理論
    注意:不是所謂的3選2(不要被網上大多數文章誤導了):  現實生活中,大部分人解釋這一定律時,常常簡單的表述為:「一致性、可用性、分區容忍性三者你只能同時達到其中兩個,不可能同時達到」。實際上這是一個非常具有誤導性質的說法,而且在CAP理論誕生12年之後,CAP之父也在2012年重寫了之前的論文。
  • 適用於分布式發電的儲能技術比較
    該 文在簡單分析了各種可用於分布式發電的各種儲能技術之後,重點對比研究了各種電池儲能技術,認為鋰離子電 池儲能系統是目前最有發展前景、最有應用優勢的儲能方式。分布式發電技術有多種分類方式,按發電能源是否可 以再生分為兩大類 :一類利用可再生能源,主要包括風 力發電、太陽能光伏、小水電、地熱能、生物質能、海洋 能等發電形式;另一類利用不可再生能源,主要包括熱電聯產、微型燃氣輪機、燃料電池等發電形式。其中的風力 發電和太陽能光伏技術,具有的波動性、隨機性、間歇性 成為制約新能源併網的關鍵問題,而儲能技術則是解決這 一問題的有效手段。
  • 除了尋找梅森素數,分布式技術還能做這些!
    分布式計算的本質是利用眾多計算機空閒的CPU、內存、IO等能力來解決大型計算問題,可以說如果沒有分布式就沒有雲計算的當今發展。那麼在雲計算實踐中,分布式技術究竟發揮了哪些功力?在具體的雲產品上,UCloud又是如何利用分布式技術打造高性能、穩定、安全的雲服務?
  • 陸天煒: GoldenDB事務一致性處理機制優化歷程
    前言:GoldenDB 是中興通訊推出的一款自研的金融級交易型分布式數據。針對金融行業關注的資料庫事務一致性問題,中興通訊 GoldenDB 分布式資料庫架構師陸天煒,在DTCC2019資料庫大會上做了乾貨分享,重點介紹了 GoldenDB 的解決方案和對應的優化實踐。
  • 看完這篇,保證你真正明白:分布式系統的CAP理論、CAP如何三選二
    時間回到 1985 年,彼時,後來證明了 CAP 理論的 Lynch 教授此時給當時的 IT 界來了一記驚雷:她通過不可辯駁的證明告訴業界的工程師們,如果在一個不穩定(消息要麼亂序要麼丟了)的網絡環境裡(分布式異步模型),想始終保持數據一致是不可能的。這是個什麼概念呢?就是她打破了那些既想提供超高質量服務,又想提供超高性能服務的技術人員的幻想。
  • 借IBMLinuxONE加快分布式架構轉型與創新
    但是如果面對一些重要的系統,它們對一致性的要求非常高,就對分布式系統提出很大的挑戰。因此,分布式系統的使命,並不是要放棄一致性,而是要不斷的去追求更高一致性。但是對於正要轉向分布式架構的用戶來說,做出抉擇依然是艱難的,因為在實踐層面他們將面臨的不僅僅是數據不一致和網絡質量無法保證的問題,更多的時候還有業務上的難題。
  • 一步一圖,帶你了解分布式架構的前世今生
    目錄:什麼是分布式架構? 分布式架構的演進 分布式服務面臨的問題 什麼是分布式架構?特徵:應用程式,資料庫,文件等所有資源都放在一臺伺服器上。緩存分為本地緩存和遠程分布式緩存,本地緩存訪問速度更快但緩存數據量有限,同時存在與應用程式爭用內存的情況。特徵:資料庫中訪問較集中的一小部分數據存儲在緩存伺服器中,減少資料庫的訪問次數,降低資料庫的訪問壓力。(4)使用「應用伺服器」集群
  • 一文看懂集群、分布式與負載均衡的關係
    在「高並發,海量數據,分布式,NoSql,雲計算......」概念滿天飛的年代,相信不少朋友都聽說過甚至常與人提起「集群,負載均衡」等,但不是所有人都有機會真正接觸到這些技術,也不是所有人都真正理解了這些「聽起來很牛的」技術名詞。下面簡單解釋一下吧。
  • 乾貨:記一次JavaWeb網站技術架構總結
    服務拆分  在這分布式微服務已經普遍流行的年代,其實我們沒必要踩過多的坑,就很容易進行拆分。市面上已經有相對比較成熟的技術,比如阿里開源的Dubbo(官方明確表示已經開始維護了),spring家族的spring cloud,當然具體如何去實施,無論是技術還是業務方面都要有很好的把控。
  • Apache分布式日誌系統:高通量、低延遲
    日誌是一種很有效的數據結構,可用來解決很多分布式系統的問題。  在5月11日-13日,北京國際會議中心隆重舉行的第八屆中國資料庫技術大會(DTCC 2017)——開源技術分會場上,Twitter消息組技術主管郭斯傑向大家分享了「Apache DistributedLog(分布式日誌系統)的強一致性簡化」。
  • 一文讀懂網絡界新貴SR技術化繁為簡的奧秘
    自從誕生那一刻起,SR技術便被譽為網絡領域最大的黑科技,因其與SDN天然結合的特性,也逐漸成為SDN的主流網絡架構標準。本文為大家梳理了SR技術的起源,引出SR技術的基本概念和優勢,並展望SR下階段的演進方向。
  • 10分鐘了解一致性哈希算法,全網(小區區域網)(建議收藏)
    下圖演示了這一分布式存儲過程:普通哈希算法負載均衡前面我們介紹過各種散列方法,不管是選擇上述哪種散列方法,在這個應用場景下,都是要把緩存數據利用哈希函數均勻的映射到伺服器集群上,我們就選擇簡單的「取模法」來說明這個過程。
  • 蘋果重新開源分布式資料庫FoundationDB,已在內部使用三年
    以系統封閉著稱的蘋果公司之所以會對 FoundationDB 這樣一個小團隊產品產生興趣,是因為蘋果在大數據時代繼續填補技術基因,而 FoundationDB 作為一款增強型 NoSQL(類似鍵值資料庫 Hbase,同時又能夠運行 ACID 交易),對蘋果來說,正好藉此提升自己的雲端服務能力。