阿里P7力推的「分布式事務介紹」看完不虧,看懂血賺

2020-09-22 Java架構師技術棧分享

本地事務

本地事務:支持事務的參與者、伺服器、資源管理器(RM)和事務管理器(TM)位於單機之上,僅限對單一資料庫資源的訪問控制。就是表和資料庫位於一個伺服器上,事務的操作都在這一個伺服器上進行。

起初,事務僅限於對單一數據資源的訪問控制:

而我們的本地事務由資源管理器進行管理:

事務的ACID是通過InnoDB日誌和鎖來保證。事務的隔離性是通過事務的鎖機制實現的,持久性通過redo log(重做日誌)來實現,原子性和一致性通過Undo log來實現。UndoLog的原理很簡單,為了滿足事務的原子性,在操作任何數據之前,首先將數據備份到一個地方(這個存儲數據備份的地方稱為UndoLog)。然後進行數據的修改。如果出現了錯誤或者用戶執行了ROLLBACK語句,系統可以利用Undo Log中的備份將數據恢復到事務開始之前的狀態。 和Undo Log相反,RedoLog記錄的是新數據的備份。在事務提交前,只要將RedoLog持久化即可,不需要將數據持久化。當系統崩潰時,雖然數據沒有持久化,但是RedoLog已經持久化。系統可以根據RedoLog的內容,將所有數據恢復到最新的狀態。

本地事務主要限制在單個會話內,不涉及多個資料庫資源。但是在基於SOA(Service-Oriented Architecture,面向服務架構)的分布式應用環境下,越來越多的應用要求對多個資料庫資源,多個服務的訪問都能納入到同一個事務當中,分布式事務應運而生。

分布式事務

在開發中,為了降低單機的壓力,通常會進行分表分庫,將表分布在不同的資料庫中(資料庫有可能分布在不同的機器上),但是一個業務場景可能會處理不同庫中的表,事務的提交就不能在像單機那樣處理,因為涉及到多個伺服器的控制,要考慮伺服器之間的通信是否正常、網絡延時帶寬等因素,這些在單機上並沒有太大的影響。所以說多伺服器之間事務的控制變得相對複雜,分布式事務也就相應的出現。

比如原來單機支撐了整個電商網站,現在對整個網站進行拆解,分離出了訂單中心、用戶中心、庫存中心等,對於訂單中心,有專門的資料庫存儲訂單信息,用戶中心也有專門的資料庫存儲用戶信息,庫存中心也會有專門的資料庫存儲庫存信息,如果要同時對訂單和庫存進行操作,那麼就會涉及到訂單資料庫和庫存資料庫,為了保證數據一致性,就需要用到分布式事務。

分布式事務:分布式事務就是指事務的參與者、支持事務的伺服器、資源伺服器以及事務管理器分別位於不同的分布式系統的不同節點之上。簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的伺服器上,且屬於不同的應用,分布式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分布式事務就是為了保證不同資料庫的數據一致性。

最早的分布式事務應用架構不涉及服務之間的訪問調用,僅僅是服務內操作涉及對多個資料庫資源的訪問。

當一個服務操作訪問不同的資料庫資源,又希望對它們的訪問具有事務特性時,就需要採用分布式事務來協調所有的事務參與者。

在上面的分布式事務應用架構中,儘管一個服務操作會訪問多個資料庫資源,但是畢竟整個事務還是控制在單一服務的內部。如果一個服務操作需要調用另外一個服務,這時的事務就需要跨越多個服務了。在這種情況下,起始於某個服務的事務在調用另外一個服務的時候,需要以某種機制流轉到另外一個服務,從而使被調用的服務訪問的資源也自動加入到該事務當中來。下圖反映了這樣一個跨越多個服務的分布式事務:

如果將上面這兩種場景(一個服務可以調用多個資料庫資源,也可以調用其他服務)結合在一起,對此進行延伸,整個分布式事務的參與者將會組成如下圖所示的樹形拓撲結構。在一個跨服務的分布式事務中,事務的發起者和提交均系同一個,它可以是整個調用的客戶端,也可以是客戶端最先調用的那個服務。

分布式事務的解決方案

分布式事務是最核心的還是其ACID特性。研究分布式事務本質上還是研究其是如何保證ACID的。事務模型為分布式事務提供了理論基礎,像2PC、3PC協議則是實現分布式事務的設計方案。

X/Open XA協議

DTP模型( X/Open Distributed Transaction):最早的分布式事務模型,是由 X/Open 國際聯盟提出的,也就是X/Open XA協議,簡稱XA協議。

DTP模型包含一個全局事務管理器(TM Transaction Manager)和多個資源管理器(RM Resource Manager)。全局事務管理器負責管理全局事務狀態與參與的資源,協同資源一起提交或回滾;資源管理器負責具體的資源操作。

XA協議描述了TM與RM之間的接口,允許多個資源在同一分布式事務中訪問。

TM:Transaction Manager 事務管理器

  • 分布式事務的實現由事務管理器來完成,它會提供分布式事務的操作接口供我們的業務系統調用。這些接口稱為TX接口。
  • 事務管理器還管理著所有的資源管理器,通過它們提供的XA接口來統一調度這些資源管理器,以實現分布式事務。
  • DTP只是一套實現分布式事務的規範,並沒有定義具體如何實現分布式事務,TM可以採用2PC、3PC、Paxos等協議實現分布式事務

RM:Resource Manager 資源管理器

  • 能夠提供數據服務的對象都可以是資源管理器,比如:資料庫、消息中間件、緩存等。大部分場景下,資料庫即為分布式事務中的資源管理器。
  • 資源管理器能夠提供單資料庫的事務能力,它們通過XA接口,將本資料庫的提交、回滾等能力提供給事務管理器調用,以幫助事務管理器實現分布式的事務管理。
  • XA是DTP模型定義的接口,用於向事務管理器提供該資源管理器(該資料庫)的提交、回滾等能力。XA協議實現通常在RM層。
  • DTP只是一套實現分布式事務的規範,RM具體的實現是由資料庫廠商來完成的

基於 DTP 模型的分布式事務流程大致如下

  1. 應用程式(AP)向TM申請開始一個事務
  2. 針對要操作的 RM,AP 會先向 TM 註冊(TM 負責記錄 AP 操作過哪些 RM,即分支事務),TM 通過 XA 接口函數通知相應 RM 開啟分布式事務的子事務,接著 AP 就可以對該 RM 管理的資源進行操作。
  3. 當 AP 對所有 RM 操作完畢後,AP 根據執行情況通知 TM 提交或回滾該全局事務,TM 通過 XA 接口函數通知各 RM 完成操作。TM 會先要求各個 RM 做預提交,所有 RM 返回成功後,再要求各 RM 做正式提交,XA 協議要求,一旦 RM 預提交成功,則後續的正式提交也必須能成功;如果任意一個 RM 預提交失敗,則 TM 通知各 RM 回滾。
  4. 所有 RM 提交或回滾完成後,全局事務結束。

1、原子性

XA協議使用2PC(Two Phase Commit 兩階段提交)原子提交協議來保證分布式事務原子性。

兩階段提交是指將提交過程分為兩個階段:準備階段(投票階段)和提交階段(執行階段)。

  • 準備階段TM向每個RM發送準備消息。如果 RM 的本地事務操作執行成功,則返回成功;如果 RM 的本地事務操作執行失敗,則返回失敗。
  • 提交階段如果 TM 收到了所有 RM 回復的成功消息,則向每個 RM 發送提交消息;否則發送回滾消息;RM 根據 TM 的指令執行提交或者回滾本地事務操作,釋放所有事務處理過程中使用的鎖資源。

存在的問題:

同步阻塞:當參與事務者存在佔用公共資源的情況,其中一個佔用了資源,其他事務參與者就只能阻塞等待資源釋放,處於阻塞狀態。並發性差。

單點故障:一旦事務管理器出現故障,整個系統不可用

數據不一致:在階段二,如果事務管理器只發送了部分 commit 消息,此時網絡發生異常,那麼只有部分參與者接收到 commit 消息,也就是說只有部分參與者提交了事務,使得系統數據不一致。

2、隔離性

XA 協議中沒有描述如何實現分布式事務的隔離性,但是 XA 協議要求 DTP 模型中的每個 RM 都要實現本地事務,也就是說,基於 XA 協議實現的分布式事務的隔離性是由每個 RM 本地事務的隔離性來保證的,當一個分布式事務的所有子事務都是隔離的,那麼這個分布式事務天然的就實現了隔離性。

以 MySQL 來舉例,MySQL 使用 2PL(Two-Phase Locking,兩階段鎖)機制來控制本地事務的並發,保證隔離性。2PL 與 2PC 類似,也是將鎖操作分為加鎖和解鎖兩個階段,並且保證兩個階段完全不相交。加鎖階段,只加鎖,不放鎖。解鎖階段,只放鎖,不加鎖。

如上圖所示,在一個本地事務中,每執行一條更新操作之前,都會先獲取對應的鎖資源,只有獲取鎖資源成功才會執行該操作,並且一旦獲取了鎖資源就會持有該鎖資源直到本事務執行結束。

MySQL 通過這種 2PL 機制,可以保證在本地事務執行過程中,其他並發事務不能操作相同資源,從而實現了事務隔離。

3、一致性

前面提到一致性有兩層語義,一層是確保事務執行結束後,資料庫從一個一致狀態轉變為另一個一致狀態。另一層語義是事務執行過程中的中間狀態不能被觀察到。

TCC模型

TCC(Try-Confirm-Cancel)分布式事務模型相對於 XA 等傳統模型,其特徵在於它不依賴資源管理器(RM)對分布式事務的支持,而是通過對業務邏輯的分解來實現分布式事務。

TCC 模型認為對於業務系統中一個特定的業務邏輯,其對外提供服務時,必須接受一些不確定性,即對業務邏輯初步操作的調用僅是一個臨時性操作,調用它的主業務服務保留了後續的取消權。如果主業務服務認為全局事務應該回滾,它會要求取消之前的臨時性操作,這就對應從業務服務的取消操作。而當主業務服務認為全局事務應該提交時,它會放棄之前臨時性操作的取消權,這對應從業務服務的確認操作。每一個初步操作,最終都會被確認或取消。

TCC事務機制相比於上面介紹的XA,解決了其幾個缺點:

  1. 解決了協調者單點,由主業務方發起並完成這個業務活動。業務活動管理器也變成多點,引入集群。
  2. 同步阻塞:引入超時,超時後進行補償,並且不會鎖定整個資源,將資源轉換為業務邏輯形式,粒度變小。
  3. 數據一致性,有了補償機制之後,由業務活動管理器控制一致性

MySQL分布式事務

MySQL 的 InnoDB 引擎其實能夠支持分布式事務,也就是我們經常說的 XA 事務;XA 事務就是用了我們在上一節中提到的兩階段提交協議實現分布式事務,其中事務管理器為協調者,而資源管理器就是分布式事務的參與者

相關焦點

  • 又見分布式事務之阿里開源Seata
    之前老顧已經介紹過如何利用rocketmq的事務消息解決事務問題,今天老顧再來介紹另一個方案;提供小夥伴們另一個選擇。解決方案有哪些?分布式事務方案大致分為對業務無侵入型 和 有侵入型。下面我們來介紹一下今天的主角。SeataSeata的分布式事務解決方案是業務層面的解決方案,業務層上無需關心分布式事務機制的約束,它將給我們的微服務架構帶來質的提升,只依賴於單臺資料庫的事務能力。
  • 分布式事務的七種實現方案匯總
    閱讀本文之前,需要你對資料庫事務的ACID、CAP理論、Base理論以及兩階段提交有一定的認知,不熟悉者請自行百度或者閱讀參考博客1、2、3和4。除此之外,在閱讀本文過程中,如果對某種方案不理解,強烈建議先閱讀對應方案中的參考博客後再閱讀本文中對應的介紹。
  • 阿里終面:分布式事務原理
    用戶請求購物微服務商完成下單時,購物微服務一方面調用庫存微服務扣減相應商品的庫存數量,另一方面調用訂單微服務插入訂單記錄(為了後文描述分布式事務解決方案的方便,這裡給出的是一個最簡單的電商系統微服務劃分和最簡單的購物業務流程,後續的支付、物流等業務不在考慮範圍內)。
  • 一文看懂分布式事務
    問題引入CAP 理論CAP 原則又稱 CAP 定理,指的是在一個分布式系統中的一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。CAP 原則指的是,這三個要素最多只能同時實現兩點,不可能三者兼顧。但由於在分布式系統中,分區容錯性必然存在,所以只能在一致性和可用性妥協。
  • 微服務架構下分布式事務解決方案——阿里GTS
    而對於第二個問題,現在還沒有通用方案很好的解決微服務產生的事務問題。分布式事務已經成為微服務落地最大的阻礙,也是最具挑戰性的一個技術難題。 為此,本文將深入和大家探討微服務架構下,分布式事務的各種解決方案,並重點為大家解讀阿里巴巴提出的分布式事務解決方案----GTS。
  • 肝完這份MQ+分布式事務套餐,其實阿里P8你也值得
    更嚴格來說,可以用 ACID 四個特性表述事務:Atomicity:原子性,事務中的所有操作要麼都成功執行,要麼都取消執行,不能存在部分執行,部分不執行的狀態。Consistency:一致性,舉個例子簡單的理解就是,A、B 兩個帳戶各有 100 元,無論兩個帳戶並發相互轉帳多少次,兩個帳戶的資金總額依然是 200 元。
  • 阿里P7是道坎?別在神話阿里了,拜託!
    到阿里一點都沒能夠成長,公司是摘你果實的而不是培養你的,只有你自己能培養自己…可惜浪費兩年培養自己時間,都耗在無意義的項目中了。公司也不是看你加班多少也不少看你的技術和貢獻,看的是你不可或缺的程度,多投資自己多花心思去站位少點996可以升的很順利。
  • 分布式事務方案 - SAGA模式
    不包括具體實現代碼,具體實現推薦使用阿里的Seata 框架。如何在跨資料庫的情況下實現事務呢?這就是分布式事務問題。這樣,通過事件機制,各個服務之間完成協同配合,實現了分布式事務。這樣就實現了分布式事務的異常處理。
  • 由Redis主從複製出發,深度解析分布式事務,進軍阿里就靠它
    一致性: 指在事務開始之前和事務結束以後,數據不會被破壞,假如A帳戶給B帳戶轉10塊錢,不管成功與否,A和B的總金額是不變的。隔離性: 多個事務並發訪問時,事務之間是相互隔離的,即一個事務不影響其它事務運行效果。簡言之,就是事務之間是進水不犯河水的。
  • 阿里員工:畢業五年只是p6,新同事畢業三年卻是p7,太失敗了
    就算是本碩985科班校招畢業進阿里,p6升p7也得四年,這還是算優秀的相比之下,三年普通本科就是p7,可以說極少數人能做到的,十萬挑一也不為過。所以,這中間需要付出得也很多,天賦加努力,並不是工作時間越長,技術實力就越強,工作十多年左右,經驗可能是劣勢。
  • 阿里Seata框架,多年雙十一歷練,無侵入式微服務分布式事務方案
    Seata 是一款開源的分布式事務解決方案,致力於提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分布式解決方案。作者總結:1、其中AT模式對代碼完全沒有侵入性,你只需要一個@GlobalTransaction就可以實現分布式事務,TCC模式也同樣使用3個註解就可以搞定,SAGA模式阿里還給我們提供了可視化的狀態機編輯器。
  • GTS讓分布式事務簡單高效
    而目前大型網際網路應用和平臺往往是由一系列分布式系統構建而成,平臺和技術架構也是流派紛呈。尤其是微服務架構盛行的今天,一個看似簡單的功能,內部可能需要調用多個「服務」並操作多個資料庫或分片來實現,單一技術手段和解決方案已無法滿足這些複雜應用場景。因此,分布式系統架構中分布式事務是一個繞不過去的挑戰。什麼是分布式事務?
  • 一篇文章徹底搞懂「分布式事務」
    舉一個典型的例子,阿里的淘寶網站隨著訪問量越來越大,只能按照商品、訂單、用戶、店鋪等業務為單位進行資料庫拆分,以及按照業務為單位提供服務接口。這個時候 為了完成一個簡單的業務功能,比如:購買商品後扣款,有可能需要橫跨多個服務,涉及用戶訂單、商品庫存、支付等多個資料庫,而這些操作又需要在同一個事務中完
  • 想高薪又不努力,90%開發者都不會分布式事務落地
    朝夕Net社區 今天.NET5、容器化、K8S、分布式、微服務、DevOps、雲原生,熱門的技術名詞很多,然而無論概念如何包裝,落地的底層邏輯是不變的,分布式事務就是一個釘子戶,任何分布式架構都避不開本文包含以下內容,共1300字,閱讀完大約需要3分鐘:1、什麼是分布式事務2、多種分布式事務解決方案3、.NET Core分布式事務推薦4、實戰CAP分布式事務1 什麼是分布式事務
  • 阿里終面:分布式事務原理(上)
    在網絡領域有 TCP 可靠傳輸協議、在存儲領域有 Raid5 和 Raid6 算法、在資料庫領域有 基於 ARIES 算法理論實現的事務機制……這篇文章先介紹單機資料庫事務的 ACID 特性,然後指出分布式場景下操作多數據源面臨的困境,引出分布式系統中常用的分布式事務解決方案,這些解決方案可以保證業務代碼在操作多個數據源的時候,能夠像操作單個數據源一樣
  • 阿里終面:分布式事務原理(下)
    上一篇我們講了單數據源事務 & 多數據源事務和常見分布式事務解決方案,今天我們繼續3. Seata in AT mode 的實現第 2 章給出了實現實現分布式事務的集中常見的理論模型。本章給出業界開源分布式事務框架 Seata 的實現。
  • 騰訊員工炫耀:騰訊職級改革,T4對標阿里P7,這不過分吧?
    今日,有騰訊的員工在網際網路職場發帖爆料稱,騰訊職級改革了,T3-1以後是9級工程師了,比阿里的P7還大2,以後是無敵的存在了。騰訊T4對標阿里P7,不過分吧?這樣的爆料也是瞬間引起了網友的圍觀與議論,我們先來看看網友都是怎麼說。
  • 分布式事務和分布式hash
    NeverTh | 作者urlify.cn/fM36be | 來源分布式事務是什麼?分布式事務就是保證各個微服務之間數據一致,本質上就是保證不同資料庫的數據一致性。數據不一致。極端條件下數據不一致。場景:目前支付寶使用2PC兩階段提交思想實現了分布式事務服務,它是一個分布式事務框架,用來保障在大規模分布式環境下事務的最終一致性。3PC,為了解決2PC的不確定性,包含準備,預提交,提交三個階段。準備階段只是詢問參與者的狀態,其他階段分別對應2PC。
  • 挖一個阿里p7程式設計師需要多少錢?
    我認為國內巨頭企業是阿里、騰訊的大企業。許多程式設計師將這種企業視為他們的目標,不為別的。一是薪水高,二是有很多技術人才,你可以學習到很多東西。就有一家獵頭公司在網上說35k到50k可以挖一個阿里p7嗎?工資低嗎?
  • 五分鐘帶你了解Seata分布式事務
    1.Seata介紹Seata是由阿里中間件團隊發起的開源項目 Fescar,後更名為Seata,它是一個是開源的分布式事務框架。傳統2PC的問題在Seata中得到了解決,它通過對本地關係資料庫的分支事務的協調來驅動完成全局事務。是工作在應用層的中間件。