前提:
如下討論的前提 是設置MySQL的crash safe相關參數爲雙1:
sync_binlog=1
innodb_flush_log_at_trx_commit=1數據庫
背景說明:
WAL機制 (Write Ahead Log)定義:
WAL指的是對數據文件進行修改前,必須將修改先記錄日誌。MySQL爲了保證ACID中的一致性和持久性,使用了WAL。
Redo log的做用:
Redo log就是一種WAL的應用。當數據庫突然掉電,再從新啓動時,MySQL能夠經過Redo log還原數據。也就是說,每次事務提交時,不用同步刷新磁盤數據文件,只須要同步刷新Redo log就足夠了。相比寫數據文件時的隨機IO,寫Redo log時的順序IO可以提升事務提交速度。
組提交的做用:
在沒有開啓binlog時
Redo log的刷盤操做將會是最終影響MySQL TPS的瓶頸所在。爲了緩解這一問題,MySQL使用了組提交,將多個刷盤操做合併成一個,若是說10個事務依次排隊刷盤的時間成本是10,那麼將這10個事務一次性一塊兒刷盤的時間成本則近似於1。
當開啓binlog時
爲了保證Redo log和binlog的數據一致性,MySQL使用了二階段提交,由binlog做爲事務的協調者。而 引入二階段提交 使得binlog又成爲了性能瓶頸,先前的Redo log 組提交 也成了擺設。爲了再次緩解這一問題,MySQL增長了binlog的組提交,目的一樣是將binlog的多個刷盤操做合併成一個,結合Redo log自己已經實現的 組提交,分爲三個階段(Flush 階段、Sync 階段、Commit 階段)完成binlog 組提交,最大化每次刷盤的收益,弱化磁盤瓶頸,提升性能。性能
圖解:
下圖咱們假借「渡口運輸」的例子來看看binlog 組提交三個階段的流程:日誌