深入解析:分布式系統的事務處理經典問題及模型

2020-12-08 CSDN技術社區

PAXOS算法

Wikipedia上的各種Paxos算法的描述非常詳細,大家可以去圍觀一下。

Paxos 算法解決的問題是在一個可能發生上述異常的分布式系統中如何就某個值達成一致,保證不論發生以上任何異常,都不會破壞決議的一致性。一個典型的場景是,在一個分布式資料庫系統中,如果各節點的初始狀態一致,每個節點都執行相同的操作序列,那麼他們最後能得到一個一致的狀態。為保證每個節點執行相同的命令序列,需要在每一條指令上執行一個「一致性算法」以保證每個節點看到的指令一致。一個通用的一致性算法可以應用在許多場景中,是分布式計算中的重要問題。從20世紀80年代起對於一致性算法的研究就沒有停止過。

Notes:Paxos算法是萊斯利·蘭伯特(Leslie Lamport,就是 LaTeX 中的」La」,此人現在在微軟研究院)於1990年提出的一種基於消息傳遞的一致性算法。由於算法難以理解起初並沒有引起人們的重視,使Lamport在八年後1998年重新發表到ACM Transactions on Computer Systems上。即便如此paxos算法還是沒有得到重視,2001年Lamport 覺得同行無法接受他的幽默感,於是用容易接受的方法重新表述了一遍。可見Lamport對Paxos算法情有獨鍾。近幾年Paxos算法的普遍使用也證明它在分布式一致性算法中的重要地位。2006年Google的三篇論文初現「雲」的端倪,其中的Chubby Lock服務使用Paxos作為Chubby Cell中的一致性算法,Paxos的人氣從此一路狂飆。(Lamport 本人在他的blog 中描寫了他用9年時間發表這個算法的前前後後)

註:Amazon的AWS中,所有的雲服務都基於一個ALF(Async Lock Framework)的框架實現的,這個ALF用的就是Paxos算法。我在Amazon的時候,看內部的分享視頻時,設計者在內部的Principle Talk裡說他參考了ZooKeeper的方法,但他用了另一種比ZooKeeper更易讀的方式實現了這個算法。

簡單說來,Paxos的目的是讓整個集群的結點對某個值的變更達成一致。Paxos算法基本上來說是個民主選舉的算法——大多數的決定會成個整個集群的統一決定。任何一個點都可以提出要修改某個數據的提案,是否通過這個提案取決於這個集群中是否有超過半數的結點同意(所以Paxos算法需要集群中的結點是單數)。

這個算法有兩個階段(假設這個有三個結點:A,B,C):

第一階段:Prepare階段

A把申請修改的請求Prepare Request發給所有的結點A,B,C。注意,Paxos算法會有一個Sequence Number(你可以認為是一個提案號,這個數不斷遞增,而且是唯一的,也就是說A和B不可能有相同的提案號),這個決議號會和修改請求一同發出,任何結點在「Prepare階段」時都會拒絕其實小於當前提案號的請求。所以,結點A在向所有結點申請修改請求的時候,需要帶一個提案號,越新的提案,這個提案號就越是是最大的。

如果接收結點收到的提案號n大於其它結點發過來的提案號,這個結點會回應Yes(本結點上最新的被批准提案號),並保證不接收其它<n的提案。這樣一來,結點上在Prepare階段裡總是會對最新的提案做承諾。

優化:在上述 prepare 過程中,如果任何一個結點發現存在一個更高編號的提案,則需要通知 提案人,提醒其中斷這次提案。

第二階段:Accept階段

如果提案者A收到了超過半數的結點返回的Yes,然後他就會向所有的結果發布Accept Request(同樣,需要帶上提案號n),如果沒有超過半數的話,那就返回失敗。

當結點們收到了Accept Request後,如果對於接收的結果來說,n是最大的了,那麼,它就會修改這個值,如果發現自己有一個更大的提案號,那麼,結點就會拒絕修改。

我們可以看以,這似乎就是一個「兩段提交」的優化。其實,2PC/3PC都是分布式一致性算法的殘次版本,Google Chubby的作者Mike Burrows說過這個世界上只有一種一致性算法,那就是Paxos,其它的算法都是殘次品。

我們還可以看到:對於同一個值的在不同結點的修改提案就算是在接收方被亂序收到也是沒有問題的。

關於一些實例,你可以看一下Wikipedia中文中的「Paxos樣例」一節,我在這裡就不再多說了。對於Paxos算法中的一些異常示例,大家可以自己推導一下。你會發現基本上來說只要保證有半數以上的結點存活,就沒有什麼問題。

多說一下,自從Lamport在1998年發表Paxos算法後,對Paxos的各種改進工作就從未停止,其中動作最大的莫過於2005年發表的Fast Paxos。無論何種改進,其重點依然是在消息延遲與性能、吞吐量之間作出各種權衡。為了容易地從概念上區分二者,稱前者Classic Paxos,改進後的後者為Fast Paxos。

總結

下圖來自:Google App Engine的co-founder Ryan Barrett在2009年的google i/o上的演講:


前面,我們說過,要想讓數據有高可用性,就需要冗餘數據寫多份。寫多份的問題會帶來一致性的問題,而一致性的問題又會帶來性能問題。從上圖我們可以看到,我們基本上來說不可以讓所有的項都綠起來,這就是著名的CAP理論:一致性,可用性,分區容忍性,你可以要其中的兩個。

NWR模型

最後我還想提一下Amazon Dynamo的NWR模型。這個NWR模型把CAP的選擇權交給了用戶,讓用戶自己的選擇你的CAP中的哪兩個。

所謂NWR模型。N代表N個備份,W代表要寫入至少W份才認為成功,R表示至少讀取R個備份。配置的時候要求W+R > N。 因為W+R > N, 所以 R > N-W 這個是什麼意思呢?就是讀取的份數一定要比總備份數減去確保寫成功的倍數的差值要大。

也就是說,每次讀取,都至少讀取到一個最新的版本。從而不會讀到一份舊數據。當我們需要高可寫的環境的時候,我們可以配置W = 1 如果N=3 那麼R = 3。 這個時候只要寫任何節點成功就認為成功,但是讀的時候必須從所有的節點都讀出數據。如果我們要求讀的高效率,我們可以配置 W=N R=1。這個時候任何一個節點讀成功就認為成功,但是寫的時候必須寫所有三個節點成功才認為成功。

NWR模型的一些設置會造成髒數據的問題,因為這很明顯不是像Paxos一樣是一個強一致的東西,所以,可能每次的讀寫操作都不在同一個結點上,於是會出現一些結點上的數據並不是最新版本,但卻進行了最新的操作。

所以,Amazon Dynamo引了數據版本的設計。也就是說,如果你讀出來數據的版本是v1,當你計算完成後要回填數據後,卻發現數據的版本號已經被人更新成了v2,那麼伺服器就會拒絕你。版本這個事就像「樂觀鎖」一樣。

但是,對於分布式和NWR模型來說,版本也會有惡夢的時候——就是版本衝的問題,比如:我們設置了N=3 W=1,如果A結點上接受了一個值,版本由v1 -> v2,但還沒有來得及同步到結點B上(異步的,應該W=1,寫一份就算成功),B結點上還是v1版本,此時,B結點接到寫請求,按道理來說,他需要拒絕掉,但是他一方面並不知道別的結點已經被更新到v2,另一方面他也無法拒絕,因為W=1,所以寫一分就成功了。於是,出現了嚴重的版本衝突。

Amazon的Dynamo把版本衝突這個問題巧妙地迴避掉了——版本衝這個事交給用戶自己來處理。

於是,Dynamo引入了Vector Clock(矢量鍾?!)這個設計。這個設計讓每個結點各自記錄自己的版本信息,也就是說,對於同一個數據,需要記錄兩個事:1)誰更新的我,2)我的版本號是什麼。

下面,我們來看一個操作序列:

  1. 一個寫請求,第一次被節點A處理了。節點A會增加一個版本信息(A,1)。我們把這個時候的數據記做D1(A,1)。 然後另外一個對同樣key的請求還是被A處理了於是有D2(A,2)。這個時候,D2是可以覆蓋D1的,不會有衝突產生。
  2. 現在我們假設D2傳播到了所有節點(B和C),B和C收到的數據不是從客戶產生的,而是別人複製給他們的,所以他們不產生新的版本信息,所以現在B和C所持有的數據還是D2(A,2)。於是A,B,C上的數據及其版本號都是一樣的。
  3. 如果我們有一個新的寫請求到了B結點上,於是B結點生成數據D3(A,2; B,1),意思是:數據D全局版本號為3,A升了兩新,B升了一次。這不就是所謂的代碼版本的log麼?如果D3沒有傳播到C的時候又一個請求被C處理了,於是,以C結點上的數據是D4(A,2; C,1)。
  4. 如果D3沒有傳播到C的時候又一個請求被C處理了,於是,以C結點上的數據是D4(A,2; C,1)。
  5. 好,最精彩的事情來了:如果這個時候來了一個讀請求,我們要記得,我們的W=1 那麼R=N=3,所以R會從所有三個節點上讀,此時,他會讀到三個版本:

  • A結點:D2(A,2)
  • B結點:D3(A,2; B,1);C結點:D4(A,2; C,1)
  • C結點:D4(A,2; C,1)

6.這個時候可以判斷出,D2已經是舊版本(已經包含在D3/D4中),可以捨棄。

7.但是D3和D4是明顯的版本衝突。於是,交給調用方自己去做版本衝突處理。就像原始碼版本管理一樣。

很明顯,上述的Dynamo的配置用的是CAP裡的A和P。

原文連結:分布式系統的事務處理(責編:仲浩)

相關焦點

  • 陸天煒: GoldenDB事務一致性處理機制優化歷程
    前言:GoldenDB 是中興通訊推出的一款自研的金融級交易型分布式數據。針對金融行業關注的資料庫事務一致性問題,中興通訊 GoldenDB 分布式資料庫架構師陸天煒,在DTCC2019資料庫大會上做了乾貨分享,重點介紹了 GoldenDB 的解決方案和對應的優化實踐。
  • 盤點:關於分布式系統的經典基礎理論
    【IT168 評論】分布式系統設計理念  分布式系統架構的第一原則是不要分布!這句話看似矛盾實則揭露了分布式系統的很多特徵。  分布式系統的目標與要素  分布式系統的目標是提升系統的整體性能和吞吐量另外還要儘量保證分布式系統的容錯性(假如增加10臺伺服器才達到單機運行效果2倍左右的性能,那麼這個分布式系統就根本沒有存在的意義)。  即使採用了分布式系統,我們也要盡力運用並發編程、高性能網絡框架等等手段提升單機上的程序性能。
  • 聊聊分布式系統的數據一致性
    進入公司以來,先後參與了分布式資料庫、分布式文件系統、NOS對象存儲雲服務等多個大型存儲系統的開發工作。保證各個數據副本間的一致性,是評價存儲系統優劣的核心指標,也是貫穿整個開發過程中的討論重點。以前都是碰到問題見招拆招,看一些分布式系統中偏理論的研究時也是覺得雲裡霧裡,所以也想趁這次機會好好梳理一下,整理出的內容也希望能夠對大家以後的開發工作起到幫助。數據多副本間的一致性存儲系統是千差萬別的,可以拿來存放視頻這種動輒幾個G的大文件,也可以存放幾KB的KV鍵值對數據,還可能是MySQL這種關係型的資料庫。
  • 看完這篇,保證你真正明白:分布式系統的CAP理論、CAP如何三選二
    如果沒有統一的標準和方向,那很可能在一套分布式系統中的不同模塊,會出現不同的處理情況。假設一套系統,由 A、B 兩個模塊構成。A模塊的設計理念是:節點間出現了問題,它可能會選擇不斷的重試,一直等到節點通信恢復。而B的設計理念是:節點間出現了問題,它斷開就是了,可能最多就記錄下狀態,等以後處理。可是,當A、B之間出現了通信怎麼辦?
  • 騰訊分析系統架構解析
    TA(Tencent Analytics,騰訊分析)是一款面向第三方站長的免費網站分析系統,在數據穩定性、及時性方面廣受站長好評,其秒級的實時數據更新頻率也獲得業界的認可。本文將從實時數據處理、數據存儲等多個方面帶你深入探尋TA的系統架構及實現原理。
  • 引領數據創新,星環科技分布式資料庫KunDB亮相數據技術嘉年華
    以星環科技參與上海市隨申碼開發為例,目前與人民生活密切相關的民生和政務系統會成為海量用戶使用的應用,亟待分布式資料庫技術解決。另外,並不是所有企業像頭部網際網路公司一樣具有專業的運維團隊,由於資料庫目前是分布式的,數據同步和災備超出傳統的管理能力,所以能夠在產品層面解決運維痛點也是企業目前急需解決的難題。
  • Apache分布式日誌系統:高通量、低延遲
    網絡設備、系統及服務程序等,在運作時都會產生一個叫log的事件記錄;每一行日誌都記載著日期、時間、使用者及動作等相關操作的描述。它存在於大家每天的工作中,是一組只追加,嚴格有序的記錄序列。日誌是一種很有效的數據結構,可用來解決很多分布式系統的問題。
  • 阿里開源otter:分布式資料庫同步系統
    本周一(8月19日),阿里巴巴宣布開源分布式資料庫同步系統otter。負責otter項目的阿里巴巴技術專家七鋒(@agapple0002)介紹,otter是異地雙A機房的資料庫同步系統,解決長距離機房同步、雙A的數據一致性問題。  otter的誕生是由異地資料庫同步需求決定的。
  • DTCC2020阿里雲李飛飛:雲原生分布式資料庫與數據倉庫系統點亮數據...
    挑戰二:對資源的使用方式傳統的馮諾依曼架構下計算和存儲是緊密耦合的,可將多個伺服器通過分布式協議和處理的方式連成一個系統,但是伺服器和伺服器之間、節點和節點之間,分布式事務的協調、分布式查詢的優化,尤其要保證強一致性、強ACID的特性保證的時候,具有非常多的挑戰。
  • 分布式電源應用若干問題的解決方法
    本文引用地址:http://www.eepw.com.cn/article/201808/387262.htm引言近年來,對分布式電源應用與消納的關注越來越高,分布式電源對配電網的影響,分析鼠籠異步發電機和雙饋異步發電機的短路電流特性,研究光伏發電系統的動態仿真模型,論述光伏發電系統的併網逆變器結構及其控制策略,研究光伏逆變器附加電能質量控制
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    先進的深度學習模型參數正以指數級速度增長:去年的GPT-2有大約7.5億個參數,今年的GPT-3有1750億個參數。雖然GPT是一個比較極端的例子但是各種SOTA模型正在推動越來越大的模型進入生產應用程式,這裡的最大挑戰是使用GPU卡在合理的時間內完成模型訓練工作的能力。為了解決這些問題,從業者越來越多地轉向分布式訓練。
  • LinuxONE+分布式資料庫 黃金組合帶來完美分布式體驗
    ,一些金融機構也開始探索分布式架構的解決方案,但在具體實踐中不免還是會遇到魚和熊掌難以兼顧的挑戰,尤其是在滿足一致性的問題上。因為在分布式環境中,由於節點之間的通信容易出現問題,為了擴展性,往往不得不犧牲一致性。此外,對於資料庫的設計通常要遵循的四大特性(原子性、一致性、隔離性與持久性),分布式資料庫也難以兼顧,要嚴格執行,就要在執行性能上花費很大的代價。 後來出現的BASE理論提供了一種解題思路,但也沒有從根本上解決一致性問題。
  • 分布式架構概述
    海量數據包括:海量數據的存儲和海量數據的處理。這兩個工程難題都可以使用分布式系統來解決。簡單理解,分布式系統就是把一些計算機通過網絡連接起來,然後協同工作。協同工作需要解決兩個問題:1)任務分解把一個問題拆解成若干個獨立任務,每個任務在一臺節點上運行,實現多任務的並發執行。
  • 通證經濟模型設計:打破線性結構,樹立分布式思維
    來源: 區勢傳媒    通證經濟模型還處於探索階段,當前並無成功案例。不少探討通證經濟模型的言論,進入線性思維的誤區。通證經濟是分布式思維,與線性思維完全不同。
  • 大數據基礎知識:Hadoop分布式系統介紹
    隨著智能化、萬物互聯時代的快速發展,數據量開始暴增,一方面我們需要開始思考如何高效可靠地存儲海量的數據,另一方面我們還需要對這些數據進行分析處理,以獲得更多有價值的信息。這時期我們就需要用到Hadoop了。
  • 蘋果重新開源分布式資料庫FoundationDB,已在內部使用三年
    在 FoundationDB 公司,我們的初衷在於利用 FoundationDB 編寫出多種不同資料庫前端,且其分別使用不同的數據模型與查詢語言(包括 SQL 資料庫、文檔資料庫等),且保證這些語言將數據存儲在同一底層系統之內。在此基礎上,客戶可以隨意選擇自己需要的資料庫前端,甚至同時選取多種,但仍只需面對同一種分布式資料庫方案。這樣的思路無疑富有遠見。
  • 京東高級算法工程師34頁PPT詳解基於分布式向量檢索系統Vearch的大...
    本文為此次課程主講環節的圖文整理:正文:大家好,我是邸志惠,今天我要分享的主題為《大規模圖像檢索系統的挑戰與實踐》,我們會分為3個部分:1、大規模圖像檢索任務所面臨的挑戰2、Vearch原理解析3、Vearch在深度學習場景中的實踐大規模圖像檢索任務所面臨的挑戰隨著深度學習技術的快速發展,它的相關應用也滲透到了我們生活的方方面面
  • 分布式天線系統工作原理
    無線設備面臨的問題是,在一個設施或園區內,每一種無線應用通常需要自己的有線基礎設施接入點和其他無線發射源。其結果是一種各行其是的、冗餘的基礎設施。這種基礎設施造成混亂的RF環境,妨礙了無線應用。
  • 什麼是分布式存儲?深入研究Filecoin
    實際上採用分布式存儲可以說是「被迫」的,因為面對越發飛速發展的網際網路、整個生態應用不斷創新、用戶數量不斷龐大、數據階梯式增長這些無疑不給現有的本地存儲帶來巨大的壓力。因此,必須通過採用其他分布式存儲系統去緩解相應的壓力,所以分布式存儲和分布式文件系統應運而生。
  • 全球首個支持事務一致性, 兼容DB2和Oracle的高速SQL on Hadoop...
    Inceptor支持Oracle PL/SQL 和 DB2 SQL PL兩大主流SQL標準,包括完整的數據類型、流程控制、Package、遊標、異常處理以及動態SQL執行,並且支持在存儲過程中做高速統計,增刪改查與分布式事務操作。因此,有了存儲過程編譯器的補充,Inceptor可以滿足絕大部分數據應用的從關係型資料庫到Inceptor平臺的遷移。