純乾貨|細說分布式事務兩階段提交

2021-01-16 阿里小庫

作者:旺德

事務的概念在這篇文章中描述過,在分布式系統中,讀寫位於多個節點的數據,如果依舊想保證ACID特性,就必須實現分布式事務。而其實現關鍵則是適當的提交協議,目前最簡潔,且使用最廣泛的無疑是兩階段提交協議(2PC)。

1.實現分布式事務關鍵組件

單機系統通過事務管理器(transaction manager,TM)實現本地事務。分布式系統中,需要協調多個節點的事務管理器,共同提交成功或失敗,因此需要事務協調者(transaction coordinator,TC)。一個分布式事務管理器,可以粗略地劃分為這兩個子系統。這兩個子系統根據自己在事務執行中扮演的角色,也可稱之為參與者與協調者。

本地事務管理器負責本機事務並發控制和異常恢復等功能,事務協調者負責開啟事務,將事務劃分為多個子事務分發到相應的節點執行,並協調事務完成(一起提交成功或失敗)。在實現中,TM和TC可以實現在同一個進程中,也可以部署在不同的節點。

2.經典兩階段提交協議

兩階段提交的流程比較簡單。當分布式事務T執行完成,即事務執行的各節點都告知協調者TC,事務已經執行完成,TC便開啟兩階段提交流程。

Phase 1 Prepare:

1.TC寫本地日誌,並持久化。TC向所有參與者發送PrepareT消息。

2.各參與者TM收到Prepare T消息,根據自身情況,決定是否提交事務。

如果決定提交,TM寫日誌並持久化,向TC發送Ready T消息。如果決定不提交,TM寫日誌並持久化,向TC發送Abort T消息,本地也進入事務abort流程。Phase 2 Commit :1.當TC收到所有節點的回應,或者等待超時,決定事務commit或abort。

如果所有參與者回應Ready T,則TC先寫日誌並持久化,再向所有參與者發送Commit T消息。如果收到至少一個參與者Abort T回應,或者在超時時間內有參與者未回應,則TC先寫日誌,再向所有參與者發送Abort T消息。2.參與者收到TC的消息後,寫或日誌並持久化。

兩階段提交協議可以保證分布式事務執行的一個關鍵點:參與者在向協調者發生Ready T消息前,隨時都可以自己決定是否abort,一旦這個消息發送,那麼這個事務就進入ready狀態,commit和abort完全由協調者控制。Ready T消息本質上是參與者向協調者發送的一個鄭重的、不可逆的承諾。為了保證這一個承諾,參與者需要在發送Ready T消息前將所有必要的信息持久化,否則如果參與者在發送Ready T後異常宕機,重啟後可能無法遵守以上承諾。在第二階段,當協調者寫了或日誌,整個事務的命運就被決定了,不會再發生變化了。

為了優化2PC性能,減少關鍵路徑的持久化和RPC次數是關鍵,一種對經典2PC的優化思路如下:

協調者無狀態,不再持久化日誌,但是為了方便宕機重啟後恢復事務狀態,需要向每個參與者發送事務的參與者名單並持久化。這樣即使協調者宕機,參與者也可以方便地詢問其他參與者事務狀態了。該思路相當於參與者在協調者宕機時,自己擔當起協調者詢問事務狀態的任務。

只要所有參與者prepare成功,事務一定會成功提交。因此為了減少提交延時,協調者可以在收到所有參與者prepare成功後就返回客戶端成功,但如此,讀請求可能會因為提交未完成而等待,從而增大讀請求的延時。反過來,如果協調者確認所有參與者都提交成功才返回客戶端成功,提交延時比較長,但會減少讀請求延時。

3.兩階段提交協議異常處理

兩階段提交協議的正常流程較為簡單,但它還需要考慮分布式系統中各種異常問題(節點失敗,網絡分區等)。

1.如果協調者檢測到參與者失敗:

如果參與者在發送Ready T前失敗,則協調者認為該節點事務Abort,並開始abort流程。如果參與者在發送Ready T後失敗,證明參與者本地事務已經持久化,協調者忽視參與者失敗,繼續事務流程。2.如果參與者在事務提交過程中失敗,其恢復過程,需要根據參與者日誌內容,決定本地事務狀態。

如果日誌中包含日誌,證明事務已經成功提交,REDO(T)。如果日誌中包含日誌,證明事務已經失敗,UNDO(T)。如果日誌中包含日誌,參與者P需向其它節點諮詢當前事務狀態。如果協調者正常,則向告知參與者P,事務已經commit或是abort,參與者依此REDO(T)或UNDO(T)。如果協調者異常,則向其它參與者詢問事務狀態。如果其他參與者收到信息,並已知事務是commit還是abort狀態,需回復參與者P事務狀態。如果所有的參與者現在都不知道該事務的狀態(事務上下文銷毀了,或者自己也處於未決狀態),那麼該事務處於暫時既不能commit也不能abort。需要定期向其它節點問詢事務狀態,直到得到答案。(這是2PC最不想遇到的一個場景)如果日誌中不包含上述幾種日誌,說明該參與者在向協調者發送Ready T消息前就失敗了。由於協調者沒有收到參與者的回應,會超時Abort,因此該參與者在恢復過程中,遇到這種情況也需要abort。3.如果協調者在事務提交過程中失敗。參與者需要根據全局事務狀態(通過與其它參與者通信)決定本地行為。

(事務狀態已經形成決議:)

如果至少有一個參與者中事務T已經提交(參與者包含日誌),說明T必須要提交。如果至少有一個參與者中事務T已經Abort(參與者包含日誌),說明T必須要Abort。(事務狀態未形成決議:)

如果至少有一個參與者沒有進入Ready狀態(參與者不包含日誌)。說明全局還未就提交與否達成協議。有兩種選擇:(1)等待協調者恢復。(2)參與者自行abort。為了減少資源佔用時間,選擇後者居多。如果所有參與者都進入了Ready狀態,且都沒有或日誌(事實上,即使有這些日誌,查日誌也是一種比較費的操作,還需要考慮日誌回收的問題),這種情況下,參與者誰都不知道現在事務的狀態,只能死等協調者恢復。(又到了這個最不想遇到的場景)當參與者均進入ready狀態,等待協調者的下一步指令,協調者在這個時候出現異常,那麼參與者將一直持有系統資源,如果基於鎖實現的並發控制,還會一直持有鎖,導致其他事務等待。這種情況如果持續較舊,會對系統產生巨大的影響。因此2PC最大的問題就是協調者失敗,可能會導致事務阻塞,未決事務的最終狀態,只能等待協調者恢復後才確定。同時在這種情況下,參與者宕機重啟,回放到這類未決事務,也會因為死等而block recovery流程。

4.緩解2PC blocking思路

三階段提交是兩階段提交的延伸,目的是解決2PC block的問題,但是也引入了其它問題。它的解決方式是為參與者引入timeout機制,如果參與者成功PreCommit後,一直收不到協調者最後的DoCommit請求,等待超時自動提交,顯然這樣會引入一致性問題,例如,協調者收到一個參與者PreCommit失敗,打算發abort請求給其它參與者時宕機,顯然此時該分布式事務應該失敗,但一些參與者可能因為超時而提交。

為了解決這個問題,3PC多引進了一個階段,就是第一個階段CanCommit階段,協調者詢問所有參與者是否可以提交,參與者如果狀態正常,就會回應可以提交,但此時並不會佔用任何系統資源。如果協調者及時收到了所有參與者ok的回應,便會認為各個參與者正常,之後的提交應該不會失敗。但是實質上,仍有小概率失敗的可能:某參與者PreCommit失敗後,協調者和參與者都宕機,其它參與者超時自動提交,產生不一致。

因此3PC還有一個關鍵優化是協調者宕機後,迅速找到一個繼任者,繼續未完的流程,儘量保證不會出現參與者超時提交的現象。但是如果出現諸如網絡分區等異常,新的協調者聯繫不上參與者,還是會產生一致性問題。

3PC通過犧牲一定的C(onsistency)來提高A(vailability),並且增加了網絡開銷,這些都是OLTP系統很難接受的,所以基本沒有系統會採用。

但是協調者高可用,確實可以使block的時間大幅減少,基於諸如Paxos/Raft的一致性協議的高可用方案,可以讓多個節點就commit/abort達成一致後,再去通知參與者,當協調者出現異常,可以迅速選出新的協調者,推進事務至完成。

相關焦點

  • 分布式事務淺析及簡單實現
    隔離性(isolation):一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。那什麼是分布式事務呢?
  • 後端程式設計師必備:分布式事務基礎篇
    分布式事務分布式事務: 就是指事務的參與者、支持事務的伺服器、資源伺服器以及事務管理器分別位於不同的分布式系統的不同節點之上。簡單來說,分布式事務指的就是分布式系統中的事務,它的存在就是為了保證不同資料庫節點的數據一致性。為什麼需要分布式事務?
  • 巨杉資料庫SequoiaDB巨杉TechSequoiaDB 分布式事務實現原理簡介
    3分布式事務分布式事務的實現需要保證事務的原子性、一致性、隔離性和持久性,而實現此ACID屬性的基本技術思路有:通過「兩階段提交(Two-phase Commit,2PC)」協議實現事務的原子性、一致性和持久性等屬性;隔離性級別的實現通常使用多版本並發控制機制來保證。
  • Seata 實現分布式事務原理,mysql日誌記錄問題,學習下
    問題2:redo log 數據是寫入內存buffer中,當buffer滿或者事務提交時,將buffer數據寫入磁碟。redo log中記錄的數據,有可能包含尚未提交事務,如果此時資料庫崩潰,那麼如何完成數據恢復?數據恢復有兩種策略:- 恢復時,只重做已經提交了的事務- 恢復時,重做所有事務包括未提交的事務和回滾了的事務。
  • 陸天煒: GoldenDB事務一致性處理機制優化歷程
    在分布式架構下,原子性的要求,是在多個數據分片上的多次操作,要麼一起成功,要麼一起失敗;而在單機架構下,僅是一臺機器上多條記錄的多次操作;隔離性方面,要求多個計算節點上的不同連接,不會相互訪問到在多個數據分片內未提交事務的數據;而單機資料庫的隔離性,是指不同連接(處理線程或進程)不會相互訪問到當前機器上未提交事務的數據;另外,從持久性角度看,分布式資料庫的事務提交前必須將日誌在分片主
  • 一文講透微服務架構下如何保證事務的一致性
    現在,業內比較常用的分布式事務解決方案,包括強一致性的兩階段提交協議,三階段提交協議,以及最終一致性的可靠事件模式、補償模式,阿里的 TCC 模式。其中,XA 協議是一個分布式事務協議,它有兩個角色:事務管理者和資源管理者。這裡,我們可以把事務管理者理解為協調者,而資源管理者理解為參與者。XA 協議通過二階段提交協議保證強一致性。二階段提交協議,顧名思義,它具有兩個階段:第一階段準備,第二階段提交。這裡,事務管理者(協調者)主要負責控制所有節點的操作結果,包括準備流程和提交流程。
  • 詳解NoSQL資料庫分布式算法的特點
    在這篇文章裡,我將針對NoSQL資料庫的分布式特點進行一些系統化的描述。  接下來我們將研究一些分布式策略,比如故障檢測中的複製,這些策略用黑體字標出,被分為三段:  •數據一致性。NoSQL需要在分布式系統的一致性,容錯性和性能,低延遲及高可用之間作出權衡,一般來說,數據一致性是一個必選項,所以這一節主要是關於數據複製和數據恢復。  •數據放置。
  • 分布式事務資料庫基礎軟體企業熱璞科技完成數千萬元A輪融資,泰達...
    )獲悉,分布式事務資料庫行業基礎軟體企業熱璞科技完成天津泰達科技投資領投的數千萬人民幣A輪,本輪融資用於加速第五代分布式事務資料庫產品和私有雲資料庫產品的研發進程,整合產業鏈資源構建互惠互利的渠道合作生態共同體。
  • 西部(重慶)科學城240項事務實現「零材料提交」
    為持續優化西部(重慶)科學城營商環境,重慶高新區積極推動「最多跑一次」改革,提升政務服務效能,目前240項事務已實現「零材料提交」。據悉,此次「零材料提交」事務涉及重慶高新區7個政府部門,這並不是群眾辦事時什麼材料都不要。
  • 光大銀行分布式實戰:國內最大繳費平臺的資料庫架構轉型
    5)開發應用 支持分布式事務。 支持事務、悲觀鎖以及全部隔離級別。中間件節點到MySQL是長連接的,但從F5到中間件這層是不能用長連接的,因為如果要是這個時候用長連接,可能就會失去F5負載均衡的作用,所以在這種情況下,又要用短連接,又要保證在出現分布式事務的時候不能因為連接中斷導致分布式事務失敗(或者如果沒有分布式事務,可能一筆交易中,需要做多個DML操作,可能因為短連接斷開了導致它做了3個DML,最後一個沒有做成)這種情況肯定是不可能出現的。
  • 軟體項目實訓及課程設計指導——如何在項目中實現日誌、事務功能
    JDBC中的事務特點主要體現在:打開一個資料庫連接對象(Connection)時,預設是自動提交(Auto-Commit)模式。也就是說,一條對資料庫的更新SQL語句代表一項事務操作,操作成功後,資料庫系統將自動調用commit()來提交,否則將調用rollback()來回滾。
  • Java面試題事務是什麼 SpringAOP對事務管理
    D,Durabillity,持久性,即事務提交後將被永久保存,即便出現其他故障,事務處理結果也應得到保存。這裡有一個很容易被問到的問題,如果我開啟事務之後伺服器突然宕機,或者硬碟損壞,斷電斷網了那麼我執行的操作時執行成功了還是沒成功呢?
  • Spring全家桶、Dubbo、分布式、消息隊列後端必備全套開源項目
    接入 Dubbo 應用」小節Seata《Dubbo 分布式事務 Seata 入門》 對應 lab-53《Spring Cloud Alibaba 分布式事務 Seata 入門》的「2.目前分布式事務的解決方案有 AT、TCC、Saga、MQ、XA、BED 六種。
  • DTCC2020阿里雲李飛飛:雲原生分布式資料庫與數據倉庫系統點亮數據...
    資料庫和數據倉庫從上世紀八十年代至今的發展縮影雲計算面臨兩大挑戰挑戰一:分布式和ACID的結合右邊分布式架構,通過Shared Nothing將多個部分連成一片,理論上具備非常好的水平擴展能力,利用分布式的協議進行分布式的事務處理和查詢處理,但是也遇到分布式場景下分布式事務處理、分布式查詢等非常多的挑戰。
  • 事務跟蹤系統在軟體企業中的應用
    一、事務跟蹤系統的功能和特點集中管理,統一平臺軟體開發企業中每天會產生和處理許多的問題:產品缺陷、需求變更、客戶反饋,以及各種類型的日常事務,如開發和測試任務、部門間業務交互等。事務跟蹤系統可以將各種類型的問題和事務按照「範圍」(如同屬於某款產品,或者同屬於某個團隊)和「流程」(如缺陷跟蹤流程、需求變更流程等)進行分門別類的管理。
  • MySQL的事務隔離級別是什麼?
    事務的特性於是呢,根據用戶對這些場景的嚴苛要求,總結出了事務應該具備的四個特性,分別是原子性、一致性、隔離性、持久性,簡稱事務的ACID屬性。髒讀Dirty Reads,一個事務在執行時修改了某條數據,另一個事務正好也讀取了這條數據,並基於這條數據做了其他操作,因為前一個事務還沒提交,如果基於修改後的數據進一步處理,就會產生無法挽回的損失。
  • 京東T8力薦,分布式資料庫架構企業級實踐PDF吃透漲薪5k
    Mycat無疑也是中間件中的佼佼者,支持百億級別的數據分片和並行計算,支持高可用和MySQL的讀寫分離,並隨著版本的更新進一步 支持Oracle、DB2、MongoDB等後端資料庫,隨著周邊產品的進一步成熟,在越來越多的分布式或者非分布式(僅用它的讀寫分離或者高可用)生產環境中得到部署,受到越來越多的企業的關注。
  • 一張圖讀懂分布式光伏開發全流程! - 分布式光伏 - 北極星太陽能...
    http://guangfu.bjx.com.cn/news/20210107/1127743.shtml 2021-01-07 日前,廣汽豐田汽車有限公司第四生產線分布式光伏項目