瞭解InnoDB的Checkpoint技術

2020-10-28 18:00:59

欄目帶大家瞭解InnoDB的Checkpoint技術。

一句話概括,Checkpoint技術就是將快取池中髒頁在某個時間點刷回到磁碟的操作

遇到的問題 ?

圖片名稱

都知道緩衝池的出現就是為了解決CPU與磁碟速度之間的鴻溝,免得我們在讀寫資料庫時還需要進行磁碟IO操作。有了緩衝池後,所有的頁操作首先都是在緩衝池內完成的。

如一個DML語句,進行資料update或delete 操作時,此時改變了緩衝池頁中的記錄,此時因為緩衝池頁的資料比磁碟的新,此時的頁就叫做髒頁。

不管怎樣,總會後的記憶體頁資料需要刷回到磁碟裡,這裡就涉及幾個問題:

  • 若每次一個頁發生變化,就將新頁的版本重新整理到磁碟,那麼這個開銷是非常大的
  • 若熱點資料集中在某幾個頁中,那麼資料庫的效能將變得非常差
  • 如果在從緩衝池將頁的新版本重新整理到磁碟時發生了宕機,那麼資料就不能恢復了

Write Ahead Log(預寫式紀錄檔)

WAL策略解決了重新整理頁資料到磁碟時發生宕機而導致資料丟失的問題,它是關聯式資料庫系統中用於提供原子性和永續性(ACID 屬性中的兩個)的一系列技術。

WAL策略核心點就是

redo log,每當有事務提交時,先寫入 redo log(重做紀錄檔),在修改緩衝池資料頁,這樣當發生掉電之類的情況時系統可以在重新啟動後繼續操作

WAL策略機制原理

InnoDB為了保證資料不丟失,維護了redo log。在緩衝池的資料頁修改之前,需要先將修改的內容記錄到redo log中,並保證redo log早於對應的資料頁落盤,這就是WAL策略。

當故障發生而導致記憶體資料丟失後,InnoDB會在重新啟動時,通過重放redo log,將緩衝池資料頁恢復到崩潰前的狀態。

Checkpoint

按理說有了WAL策略,我們就可以高枕無憂了。但其問題點又出現在redo log上面:

  • redo log 不可能是無限大的,不能沒完沒了的儲存我們的資料等待一起重新整理到磁碟
  • 在資料庫怠機恢復時,如果redo log 太大的話恢復的代價也是非常大的

所以為了解決髒頁的重新整理效能,髒頁應該在什麼時間、什麼情況下進行髒頁的重新整理就用到了Checkpoint技術。

Checkpoint 的目的

1、縮短資料庫的恢復時間

當資料庫怠機恢復時,不需要重做所有的紀錄檔資訊。因為Checkpoint前的資料頁已經刷回到磁碟了。只需要Checkpoint後的redo log進行恢復就好了。

2、緩衝池不夠用時,將髒頁重新整理到磁碟

當緩衝池空間不足時,根據LRU演演算法會溢位最近最少使用的頁,若此頁為髒頁,那麼需要強制執行Checkpoint,將髒頁也就是頁的新版本刷回磁碟。

3、redo log不可用時,重新整理髒頁

圖片名稱

如圖redo log 的不可用是因為當前資料庫對其設計都是迴圈使用的,所以其空間並不是無限大。

當redo log被寫滿, 因為此時系統不能接受更新, 所有更新語句都會被堵住。

此時必須強制產生Checkpoint需要將 write pos 向前推進,推進範圍內的髒頁都需要重新整理到磁碟

Checkpoint 的種類

Checkpoint發生的時間、條件及髒頁的選擇等都非常複雜。

Checkpoint 每次重新整理多少髒頁到磁碟?

Checkpoint每次從哪裡取髒頁?

Checkpoint 什麼時間被觸發?

面對上面的問題,InnoDB儲存引擎內部為我們提供了兩種Checkpoint:

  • Sharp Checkpoint

    發生在資料庫關閉時將所有的髒頁都重新整理回磁碟,這是預設的工作方式,引數innodb_fast_shutdown=1

  • Fuzzy Checkpoint

    InnoDB儲存引擎內部使用這種模式,只重新整理一部分髒頁,而不是重新整理所有的髒頁回磁碟

FuzzyCheckpoint發生的情況

  • Master Thread Checkpoint

    差不多以每秒或每十秒的速度從緩衝池的髒頁列表中重新整理一定比例的頁回磁碟。

    這個過程是非同步的,即此時InnoDB儲存引擎可以進行其他的操作,使用者查詢執行緒不會阻塞

  • FLUSH_LRU_LIST Checkpoint

    因為LRU列表要保證一定數量的空閒頁可被使用,所以如果不夠會從尾部移除頁,如果移除的頁有髒頁,就會進行此Checkpoint。

    5.6版本後,這個Checkpoint放在了一個單獨的Page Cleaner執行緒中進行,並且使用者可以通過引數innodb_lru_scan_depth控制LRU列表中可用頁的數量,該值預設為1024

  • Async/Sync Flush Checkpoint

    指的是redo log檔案不可用的情況,這時需要強制將一些頁重新整理回磁碟,而此時髒頁是從髒頁列表中選取的

    5.6版本後不會阻塞使用者查詢

  • Dirty Page too much Checkpoint 即髒頁的數量太多,導致InnoDB儲存引擎強制進行Checkpoint。

    其目的總的來說還是為了保證緩衝池中有足夠可用的頁。

    其可由引數innodb_max_dirty_pages_pct控制,比如該值為75,表示當緩衝池中髒頁佔據75%時,強制進行CheckPoint

總結

  • 因為CPU和磁碟間的鴻溝的問題,從而出現緩衝池資料頁來加快資料庫DML操作

  • 因為緩衝池資料頁與磁碟資料一致性的問題,從而出現WAL策略(核心就是redo log)

  • 因為緩衝池髒頁的重新整理效能問題,從而出現Checkpoint技術

InnoDB 為了提高執行效率,並不會每次DML操作都和磁碟互動進行持久化。而是通過Write Ahead Log 先策略寫入redo log保證事物的持久化。

對於事物中修改的緩衝池髒頁,會通過非同步的方式刷盤,而記憶體空閒頁和redo log的可用是通過Checkpoint技術來保證的。

更多相關免費學習推薦:(視訊)

以上就是了解InnoDB的Checkpoint技術的詳細內容,更多請關注TW511.COM其它相關文章!