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

2020-12-17 怡子科技

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 對應的全局事務對應的所有的分支事務提交或回滾。

相關焦點

  • 微服務 SpringCloud Alibaba Seata處理分布式事務
    一、分布式事務問題什麼是分布式事務?一次業務操作需要跨多個數據源或需要跨多個系統進行遠程調用,就會產生分布式事務問題。例如,在微服務分布式架構中,一次網上購買操作涉及到,訂單系統,支付系統,積分系統,庫存系統,物流系統。一個業務邏輯,分別對應不同的系統,不同的數據源,其中一環出現問題,需要全部回退,這就是分布式事務要解決的問題。
  • mysql分布式事務,undo和redo,java學習這塊必須要懂?
    011.什麼是分布式事務要了解分布式事務,必須先了解本地事務。這種情況下,資料庫本身的事務機制就能保證ACID的原則,這樣的事務就是本地事務。概括來講,單個服務與單個資料庫的架構中,產生的事務都是本地事務。其中原子性和持久性就要靠undo和redo 日誌來實現。
  • 巨杉資料庫SequoiaDB巨杉TechSequoiaDB 分布式事務實現原理簡介
    分布式資料庫如果要滿足核心帳務類交易需求,則其需要完善分布式事務,向傳統關係型資料庫看齊。即分布式事務的實現也需要像傳統關係型資料庫的事務一樣滿足事務的標準要求及定義,即ACID特徵。分布式資料庫的數據是進行多機器多節點分散存儲的,這樣的存儲架構為實現分布式事務帶來了極大的難度。
  • 面試官:談談你對MySQL事務的認識?
    ps:這個問題其實考察的是你對各個隔離級別的理解,所以務必牢記各個隔離級別的區別!2、Innodb中ACID具體是如何實現的?回答:老題了,詳細版,可以看這篇文章《程式設計師,知道Mysql中事務ACID的原理嗎?》
  • Mysql事務知識點
    在讀未提交下,會產生髒讀的問題。可重複讀解決了讀已提交級別下不可重複讀的問題,即一個事務內對同一記錄所有的讀操作讀到的結果都是相同的,在上面的例子中,事務1兩次讀操作讀到的結果均為(1, zs)。在網上搜到的大多數文章中,你總能得到可重複讀存在幻讀的問題,但經過實際測試,使用mysql5.7並不存在幻讀的問題,查閱資料後知道mysql已經修復了幻讀的問題,關於如何修復的後面會整理,這裡簡單說明一下幻讀是一種什麼現象,看下面的場景:
  • 如何選擇分布式事務解決方案?
    阿里妹導讀:分布式事務中涉及的參與者分布在異步網絡中,參與者通過網絡通信來達到分布式一致性,網絡通信不可避免出現失敗、超時的情況,因此分布式事務的實現比本地事務面臨更多的困難。本文歸納總結五種分布式事務解決方案,並剖析其特點。較長,同學們可收藏後再看。文末福利:Java 程式設計師學習清單。
  • 後端程式設計師必備:分布式事務基礎篇
    持久性: 表示事務完成以後,該事務對資料庫所作的操作更改,將持久地保存在資料庫之中。事務的實現原理本地事務傳統的單伺服器,單關係型資料庫下的事務,就是本地事務。本地事務由資源管理器管理,JDBC事務就是一個非常典型的本地事務。
  • 分布式事務實現-Spanner
    所有事務的讀寫都加鎖可以解決這個問題,缺點是性能較差。特別是對於一些workload中只讀事務佔比較大的系統來說不可接受。為了讓只讀事務不加任何鎖,需要引入多版本。在單機系統中,維護一個遞增的時間戳作為版本號很好辦。分布式系統中,機器和機器之間的時鐘有誤差,並且誤差範圍不確定,帶來的問題就是很難判斷事件(在本文,事件指分布式事務版本號)發生的前後關係。
  • 必須了解的MySQL三大日誌:binlog、redo log和undo log
    日誌是mysql資料庫的重要組成部分,記錄著資料庫運行期間各種狀態信息。mysql日誌主要包括錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進位日誌幾大類。作為開發,我們重點需要關注的是二進位日誌(binlog)和事務日誌(包括redo log和undo log),本文接下來會詳細介紹這三種日誌。
  • SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合來實現Dubbo分布式事務
    1.簡介「本文主要介紹SpringBoot2.1.5 + Dubbo 2.7.3 + Mybatis 3.4.2 + Nacos 1.1.3 +Seata 0.8.0整合來實現Dubbo分布式事務管理,使用Nacos 作為 Dubbo和Seata的註冊中心和配置中心,使用 MySQL 資料庫和 MyBatis來操作數據。
  • 必須了解的mysql三大日誌-binlog、redo log和undo log
    日誌是 mysql 資料庫的重要組成部分,記錄著資料庫運行期間各種狀態信息。mysql日誌主要包括錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進位日誌幾大類。作為開發,我們重點需要關注的是二進位日誌( binlog )和事務日誌(包括redo log 和 undo log ),本文接下來會詳細介紹這三種日誌。
  • 從銀行轉帳失敗到分布式事務:總結與思考
    而我之前一直認為銀行轉帳一定是由事務保證強一致性的,於是學習、總結了一下分布式事務的各種理論、方法。  事務是一個非常廣義的詞彙,各行各業解讀都不一樣。對於程式設計師,事務等價於Transaction,是指一組連續的操作,這些操作組合成一個邏輯的、完整的操作。即這組操作執行前後,系統需要處於一個可預知的、一致的狀態。
  • MySQL Group Replication 學習筆記
    主要資料來源是官方blog:http://mysqlhighavailability.com/group replication(後文簡稱GR)實現的分布式資料庫架構,底層的分布式基礎是Paxos(出於行文限制,此處不單獨交代Paxos)。通過Paxos來保證分布式資料庫系統中,事務的提交順序。
  • 淺析 MySQL Replication
    的大部分知識點,包括Replication原理、binlog format、複製中如何保證數據一致性、組提交、複製優化、半同步複製、多源複製。,使 slave 上的數據與 master 達到一致binlog 二進位日誌文件,用於記錄 MySQL 的數據變更。
  • 分布式事務:螞蟻金服核心金融場景下的演進
    所以,我們系統面臨的問題就是 SOA 架構下的數據一致性。  二. 金融級一致性要求與海量並發處理能力  考慮到在解決一致性問題的同時,還要兼顧海量並發處理能力,螞蟻金服內部結合BASE 理論的思想,選擇在業務層實現2PC(兩階段事務提交)的方式來解決該問題。
  • 這有一把鑰匙,打開MySQL死鎖問題!
    如果出現死鎖會報ERROR,可在日誌裡查詢到,已經出現死鎖的情況,mysql會自動檢測到了兩個會話互相等待鎖的情況,然後把最後一個會話去做回滾操作。2.下面來系統學習學習mysql事務及鎖機制1. 事務的引入1. 銀行轉帳業務A向B轉帳1000,A-1000,B+10002.
  • 從一筆金幣充值去思考分布式事務,五種方案詳解!
    原本收到充值回調後,可以將修改訂單狀態和增加金幣放在一個 mysql 事務中完成的,但是呢,因為服務拆分了,就面臨著需要協調 2 個服務才能完成這個事務所以就帶出來,我們今天要分享和討論的話題是:怎麼解決分布式場景下數據一致性問題,暫且用分布式事務 來定義吧。
  • MySQL 日誌(redo log 和 undo log) 都是什麼鬼?
    因為二進位日誌只在提交的時候一次性寫入,所以二進位日誌中的記錄方式和提交順序有關,且一次提交對應一次記錄。而redo log中是記錄的物理頁的修改,redo log文件中同一個事務可能多次記錄,最後一個提交的事務記錄會覆蓋所有未提交的事務記錄。
  • 軟體項目實訓及課程設計指導——如何在項目中實現日誌、事務功能
    (3)將業務交易日誌記錄的功能單獨設計為一個模塊為了避免在各個業務功能模塊中直接藕合和重複地編程實現業務交易日誌記錄的功能代碼,在銀行帳戶信息管理系統的架構設計方面應用面向切面的設計思想,業務交易日誌記錄的功能單獨設計為一個模塊——交易日誌記錄攔截器組件。
  • MySQL 工作、底層原理,看這一篇就夠了!
    這時就需要資料庫具有良好的並發控制能力,這一切在MySQL中都是由伺服器和存儲引擎來實現的。解決並發問題最有效的方案是引入了鎖的機制,鎖在功能上分為共享鎖(shared lock)和排它鎖(exclusive lock)即通常說的讀鎖和寫鎖。