了解mysql脏页落盘过程
臟頁落盤
什么是臟頁?
對數據的修改,首先改內存中的緩沖池的頁,由于緩沖池的數據跟磁盤中的數據不一致,所以稱緩沖池的頁為臟頁。
臟頁如何寫入到磁盤?
不是每次更新都觸發(fā)臟頁落盤,而是通過CheckPoint機制刷新磁盤。
InnoDB數據落盤流程(大概)
為什么性能好
- 從流程中,可以看到,事務的操作全是在內存中進行,所以性能好。
如何持久化
- 在修改緩沖區(qū)之前,所有操作先寫入Log Buffer,提交事務之前持久化到Redio日志,后面通過CheckPoint機制,將臟頁落盤。
如何保證數據安全
- Write Ahead Log 策略(日志先行)。
- Force Log at Commit機制(提交事務時,將日志寫入到磁盤)。
- CheckPoint機制。
- 雙寫機制:臟頁拷貝到雙寫緩沖區(qū)之后,持久化到對應系統表空間的位置,然后把臟頁更新到獨立表空間,最后清除Redo日志。
為什么不馬上更新到磁盤?
- 因為每次頁的更新,都落盤的話,必將伴隨4次磁盤IO,性能不會很高,隨著寫入操作的增加,性能指數下降。
如何確保日志安全進入磁盤?
- 日志寫入Log Buffer之后,調用fsync函數確保日志從緩存寫入磁盤。
fsync的功能是確保文件fd所有已修改的內容已經正確同步到硬盤上,該調用會阻塞等待直到設備報告IO完成。
Redo日志落盤策略
寫入磁盤時機由 innodb_flush_log_at_trx_commit 控制。
- 0:每秒寫入,跟事務無關,最多丟失1秒的的事務操作。
- 1:事務提交時寫入磁盤,不丟失數據,效率也是最低。
- 2:事務提交,寫入OS Buffer,間隔1秒寫入,性能、安全性相比前兩個居中。
CheckPoint機制
解決了什么問題
對緩沖池的操作,避免了直接修改磁盤,但是數據最終還是要寫入到磁盤,通過此機制,不斷將臟頁落盤,這樣可以減少Redo日志大小,在宕機的時候不用重做所有日志;
同時可以緩解緩沖池內存不夠用的情況;
刷新臟頁,還可以循環(huán)使用Redo日志,不會無限增大。
分類
sharp checkpoint:關閉數據庫時,將緩沖池的臟頁全部刷新到磁盤。
fuzzy checkpoint:數據庫運行期間,選擇不同時機將部分臟頁寫入磁盤。避免刷新全部帶來的性能問題。
- Master Thread Checkpoint:固定頻率刷新部分臟頁到磁盤,異步操作不會阻塞用戶線程。
- FLUSH_LRU_LIST Checkpoint:緩沖池淘汰非熱點Page,如果該Page是臟頁會執(zhí)行CheckPoint。
- Async/Sync Flush Checkpoint:redo日志不可用時,強制臟頁落盤,有了前兩個這種一般不會發(fā)生。
- Dirty Page too much Checkpoint:臟頁占比太多強制進行刷盤,閾值75%
Double Write機制
如果寫入臟頁時發(fā)生宕機怎么辦法?
我們在修改更新Redo日志時,先將緩沖池的臟頁拷貝到雙寫緩沖區(qū),然后將數據順序寫到系統表空間的雙寫緩沖區(qū),再離散寫入獨立表空間。這樣,即使發(fā)生宕機,數據也能從系統表空間中恢復。
(順序寫的速度是很快的)
Redo日志只記錄對頁的修改而非數據本身。
從緩沖池復制到雙寫緩沖區(qū) -> 順序寫入系統表空間 -> 離散寫入獨立表空間。
總結
以上是生活随笔為你收集整理的了解mysql脏页落盘过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP面试
- 下一篇: MySQL之Innodb引擎的4大特性