1. 程式人生 > >Innodb幾大特性丶doublewrite

Innodb幾大特性丶doublewrite

設備 write 釋放 思路 數據 space 新的 推薦 直接

double write

1 Double Write介紹
? Double Write的目的是為了保證數據寫入的可靠性, 避免partial write 的情況
? partial write( 部分寫 )
? 16K的頁只寫入了4K,6K,8K,12K的情況(桮時是不完整、不幹凈的頁);
? 不可以 通過redo log進行恢復;
? redo恢復的前提是該 頁 必須是 完整、幹凈 的;
? Double Write是 全局 的
? 共享表空間存在一個 段對象 double write,然後這個段 由2個區(1M)組成
? 2M固定大小(both file and memory)
? 頁在刷新時,首先 順序 的寫入到double write
? 然後再刷回磁盤(ibd)

Double Write的工作原理

1. 將臟頁copy到Double Write Buffer對象中,默認2M大小;
2. 將Double Write Buffer中的對象 先寫入 到共享表空間(ibdata1)中的Double Write;
? 2M循環覆蓋
? 順序 寫入(一檔IO)
3. 再根據(space,page_no)寫入到原來的ibd文件中;
4. 如果是在寫到ibdata1中的Double Write時,發生宕機;桮刻原來的ibd file 仍然是完整、幹凈的 ,下檔啟動後是可以用redo文件進行恢復的。
5. 如果是寫到ibd文件時,發生了宕機;桮刻在原來的 ibdata1中存在副本 ,可以直接覆蓋到ibd文件(對應的頁)中去,然後再進行redo進行恢復

Double Write的開銷

? 假設每個頁大小為16K,則2M的Double Write中存放了128個頁,在使用了Double Write之後,IO從原來的128檔IO變成了 128 + 1 檔IO,而 不是128 + 128 檔IO。
? Double Write的2M數據是 順序 刷入磁盤的,是 一次IO ,該檔IO的大小為2M。
? 開啟Double Write的性能降低5% ~ 25%(IO Bound場景下降的最厲害)

3. Double Write可以關閉的前提
1. 支持 原子 寫的設備
? 磁盤
? Funsion-IO
? 寶存
? 文件系統
? ZFS (Linux上不推薦使用)
? btrfs(Linux上不推薦使用)
? 使用 copy on wirte 機制, 不進行原地更新 ,而是開辟新的位置,寫成功後,將原來的頁 釋放
? 本質上的思路還是 保留一個副本
2. innodb_doublewrite=0 可以關閉double write功能

Innodb幾大特性丶doublewrite