溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

發(fā)布時(shí)間:2021-10-25 09:35:07 來源:億速云 閱讀:162 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)二階段提交在MySQL中的廣義應(yīng)用是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

二階段提交介紹 

2PC全稱是Two-PhaseCommit,翻譯過來是二階段提交,是分布式事務(wù)XA規(guī)范(XA規(guī)范是X/Open DTP定義的交易中間件與數(shù)據(jù)庫之間的接口規(guī)范)的實(shí)現(xiàn)思路,滿足CAP理論的CP,是強(qiáng)一致性事務(wù)。
二階段提交將分布式事務(wù)分成二個(gè)階段,表決階段(Commit-Request-Phase)和提交階段(Commit Phase)。角色分為:
  • 事務(wù)發(fā)起者(AP):定義事務(wù)邊界(開始、結(jié)束),并操作事務(wù)邊界內(nèi)的資源。

  • 事務(wù)協(xié)調(diào)者(TM):負(fù)責(zé)管理事務(wù)(提交、回滾),監(jiān)控事務(wù)執(zhí)行進(jìn)度,分為事務(wù)唯一標(biāo)識(shí)

  • 事務(wù)參與者(RM):根據(jù)“事務(wù)協(xié)調(diào)者”命令進(jìn)行操作,管理本地共享資源,記錄執(zhí)行日志

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

表決階段
  • TM:對(duì)RM發(fā)送Prepare指令,等待RM的回執(zhí)(ACK)

  • RM:接收TM發(fā)送的指令,鎖定資源,執(zhí)行事務(wù)操作,但不提交。記錄撤銷日志和重做日志,如果事務(wù)執(zhí)行成功,回復(fù)“是”;如失敗,回復(fù)“否”

提交階段
  • TM:如果接收到了所有RM的“是”回執(zhí),發(fā)送Commit給RM;如果在超時(shí)時(shí)間內(nèi)有RM沒有任何回執(zhí),或者有RM回復(fù)了“否”,發(fā)送Rollback給RM。

  • RM:根絕TM發(fā)送的指令執(zhí)行Commit或者Rollback操作,針對(duì)Rollback操作,RM使用表決階段記錄的撤銷日志。操作完成后給TM發(fā)送回執(zhí)“OK”。如果收不到指令,一直等待。

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

-    二階段提交的應(yīng)用     -

在分布式系統(tǒng)中,由于軟件或者硬件的原因,導(dǎo)致兩個(gè)進(jìn)程之間的數(shù)據(jù)出現(xiàn)不一致問題。不一致問題的其中一個(gè)解決思路就是分布式事務(wù),針對(duì)數(shù)據(jù)強(qiáng)一致性的需求場(chǎng)景,二階段提交可以滿足。

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

-    MySQL中binlog和redo log的二階段提交廣義應(yīng)用     -

MySQL的雙日志(binlog 和 redo log)記錄采用二階段提交保證數(shù)據(jù)的強(qiáng)一致性。

binlog是由MySQL Server層記錄,與任何存儲(chǔ)引擎無關(guān)。binlog主要記錄的是操作日志,有三種格式:Statement、Row、Mixedlevel。binlog的主要用途是故障恢復(fù)、主從同步。

redo log是由Innodb存儲(chǔ)引擎記錄,磁盤的最小單位是?,MySQL的記錄是以?為單位存取的,redo log記錄的是針對(duì)?上的修改日志。redo log的主要用途是進(jìn)程崩潰恢復(fù),主要用來恢復(fù)?上的數(shù)據(jù)。binlog無法修復(fù)?上的數(shù)據(jù),所以redo log不能省掉。
如果不使用二階段提交模式,會(huì)出現(xiàn)什么問題呢:MySQL為了保證事務(wù)持久性,采用的是WAL機(jī)制。正常情況下binlog和redo log中都有事務(wù)開始和結(jié)束標(biāo)識(shí)。如果binlog和redo log都是直接同步寫入磁盤方式,即write +  fsync方式。事務(wù)執(zhí)行期間,每次都要寫一次磁盤,TPS非常低,所以數(shù)據(jù)庫不會(huì)這么設(shè)計(jì)。binlog和redo log在事務(wù)執(zhí)行期間只寫內(nèi)存,當(dāng)前鏈接線程不會(huì)主動(dòng)去刷新到磁盤。接收到commit請(qǐng)求之后,當(dāng)前才將binlog和redo log刷新到磁盤。
  • 如果是先寫binlog 再寫 redo log。當(dāng)binlog寫入成功后,redo log未寫入成功,主節(jié)點(diǎn)宕機(jī),此時(shí)分兩個(gè)狀態(tài):

  1. 事務(wù)執(zhí)行中,由于Innodb存儲(chǔ)引擎的恢復(fù)是基于redo log的,此時(shí)master和slave都沒有該數(shù)據(jù),數(shù)據(jù)是一致的。

  2. 事務(wù)已提交,master基于redo log的恢復(fù)后的數(shù)據(jù)和slave中的數(shù)據(jù)會(huì)出現(xiàn)不一致問題。

  • 如果先寫redo log再寫binlog。當(dāng)redo log寫入成功后,主節(jié)點(diǎn)宕機(jī),此時(shí)分兩種狀態(tài):

  1. 事務(wù)執(zhí)行中,由于當(dāng)前事務(wù)沒有提交,基于redo log恢復(fù),未提交的時(shí)候不會(huì)寫入,slave和master都沒有該數(shù)據(jù),數(shù)據(jù)是一致的。

  2. 事務(wù)已提交,redo log的事務(wù)已提交,binlog 記錄的事務(wù)沒有提交,master節(jié)點(diǎn)重啟后,該數(shù)據(jù)會(huì)寫入master節(jié)點(diǎn),而slave節(jié)點(diǎn)沒有,數(shù)據(jù)不一致。

綜上所述,只有事務(wù)處于已提交狀態(tài)的情況下,才會(huì)出現(xiàn)數(shù)據(jù)不一致問題。為了保證數(shù)據(jù)一致性。事務(wù)提交時(shí),redo log和binlog的Commit操作需要在同一個(gè)事務(wù)里,由于binlog和redo log由不同的層記錄,需要分布式事務(wù),為了保證數(shù)據(jù)一致性,二階段提交滿足這樣的需求場(chǎng)景。

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

如圖,可以看到redo log的寫入有兩個(gè)階段,Prepare階段和Commit階段,Connect Client扮演事務(wù)發(fā)起者(AP),MySQL Server扮演事務(wù)協(xié)調(diào)者(TM),binlog和 redo log扮演事務(wù)參與者(RM)。redo log和 binlog既然是在同一個(gè)事務(wù)里,需要有一個(gè)事務(wù)id標(biāo)識(shí),即binlog文件中的Xid。  

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

我們?cè)俜治鲆幌禄诙A段提交方式的故障恢復(fù)過程。如果寫redo log 處于Prepare階段,主節(jié)點(diǎn)宕機(jī)(圖中的①)。此時(shí)redo log 和binlog 都沒有Commit標(biāo)識(shí),master崩潰恢復(fù)的時(shí)候此時(shí)事務(wù)會(huì)回滾,binlog沒有寫入,不會(huì)傳輸給slave。所以master和slave數(shù)據(jù)是一致的。
如果寫binlog成功,主節(jié)點(diǎn)宕機(jī)(圖中的②)。master崩潰恢復(fù)的時(shí)候,先判斷redo log的狀態(tài)(redo log處于prepare階段時(shí)就要寫入磁盤,否則崩潰無法恢復(fù)),此時(shí)沒有Commit標(biāo)識(shí),會(huì)通過Xid判斷當(dāng)前事務(wù)在binlog中的狀態(tài),此時(shí)redo log有Commit標(biāo)識(shí)(COMMIT或Xid event),直接提交。binlog已經(jīng)寫入,數(shù)據(jù)已同步給slave。所以master和slave的數(shù)據(jù)是一致的。

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

-    MySQL二階段提交特殊性     -

二階段提交在MySQL中的廣義應(yīng)用是怎樣的

表決階段:
  • 常規(guī)二階段提交協(xié)議中,TM發(fā)個(gè)Prepare信息給RM是串行有序的。

  • MySQL中,Server 先發(fā)給redo log 進(jìn)行Prepare fsync操作(數(shù)據(jù)寫入磁盤)

提交階段:
  • 常規(guī)二階段提交協(xié)議中,TM發(fā)個(gè)Commit信息給RM是無序的,不用關(guān)注RM發(fā)送的先后順序。

  • MySQL的二階段,Server 先發(fā)給binLog 進(jìn)行write +  fsync進(jìn)行合并操作,然后在通知redo log進(jìn)行Commit。

設(shè)計(jì)優(yōu)點(diǎn)
  • 少一次交互(對(duì)于分布式事務(wù)來說就少一次網(wǎng)絡(luò)io)

  • 少一次持久化操作(少一次磁盤io)

該機(jī)制名字叫  最末參與者優(yōu)化。

以上就是二階段提交在MySQL中的廣義應(yīng)用是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI