mysql兩階段提交和組提交
出於效能的考慮,事務在提交時為了保證資料安全,需要將
redo
和
undo
資料落盤,不用等待資料落盤。但是
mysql
不僅要考慮
innodn
儲存引擎層的
redo
資料,還要考慮資料庫上層的
binlog
資料落盤,已經兩個層面資料落盤的順序問題。兩階段提交可以解決單個事務
redo
和
binlog
落盤順序的問題。
兩階段提交( 2PC )分為兩個過程:
l 準備階段( prepare phase )
生成 xid 資訊,回滾段設定為 prepare 狀態,並將 redo 落盤。
l 提交階段( commit phase )
在 binlog 生成 commit 的 XID event , Binlog 落盤,釋放回滾段,釋放鎖。
二階段提交的回滾:
只寫了redo,沒落盤binlog,回滾。
落盤了redo,binlog落盤成功了,也有commit XID,自然是成功。
落盤了redo,binlog落盤成功了,沒有commit XID,也認為事務已提交。
現在再來思考下一個問題,如果每個事物提交的時候,都要去將 redo 和 binlog 落盤,那麼瓶頸就在落盤階段被放大了。這個時候就要引入組提交。組提交使得 redo 和 binlog 落盤的時候可以批量落盤,多個事務的 redo 和 binlog 可以一次 fsync 操作完成資料落盤,減少了 fsync 函式的呼叫,提高了效率。同時 innodb 儲存引擎層本身就支援組提交。
組提交之後,引入了另一個問題。資料庫上層的 binlog 寫入順序和 innodb 層事務提交順序無法保持一致。如果不保持一致,那麼就會出現通過線上工具比如 xtrabackup 備份資料庫搭建主從的時候,出現丟失事務的場景,比如下面:
binlog 提交順序( T1,T2,T3 ), innodb commit 順序( T2,T3,T1 ),此時 innodb 檢測到 T3 上下兩層都已經提交,認為不再需要恢復,那麼 T1 事務在備份的時候沒有經歷兩階段提交, T1 的事務在備份的時候資料還是事務開始前的資料,從庫又不再進行恢復,導致 T1 事務被丟棄。所以後來引進了 prepare_commit_mutex, 以序列的方式來保證順序,但是這樣會使組提交失效,所以後來提出了 BLGC ( binary log group commit )
該行為分為三個階段
Flush 階段
記憶體中生成事務的二進位制日誌
Sync 階段
將記憶體中多個事務的二進位制日誌呼叫 1 次 fsync 刷盤
Commit 階段
二進位制日誌在記憶體中會有一個佇列,佇列第一個事務是 leader ,其他時 follower , leader 會根據順序呼叫儲存引擎層事務提交。 Innodb 本身就支援組提交。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31480688/viewspace-2696699/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [Mysql]兩階段提交MySql
- 兩階段提交2PC 和 三階段提交3pc
- MySQL兩階段提交過程原理簡述MySql
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- vitess兩階段提交事務Vite
- 分散式事務的兩階段提交和三階段提交分別有什麼優缺點?分散式
- 全網最牛X的!!! MySQL兩階段提交串講MySql
- 分散式事務(二)之兩階段提交分散式
- 分散式基礎,啥是兩階段提交?分散式
- 關於2PC(二階段提交)和3PC(三階段提交)的理解
- 分散式事務處理兩階段提交機制和原理分散式
- MySQL binlog和redo的組提交MySql
- MySQL事務提交的三個階段介紹MySql
- [分享] 使用 golang 理解 MySQL 的兩階段提交- 軒脈刃 de 刀光劍影GolangMySql
- 【分享】使用 golang 理解 mysql 的兩階段提交- 軒脈刃 de 刀光劍影GolangMySql
- 經典的兩階段提交演算法原理及缺陷演算法
- 分散式事務--兩階段提交(2PC-Prepare/Commit)分散式MIT
- MySQL事務兩段式提交MySql
- 三階段提交(Three-phase commit)MIT
- 位元組跳動流式資料整合基於Flink Checkpoint兩階段提交的實踐和優化優化
- 分散式事務對於兩階段提交的錯誤處理分散式
- Mysql 兩階段鎖和死鎖MySql
- 分散式事務(二)之三階段提交分散式
- 二階段提交協議(Two Phase Commitment Protocol)協議MITProtocol
- 一致性協議之三階段提交協議
- 08 MySQL兩階段認證MySql
- sourceTree“重置提交”和“提交回滾”的區別
- mysql複製那點事(2)-binlog組提交原始碼分析和實現MySql原始碼
- MySQL實現事務的提交和回滾MySql
- jquery中$.get()提交和$.post()提交有區別嗎?jQuery
- MySQL 的共享鎖和排它鎖以及自動提交MySql
- git 修改提交作者及提交日期Git
- 事務單獨提交和
- MySQl事務建立,開始以及提交MySql
- 對社群提交建議以及bug提交
- MYSQL 是如何保證binlog 和redo log同時提交的?MySql
- SSL連線分為兩個階段:握手和資料傳輸階段
- Git提交程式碼倉庫的兩種方式Git