InnoDB中的doublewrite buffer技術原理

先簡單解釋下什麼是雙寫緩衝。InnoDB使用了一種叫作doublewrite的特殊文件flush技術,在把pages寫到date files以前,InnoDB先把它們寫到一個叫doublewrite buffer的連續區域內,在寫doublewrite buffer完成後,InnoDB纔會把pages寫到data file的適當的位置。若是在寫page的過程當中發生意外崩潰,InnoDB在稍後的恢復過程當中在doublewrite buffer中找到無缺的page副本用於恢復。函數

瞭解partial page write問題

InnoDB的page size通常是16KB,其數據校驗也是針對這16KB來計算的,將數據寫入到磁盤是以page爲單位進行操做的。操做系統寫文件是以4KB做爲單位的,那麼每寫一個InnoDB的page到磁盤上,操做系統須要寫4個塊。而計算機硬件和操做系統,在極端狀況下(好比斷電)每每並不能保證這一操做的原子性,16K的數據,寫入4K時,發生了系統斷電或系統崩潰,只有一部分寫是成功的,這種狀況下就是partial page write(部分頁寫入)問題。這時page數據出現不同的情形,從而造成一個"斷裂"的page,使數據產生混亂。這個時候InnoDB對這種塊錯誤是無 能爲力的.性能

有人會認爲系統恢復後,MySQL能夠根據redo log進行恢復,而MySQL在恢復的過程當中是檢查page的checksum,checksum就是pgae的最後事務號,發生partial page write問題時,page已經損壞,找不到該page中的事務號,就沒法恢復。spa

doublewrite buffer是什麼?

doublewrite buffer是InnoDB在tablespace上的128個頁(2個區)大小是2MB。爲了解決 partial page write問題,當MySQL將髒數據flush到data file的時候, 先使用memcopy將髒數據複製到內存中的doublewrite buffer,以後經過doublewrite buffer再分2次,每次寫入1MB到共享表空間,而後立刻調用fsync函數,同步到磁盤上,避免緩衝帶來的問題,在這個過程當中,doublewrite是順序寫,開銷並不大,在完成doublewrite寫入後,再將double write buffer寫入各表空間文件,這時是離散寫入。操作系統

因此在正常的狀況下, MySQL寫數據page時,會寫兩遍到磁盤上,第一遍是寫到doublewrite buffer,第二遍是從doublewrite buffer寫到真正的數據文件中。若是發生了極端狀況(斷電),InnoDB再次啓動後,發現了一個page數據已經損壞,那麼此時就能夠從doublewrite buffer中進行數據恢復了。日誌

doublewrite的缺點是什麼?

位於共享表空間上的doublewrite buffer實際上也是一個文件,寫共享表空間會致使系統有更多的fsync操做, 而硬盤的fsync性能因素會下降MySQL的總體性能,可是並不會下降到原來的50%。這主要是由於:code

  1. doublewrite是在一個連續的存儲空間, 因此硬盤在寫數據的時候是順序寫,而不是隨機寫,這樣性能更高。
  2. 將數據從doublewrite buffer寫到真正的segment中的時候,系統會自動合併鏈接空間刷新的方式,每次能夠刷新多個pages。

是否必定須要doublewrite

在一些狀況下能夠關閉doublewrite以獲取更高的性能。好比在slave上能夠關閉,由於即便出現了partial page write問題,數據仍是能夠從中繼日誌中恢復。設置InnoDB_doublewrite=0便可關閉doublewrite buffer。事務

相關文章
相關標籤/搜索