初探Mysql架構和InnoDB存儲引擎

前言

mysql相信大家都不陌生了,分享之前我們先思考幾個面試題:

1.undo log和redo log瞭解過嗎?它們的作⽤分別是什麼?

2.redo log是如何保證事務不丟失的?

3.mysql的事務是先提交還是先刷盤?

4.更新操作爲什麼不直接更新磁盤反而設計這樣⼀個複雜的InnoDB存儲引擎來完成?

下面我們開始逐步探索Mysql架構的運行流程。

前臺操作觸發Mysql服務器執⾏請求

前臺⽤戶各種操作觸發後臺sql執⾏,通過web項⽬中⾃帶的數據庫連接池:如dbcp、c3p0、druid等,與數據庫服務器的數據庫連接池建⽴⽹絡連接;

數據庫連接池中的線程監聽到請求後,將接收到的sql語句通過SQL接⼝響應給查詢解析器,

查詢解析器將sql按照sql的語法解析出查詢哪個表的哪些字段,查詢條件是啥;

再通過查詢優化器處理,選擇該sql最優的⼀套執⾏計劃,然後執⾏器負責調⽤存儲引擎的⼀系列接⼝,執⾏該計劃⽽完成整個sql語句的執行,如下圖所示:

InnoDB存儲引擎-緩衝池中完成更新的基本操作

具體執⾏這些執⾏計劃得要存儲引擎來完成,比如⾸次更新users表中id=10的這條數據,緩衝池中⼀開始肯定沒有該條數據的,

得要先從磁盤中將被更新數據的原始數據加載到緩衝池中(這⾥涉及到的innodb buffer暫時不講)。

同時爲了保證併發更新數據安全問題,會對這條數據先加鎖,防⽌其他事務進⾏更新。

接着將更新前的值先備份寫⼊到undo log中(便於事務回滾時取舊數據),⽐如update語句即存儲被更新字段之前的值。

最後更新緩存⻚中的數據爲最新的數據,⾄此就完成了在緩衝池中的執⾏流程,如下圖所示: 

Redo Log和BinLog保證事務的可靠性

緩衝池中更新完數據後,需要將本次的更新信息順序寫到Redo Log⽇志以及Binlog⽇志中(此時信息還在內存中),

Redo Log刷盤策略由innodb_flush_log_at_trx_commit屬性值來定,

0:不會寫到磁盤
,宕機會導致已提交事務數據丟失

1:數據過來即寫磁盤,做到教據零丟失但是效率會很低

2:寫到os cache,每秒刷新一次到磁盤,宕機最多丟失1s的數據,速度夠快

Binlog刷盤策略由sync_binlog屬性來定,

1:強制刷盤;0:寫入os cache。

⼀般我們爲了保證數據不丟失會配置雙1策略,

Redo Log落盤後,寫Binlog落盤,再將Binlog的⽂件名、⽂件所在路徑信息以及commit標記給同步順序寫到Redolog中(其中commit標記是否更新到Redo Log中,是判定事務是否成功提交的⼀個⽐較重要的標準),

Redo Log和BinLog分別在物理和邏輯層⾯爲本次事務、提供數據上的⼀致性保障,如下圖所示

 

 

將事務的操作持久化

前⾯⼀些列操作執⾏成功後,InnoDB存儲引擎後臺有⼀個IO線程,會在數據庫壓⼒的低峯期間時如凌晨時分,

將緩衝池中被事務更新、但還沒來得及寫到磁盤中的數據(髒數據,因爲磁盤數據和內存數據已經不⼀致了)給刷到磁盤中,完成事務的持久化。

 

面試題解答

1.undo log和redo log瞭解過嗎?它們的作⽤分別是什麼?

undo log和redo log是mysql中InnoDB存儲引擎的基本組成:

(1)undo log保存了事務執⾏前數據的值,以便於事務回滾時能回到事務執⾏前的數據版本,多次更

新會有undo log的版本鏈;

(2)redo log在物理層⾯上記錄了事務操作的⼀系列信息,保證就算遇到mysql宕機等因素還沒來得

及將數據刷到磁盤⾥,通過redo log也能恢復事務提交的數據。

2.redo log怎樣保證事務不丟失的?

當⼀個事務提交成功後,雖然緩衝池中的數據不⼀定來得及⻢上落地到磁盤中,但是redo log記錄的

事務信息持久化到磁盤中了、且含有commit標記,此時如果mysql宕機導致緩衝池中的、已經被事務更新

過的內存數據丟失了,此時在mysql重啓時,將磁盤中的redo log中將事務變更信息給加載到緩衝池中,

保證事務信息不會丟失。或者redo log刷盤了,binlog寫成功了,在重啓時會⾃動給上commit標記,在重

放數據。

3.事務是先提交還是先刷盤?

事務先提交後刷盤;

1.Redo log刷盤成功->2.Binlog刷盤->3.BinLog名稱和⽂件路徑信息、commit標誌寫到Redo log

中,事務兩階段提交的⽅式來保證。

4.更新操作爲什麼不直接更新磁盤反⽽設計這樣⼀個複雜的InnoDB存儲引擎來完成?

直接更新磁盤是隨機IO寫,存在磁盤地址尋址操作,性能⾮常低,承載不了⾼併發場景;

⽽轉換爲InnoDB中,內存⾼速讀寫、redo log和undo log順序寫磁盤性能相對於隨機IO寫性能會⾼

的多,⽽這種性能上的提⾼⾜以抵消這種架構上帶來的複雜,可在⼀定QPS內承載⾼併發場景。

 

往期文章推薦:

JVM專欄

消息中間件專欄

併發編程專欄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章