8. MySQL 數(shù)據(jù)庫如何實現(xiàn) XA 規(guī)范

MySQL 有哪些一致性日志

如果 MySQL 數(shù)據(jù)庫斷電了燎字,未提交的事務(wù)怎么辦焕阿?
依靠日志
MySQL InnoDB 引擎中和一致性相關(guān)的有:重做日志(redo log)邢羔、回滾日志(undo log)鸦采、二進制日志(binlog)

  • redo 日志:每當(dāng)有操作執(zhí)行前弧腥,在數(shù)據(jù)真正更改前,會先把相關(guān)操作寫入 redo 日志赏酥。
    當(dāng)斷電喳整,或發(fā)生一些意外,導(dǎo)致后續(xù)任務(wù)無法完成時裸扶,待系統(tǒng)恢復(fù)后框都,可以繼續(xù)完成這些更改
  • undo 日志:也叫撤銷日志,記錄事務(wù)開始前數(shù)據(jù)的狀態(tài)呵晨,當(dāng)一些更改在執(zhí)行一半時
    發(fā)生意外而無法完成魏保,可以根據(jù)撤銷日志恢復(fù)到更改之前的狀態(tài)
    舉例:事務(wù) T1 更新數(shù)據(jù) X ,對 X 執(zhí)行 Update 操作摸屠,從 10 更新到 20 對應(yīng)的 Redo 日志為<T1谓罗,X,20> Undo 日志為 <T1季二,X檩咱,10>
  • binlog 日志是 MySQL server 層維護的一種二進制日志,是 MySQL 最重要的日志之一
    它記錄了所有的DDL 和 DML 語句胯舷,除了數(shù)據(jù)查詢語句 select刻蚯, show 等,還包含語句所執(zhí)行的消耗的時間

binlog 的主要目的是復(fù)制和恢復(fù)
用來記錄對 MySQL 數(shù)據(jù)更新或潛在發(fā)生更新的 SQL 語句桑嘶,并以事務(wù)日志的形式保存在磁盤中
binlog 主要應(yīng)用在 MySQL 的主從復(fù)制過程中炊汹,MySQL 集群在 Master 端開啟 binlog
Master 把它的二進制日志傳遞給 slaves 節(jié)點
再從節(jié)點回放來達到 master-slave 數(shù)據(jù)保存一致

# 查看 binlog 文件內(nèi)容
show binlog events;

# 查看指定 binlog 文件的內(nèi)容
show binlog events in 'MySQL-bin.000001';

# 查看正在寫入的binlog 文件
show master status \G;

# 獲取 binlog 文件列表
show binary logs;

XA 規(guī)范是如何定義的

20230731110920.jpg
事務(wù)協(xié)調(diào)者(Transaction Manager)

XA 事務(wù)是基于兩階段提交協(xié)議的
需要有一個協(xié)調(diào)者,來保證所有的事務(wù)參與者完成了準(zhǔn)備工作逃顶,也就是 2PC 的第一階段
如果事務(wù)協(xié)調(diào)者收到所有參與者都準(zhǔn)備好的消息
會通知所有的事務(wù)都可以提交讨便,也就是 2PC 的第二階段
在分布式系統(tǒng)中,兩臺機器理論上無法達到一致的狀態(tài)以政,需要引入一個單點進行協(xié)調(diào)
協(xié)調(diào)者捐寥,也就是 事務(wù)管理器控制著全局事務(wù)泞辐,管理事務(wù)生命周期,并協(xié)調(diào)資源

資源管理器(Resource Manager)

負責(zé)控制和管理實際資源,比如數(shù)據(jù)庫或 JMS 隊列
目前膊畴,主流數(shù)據(jù)庫都是提供了對 XA 的支持
在 JMS 規(guī)范中办陷,即 Java 消息服務(wù)(Java Message Service) 中
也基于 XA 定義了對事務(wù)的支持

XA 事務(wù)的執(zhí)行流程

根據(jù) 2PC 的規(guī)范私蕾,XA 將一次事務(wù)分割成了兩個階段猎提,即 Prepare 和 Commit 階段

  • Prepare 階段,TM 向所有 RM 發(fā)送 prepare 指令寸五,RM 接受到指令后
    執(zhí)行數(shù)據(jù)修改和日志記錄等操作梳凛,然后返回可以提交或者不提交的消息給 TM
    如果事務(wù)協(xié)調(diào)者 TM 收到所有參與者都準(zhǔn)備好的消息,會通知所有的事務(wù)提交梳杏,然后進入第二階段
  • Commit 階段韧拒,TM 接受到所有 RM 的 prepare 結(jié)果
    如果所有 RM 返回是不可提交或者超時淹接,那么向所有 RM 發(fā)送 Rollback 命令
    如果所有 RM 都返回可以提交,那么向所有 RM 發(fā)送 Commit 命令叛溢,完成一次事務(wù)操作

MySQL 如何實現(xiàn) XA 規(guī)范

MySQL 中 XA 事務(wù)有兩種情況塑悼,內(nèi)部 XA 和 外部 XA
其區(qū)別是事務(wù)發(fā)生在 MySQL 服務(wù)器單機上,還是發(fā)生在多個外部節(jié)點間上

內(nèi)部 XA

在 MySQL 的 InnoDB 存儲引擎中楷掉,開啟 binlog 的情況下
MySQL 會同時維護 binlog 日志和 InnoDB 的 redo log厢蒜,為了保證這兩個日志的一致性
MySQL 使用了 XA 事務(wù),由于有在 MySQL 單機上工作烹植,所以被稱為內(nèi)部 XA
內(nèi)部 XA 事務(wù)由 binlog 作為協(xié)調(diào)者斑鸦,在事務(wù)提交時,則需要將提交信息寫入二進制日志
binlog 的參與者是 MySQL 本身

外部XA

外部 XA 是典型的分布式事務(wù)草雕,MySQL 支持 XA START/END/PREPARE/Commit 這些SQL語句
MySQL 外部 XA 主要應(yīng)用在數(shù)據(jù)庫代理層巷屿,實現(xiàn)對 MySQL 數(shù)據(jù)庫的分布式事務(wù)支持
例如:開源的數(shù)據(jù)庫中間層,比如淘寶的 TDDL墩虹,阿里巴巴 B2B 的 Cobar 等
外部 XA 一般是針對跨多 MySQL 實例的分布式事務(wù)嘱巾,需要應(yīng)用層作為協(xié)調(diào)者
比如寫業(yè)務(wù)代碼,在代碼中決定提交還是回滾诫钓,并且在崩潰時進行恢復(fù)

Binlog 中的 Xid

binlog 有多種數(shù)據(jù)類型

  • statement 格式浓冒,記錄為基本語句,包含 Commit
  • row 格式尖坤,記錄為基于行
  • mixed 格式,日志記錄使用混合格式

binlog 會添加一個 XID_EVENT 作為事務(wù)的結(jié)束闲擦,該事件記錄了事務(wù)的 ID 也就是 Xid
在 MySQL 進行崩潰恢復(fù)時根據(jù) binlog 中提交的情況來決定如何恢復(fù)

Binlog 同步過程

20230731142337.jpg

當(dāng)有事務(wù)提交時:

  • 第一步慢味,InnoDB 進入 Prepare 階段,并且 write / sync redo log墅冷,寫 redo log
    將事務(wù)的 XID 寫入到 redo 日志中纯路,binlog 不作任何操作
  • 第二步,進行 write / sync Binlog寞忿,寫 binlog 日志驰唬,也會把 XID 寫入到 Binlog
  • 第三步,調(diào)傭 InnoDB 引擎的 Commit 完成事務(wù)的提交腔彰,將 Commit 信息寫入到 redo 日志中

如果是在 第一步和 第二步失敗叫编,則整個事務(wù)回滾
如果是在第三步失敗,則 MySQL 在重啟后會檢查 XID 是否已經(jīng)提交
若沒有提交霹抛,事務(wù)需要重新執(zhí)行搓逾,就會在存儲引擎中再執(zhí)行一次提交操作
保障 redo log 和 binlog 數(shù)據(jù)的一致性,防止數(shù)據(jù)丟失

在實際執(zhí)行中杯拐,牽扯到操作系統(tǒng)緩存 Buffer 何時同步到文件系統(tǒng)中
MySQL 支持用戶自定義在 Commit 時如何將 log buffer 中的日志刷到 log file 中
通過變量 innodb_flush_log_at_trx_Commit 的值來決定
在 log buffer 中內(nèi)容稱為臟日志

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霞篡,一起剝皮案震驚了整個濱河市世蔗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朗兵,老刑警劉巖污淋,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異余掖,居然都是意外死亡寸爆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門浊吏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來而昨,“玉大人,你說我怎么就攤上這事找田「韬” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵墩衙,是天一觀的道長务嫡。 經(jīng)常有香客問我,道長漆改,這世上最難降的妖魔是什么心铃? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挫剑,結(jié)果婚禮上去扣,老公的妹妹穿的比我還像新娘。我一直安慰自己樊破,他們只是感情好愉棱,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哲戚,像睡著了一般奔滑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顺少,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天朋其,我揣著相機與錄音,去河邊找鬼脆炎。 笑死梅猿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秒裕。 我是一名探鬼主播粒没,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼簇爆!你這毒婦竟也來了癞松?” 一聲冷哼從身側(cè)響起爽撒,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎响蓉,沒想到半個月后硕勿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡枫甲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年源武,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片想幻。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡粱栖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脏毯,到底是詐尸還是另有隱情闹究,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布食店,位于F島的核電站渣淤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉嫩。R本人自食惡果不足惜价认,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望自娩。 院中可真熱鬧用踩,春花似錦、人聲如沸忙迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽动漾。三九已至,卻和暖如春荠锭,著一層夾襖步出監(jiān)牢的瞬間旱眯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工证九, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留删豺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓愧怜,卻偏偏與公主長得像呀页,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拥坛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容