Seata 實現分布式事務原理,mysql日誌記錄問題,學習下

2020-12-24 怡子科技

01 mysql

內存中的資料庫數據何時持久化到磁碟?

因為redo log已經持久化,因此資料庫數據寫入磁碟與否影響不大,不過為了避免出現髒數據(內存中與磁碟不一致),事務提交後也會將內存數據刷入磁碟(也可以按照固設定的頻率刷新內存數據到磁碟中)。

redo log何時寫入磁碟

redo log會在事務提交之前,或者redo log buffer滿了的時候寫入磁碟

這裡存在兩個問題:

問題1:之前是寫undo和資料庫數據到硬碟,現在是寫undo和redo到磁碟,似乎沒有減少IO次數

- 資料庫數據寫入是隨機IO,性能很差

- redo log在初始化時會開闢一段連續的空間,寫入是順序IO,性能很好

- 實際上undo log並不是直接寫入磁碟,而是先寫入到redo log buffer中,當redo log持久化時,undo log就同時持久化到硬碟了。

因此事務提交前,只需要對redo log持久化即可。

另外,redo log並不是寫入一次就持久化一次,redo log在內存中也有自己的緩衝池:`redo log buffer`。每次寫redo log都是寫入到buffer,在提交時一次性持久化到磁碟,減少IO次數。

問題2:redo log 數據是寫入內存buffer中,當buffer滿或者事務提交時,將buffer數據寫入磁碟。

redo log中記錄的數據,有可能包含尚未提交事務,如果此時資料庫崩潰,那麼如何完成數據恢復?

數據恢復有兩種策略:

- 恢復時,只重做已經提交了的事務

- 恢復時,重做所有事務包括未提交的事務和回滾了的事務。然後通過Undo Log回滾那些未提交的事務

Inodb引擎採用的是第二種方案,因此undo log要在 redo log前持久化

02總結

最後總結一下:

- undo log 記錄更新前數據,用於保證事務原子性

- redo log 記錄更新後數據,用於保證事務的持久性

- redo log有自己的內存buffer,先寫入到buffer,事務提交時寫入磁碟

- redo log持久化之後,意味著事務是**可提交**的

業務發展瓶頸,解決業務系統的高耦合、可伸縮問題的需求越來越強烈。

03Seata支持的事務模型

Seata 會有 4 種分布式事務解決方案,分別是 AT 模式、TCC 模式、Saga 模式和 XA 模式。

Seata中比較常用的是AT模式。

訂單服務在下單時,同時調用庫存服務和用戶服務,此時就會發生跨服務和跨數據源的分布式事務問題。

在 Seata 中,將 Storage 服務看成一個本地事務,Business 服務看成一個本地事務,將 Order 服務看成一個本地事務,將 Account 服務看成一個本地事務,其構成了一個 Distributed Transaction,由 TC 統一協調。在 Seata 中稱之為 「Global Transaction」

在 Seata 中有三個基礎組件:

Transaction Coordinator(TC)(協調者):維護全局和分支事務的狀態,驅動全局提交或回滾。

Transaction Manager(TM)(事務管理):定義全局事務的範圍,開啟全局事務,提交 或 回滾一個全局事務。

Resource Manager(RM)(資源管理):管理分支事務資源。與 TC 通訊並報告分支事務狀態,管理本地事務的提交與回滾。

在 Seata 中,一個典型的生命周期如下所示:

TM 要求 TC 生成一個全局事務,並由 TC 生成一個全局事務XID 返回。

XID 通過微服務調用鏈傳播。

RM 向 TC 註冊本地事務,將其註冊到 ID 為 XID 的全局事務中。

TM 要求 TC 提交或回滾XID 對應的全局事務。

TC 驅動 XID 對應的全局事務對應的所有的分支事務提交或回滾。

相關焦點

  • 巨杉資料庫SequoiaDB巨杉TechSequoiaDB 分布式事務實現原理簡介
    分布式資料庫如果要滿足核心帳務類交易需求,則其需要完善分布式事務,向傳統關係型資料庫看齊。即分布式事務的實現也需要像傳統關係型資料庫的事務一樣滿足事務的標準要求及定義,即ACID特徵。分布式資料庫的數據是進行多機器多節點分散存儲的,這樣的存儲架構為實現分布式事務帶來了極大的難度。
  • 後端程式設計師必備:分布式事務基礎篇
    持久性: 表示事務完成以後,該事務對資料庫所作的操作更改,將持久地保存在資料庫之中。事務的實現原理本地事務傳統的單伺服器,單關係型資料庫下的事務,就是本地事務。本地事務由資源管理器管理,JDBC事務就是一個非常典型的本地事務。
  • 基於Canal和Kafka實現MySQL的Binlog近實時同步
    關於Canal簡介下面的簡介和下一節的原理均來自於Canal項目的README:Canal[kə'næl],譯意為水道/管道/溝渠,主要用途是基於MySQL資料庫增量日誌解析,提供增量數據訂閱和消費。早期阿里巴巴因為杭州和美國雙機房部署,存在跨機房同步的業務需求,實現方式主要是基於業務trigger獲取增量變更。
  • 解決分布式系統事務一致性的幾種方案對比,你有更好的嗎?
    JTA(Java Transaction API) 是符合 X/Open DTP 模型的,事務管理器和資源管理器之間也使用了 XA 協議。 本質上也是藉助兩階段提交協議來實現分布式事務的,下面分別來看看 XA 事務成功和失敗的模型圖:在 JavaEE 平臺下,WebLogic、Webshare 等主流商用的應用伺服器提供了 JTA 的實現和支持。
  • 高性能Mysql主從架構的複製原理及配置詳解
    將Mysql的數據分布到多個系統上去,這種分布的機制,是通過將Mysql的某一臺主機的數據複製到其它主機(slaves)上,並重新執行一遍來實現的。複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從伺服器的更新。
  • 純乾貨|細說分布式事務兩階段提交
    作者:旺德事務的概念在這篇文章中描述過,在分布式系統中,讀寫位於多個節點的數據,如果依舊想保證ACID特性,就必須實現分布式事務。而其實現關鍵則是適當的提交協議,目前最簡潔,且使用最廣泛的無疑是兩階段提交協議(2PC)。
  • 談談我在項目中是如何解決分布式事務的
    CAP理論示意圖兩段式提交方案兩段式提交通常將事務分成兩部分,增加一個事務協調器,這樣可以大大提高分布式事務成功的概率。先假設有服務A和服務B處於一個事務中,服務A發起事務,那麼執行過程如下:第一階段,服務A發起一個分布式事務,交給事務協調器處理,事務協調器向A和B發送事務的準備操作,A和B執行事務的準備操作,將Undo和Redo信息寫到日誌文件中,最後向事務協調器發送是否準備成功的信息。
  • 資料庫基礎:mysql主從集群搭建
    還好mysql資料庫提供了一種主從備份的機制,其實就是把主資料庫的所有的數據同時寫到備份的資料庫中。實現mysql資料庫的熱備份。 要想實現雙機的熱備,首先要了解主從資料庫伺服器的版本的需求。要實現熱備mysql的版本都高於3.2。還有一個基本的原則就是作為從資料庫的數據版本可以高於主伺服器資料庫的版本,但是不可以低於主伺服器的資料庫版本。
  • 您的包裹「 MySQL靈魂十連」 待籤收
    主從同步流程:主節點必須啟用二進位日誌,記錄任何修改了資料庫數據的事件。從節點開啟一個線程(I/O Thread)把自己扮演成 mysql 的客戶端,通過 mysql 協議,請求主節點的二進位日誌文件中的事件 。
  • Mysql常用關鍵字指令和參數總結
    最近在學習極客時間上的mysql課程,對mysql資料庫有了更多了解,本篇文章是想總結一些mysql的基礎知識。目的是加深自己的記憶,也可以提升對mysql設計原理的了解。,物理日誌,記錄數據頁上做的什麼修改binlog:歸檔日誌,邏輯日誌,記錄語句的原始邏輯,即sql語句WAL:write ahead logging,更新數據時先寫redo log後寫磁碟crash-safe
  • 學會設計Saga模型:實現管理跨多個微服務分布式事務
    當服務A執行成功,而服務B執行出現了問題,我們這個分布式事務調用需要調用服務A的補償操作來確保分布式事務的一致性(單個事務失敗,整個分布式事務需要進行回滾),由於這兩個參與服務之間沒有聯繫,因此需要一個協調器來幫助進行相關的恢復。
  • 分布式事務淺析及簡單實現
    作者:翟飛在分布式系統中,為了保證數據的高可用,通常,我們會將數據保留多個副本(replica),這些副本會放置在不同的物理的機器上。為了對用戶提供正確的 CRUD 等語義,我們需要保證這些放置在不同物理機器上的副本是一致的。分布式事務在現在遍地都是分布式部署的系統中幾乎是必要的。
  • 面試官:你說對 MySQL 事務很熟?那我問你 10 個問題
    作者 | LemonCoder責編 | 胡巍巍本文系作者投稿學習關係型資料庫MySQL是很好的切入點,大部分人學習和工作中用慣了CRUD,對面試官刨根問底的靈魂拷問你還能對答如流嗎?我們有必要了解一些更深層次的資料庫基礎原理。
  • Apache DolphinScheduler 1.2.0 發布,分布式可視化工作流任務調度...
    Dockerfile優化 改變mysql-connector-java作用域為test,規避mysql license問題 管理員和創建者可以刪除定時 刪除告警組需要刪除用戶與告警組的關係 刪除租戶時刪除檢查資源
  • 利用Zookeeper實現 - 分布式鎖
    許多場景中,數據一致性是一個比較重要的話題,在單機環境中,我們可以通過Java提供的並發API來解決;而在分布式環境(會遇到網絡故障、消息重複、消息丟失等各種問題)下要複雜得多,常見的解決方案是分布式事務、分布式鎖等。
  • mysql實現php函數explode功能mysql_explode
    我article表中的記錄如下,因為多個關鍵詞存放在一個欄位上,不利於做排序統計操作,例如我想要統計哪個關鍵詞的數量最多就是個大問題了:id keywords1 九陽神功,萬川歸海,橫掃千軍,乾坤大挪移2 殺破狼,落日十三劍
  • MySQL如何計算統計redo log大小
    但是在MySQL 8.0之前,通過計算重做日誌(redo log)的生成量來判斷判斷innodb_log_buffer_size和innodb_log_file_size的大小是否合適是非常必要的,個人認為即使MySQL 8.0版本下,這個也是非常有參考和研究意義的。我們通過統計、分析計算重做日誌(redo log)的生成量,從而判斷InnoDB的事務日誌文件大概能支撐多長時間就會切換。
  • 一文講透微服務架構下如何保證事務的一致性
    總結一下,當業務量級擴大之後的分庫,以及微服務落地之後的業務服務化,都會產生分布式數據不一致的問題。既然本地事務無法滿足需求,因此分布式事務就要登上舞臺。什麼是分布式事務?我們可以簡單地理解,它就是為了保證不同資料庫的數據一致性的事務解決方案。這裡,我們有必要先來了解下 CAP 原則和 BASE 理論。
  • 螞蟻金服自研分布式關係資料庫OceanBase上線阿里雲
    二、OceanBase架構原理與大多數分布式系統不同的地方在於,OceanBase這個系統沒有單獨的總控伺服器或者總控進程。分布式系統一般包含一個單獨的總控進程,用來做全局管理、負載均衡,等等。由於多個分區跨ObServer,內部通過兩階段提交實現分布式事務。當然,兩階段提交協議性能較差,OceanBase內部做了很多優化。它提出了分區組的概念,會把多個經常一起訪問,或者說訪問模式比較類似的不同表的分區放到一個分區組裡面。OB後臺會將同一個分區組儘可能調度到一臺伺服器上,避免分布式事務。同時優化了兩階段提交協議的內部實現。
  • 新一代分布式文件系統XGFS揭秘——元數據服務
    01存儲介質的高速發展上一代分布式文件系統元數據服務(MDS),多半基於HDD/SSD介質設計;這種設計不僅元數據訪問性能不佳,而且為了實現在慢速介質上通過數量堆積來實現性能與空間擴展,做出了很多架構讓步:如動態目錄子樹、動態遷移等,複雜性高的同時更帶來不少穩定性問題。