Innodb Double Write

Innodb Double Write函數

      若是說ibuf帶給InnoDB存儲引擎的是性能上的提高,那麼doublewrite(兩次寫)帶來的則是數據頁的可靠性。
 
      InnoDB的Page Size通常是16KB,其數據校驗也是針對這16KB來計算的,將數據寫入到磁盤是以Page爲單位進行操做的。咱們知道磁盤在寫入時,都是以512字節爲單位,不能保證MySQL數據頁面16KB的一次性原子寫。試想,在某個Dirty Page flush的過程當中,發生了系統斷電(或者OS崩潰),16K的數據只有8K被寫到磁盤上,只有一部分寫是成功的,這種現象被稱:部分寫失效(partial page write)。一旦partial page writes發生,那麼在InnoDB恢復時就很尷尬:在InnoDB的Redo Log file(重作日誌文件)中雖然知道這個數據頁被修改了,可是卻沒法知道這個頁被修改到什麼程度,和這個頁面相關的redo也就沒法應用了,也就是說若是出現了偏移量問題,再對進行重作就沒有意義了。
 

       在講如何InnoDB存儲引擎是如何解決這個問題以前先介紹如下double write的兩個組成部分:性能

1. 一部分是InnoDB內存中的double write buffer,大小爲2M;ui

2. 另外一部分是物理磁盤上ibdata系統表空間中大小爲2MB,共128個連續的Page,既2個分區。其中120個用於批量寫髒,另外8個用於Single Page Flush。作區分的緣由是批量刷髒是後臺線程作的,不影響前臺線程。而Single page flush是用戶線程發起的,須要儘快的刷髒並替換出一個空閒頁出來。spa

  當一系列機制(main函數觸發、checkpoint等)觸發數據緩衝池中的髒頁進行刷新到data file的時候,並不直接寫磁盤,而是會經過memcpy函數將髒頁先複製到內存中的double write buffer,以後經過double write buffer再分兩次、每次1MB順序寫入共享表空間的物理磁盤上。而後立刻調用fsync函數,同步髒頁進磁盤上。因爲在這個過程當中,double write頁的存儲時連續的,所以寫入磁盤爲順序寫,性能很高;完成double write後,再將髒頁寫入實際的各個表空間文件,這時寫入就是離散的了。各模塊協做狀況以下圖(第一步應爲髒頁產生的redo記錄log buffer,而後log buffer寫入redo log file,爲簡化次要步驟直接連線表示):線程

 

 

根據上面所說的,能夠簡單的用如下的圖歸納:3d

相關文章
相關標籤/搜索