中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

二階段提交在MySQL中的廣義應用是怎樣的

發布時間:2021-10-25 09:35:07 來源:億速云 閱讀:163 作者:柒染 欄目:大數據

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

二階段提交介紹 

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

  • 事務協調者(TM):負責管理事務(提交、回滾),監控事務執行進度,分為事務唯一標識

  • 事務參與者(RM):根據“事務協調者”命令進行操作,管理本地共享資源,記錄執行日志

二階段提交在MySQL中的廣義應用是怎樣的

表決階段
  • TM:對RM發送Prepare指令,等待RM的回執(ACK)

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

提交階段
  • TM:如果接收到了所有RM的“是”回執,發送Commit給RM;如果在超時時間內有RM沒有任何回執,或者有RM回復了“否”,發送Rollback給RM。

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

二階段提交在MySQL中的廣義應用是怎樣的

-    二階段提交的應用     -

在分布式系統中,由于軟件或者硬件的原因,導致兩個進程之間的數據出現不一致問題。不一致問題的其中一個解決思路就是分布式事務,針對數據強一致性的需求場景,二階段提交可以滿足。

二階段提交在MySQL中的廣義應用是怎樣的

-    MySQL中binlog和redo log的二階段提交廣義應用     -

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

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

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

  1. 事務執行中,由于Innodb存儲引擎的恢復是基于redo log的,此時master和slave都沒有該數據,數據是一致的。

  2. 事務已提交,master基于redo log的恢復后的數據和slave中的數據會出現不一致問題。

  • 如果先寫redo log再寫binlog。當redo log寫入成功后,主節點宕機,此時分兩種狀態:

  1. 事務執行中,由于當前事務沒有提交,基于redo log恢復,未提交的時候不會寫入,slave和master都沒有該數據,數據是一致的。

  2. 事務已提交,redo log的事務已提交,binlog 記錄的事務沒有提交,master節點重啟后,該數據會寫入master節點,而slave節點沒有,數據不一致。

綜上所述,只有事務處于已提交狀態的情況下,才會出現數據不一致問題。為了保證數據一致性。事務提交時,redo log和binlog的Commit操作需要在同一個事務里,由于binlog和redo log由不同的層記錄,需要分布式事務,為了保證數據一致性,二階段提交滿足這樣的需求場景。

二階段提交在MySQL中的廣義應用是怎樣的

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

二階段提交在MySQL中的廣義應用是怎樣的

我們再分析一下基于二階段提交方式的故障恢復過程。如果寫redo log 處于Prepare階段,主節點宕機(圖中的①)。此時redo log 和binlog 都沒有Commit標識,master崩潰恢復的時候此時事務會回滾,binlog沒有寫入,不會傳輸給slave。所以master和slave數據是一致的。
如果寫binlog成功,主節點宕機(圖中的②)。master崩潰恢復的時候,先判斷redo log的狀態(redo log處于prepare階段時就要寫入磁盤,否則崩潰無法恢復),此時沒有Commit標識,會通過Xid判斷當前事務在binlog中的狀態,此時redo log有Commit標識(COMMIT或Xid event),直接提交。binlog已經寫入,數據已同步給slave。所以master和slave的數據是一致的。

二階段提交在MySQL中的廣義應用是怎樣的

-    MySQL二階段提交特殊性     -

二階段提交在MySQL中的廣義應用是怎樣的

表決階段:
  • 常規二階段提交協議中,TM發個Prepare信息給RM是串行有序的。

  • MySQL中,Server 先發給redo log 進行Prepare fsync操作(數據寫入磁盤)

提交階段:
  • 常規二階段提交協議中,TM發個Commit信息給RM是無序的,不用關注RM發送的先后順序。

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

設計優點
  • 少一次交互(對于分布式事務來說就少一次網絡io)

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

該機制名字叫  最末參與者優化。

以上就是二階段提交在MySQL中的廣義應用是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

勐海县| 缙云县| 平阳县| 镇巴县| 渭南市| 望奎县| 颍上县| 松潘县| 武隆县| 浦北县| 上思县| 越西县| 忻城县| 邓州市| 安国市| 河间市| 西贡区| 札达县| 汶上县| 麦盖提县| 怀集县| 深泽县| 郸城县| 玉屏| 桦甸市| 广德县| 惠州市| 龙川县| 彭山县| 涟源市| 富民县| 达日县| 丹凤县| 合山市| 岗巴县| 电白县| 洮南市| 博兴县| 双城市| 南投市| 应城市|