doublewrite 默認(rèn)存放在ibdata1中共享表空間里,默認(rèn)大小2M,寫之前將臟頁寫入到innodb buffer中的doublewrite buffer(2M)中,將2M的buffer數(shù)據(jù)直接寫入到共享表空間的doublewrite段中,當(dāng)寫共享表空間的doublewrite失敗了,沒有關(guān)系,因為此時的數(shù)據(jù)文件ibd中的數(shù)據(jù)是干凈的,處于一致的狀態(tài),可以通過redo進(jìn)行恢復(fù),【先寫共享表空間的double 再寫數(shù)據(jù)文件ibd】,doublewrite是覆蓋寫,共享表空間只存2M給doublewrite用。Redo能恢復(fù)的頁一定是干凈的完整的一致的,因為mysql會有partial write所以引入doublewrite機(jī)制。
專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)長海免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
double write buffer à double write(ibdata1) à ibd
如果頁大小是 16k ,那么就有 128 個頁 (1M) 需要寫,但是 128 個頁寫入到共享表空間是 1 次 IO 完成,也就是說 doublewrite 寫開銷是 1+128 次。其中 128 次是寫數(shù)據(jù)文件表空間。
doublewrite 寫入是順序的,性能開銷取決于寫入量,通常 5%-25% 的性能影響。
當(dāng)系統(tǒng)負(fù)載非常高的情況下,性能開銷減少 25%
Double write 技術(shù)對用戶來說是透明的,我們只關(guān)注下面參數(shù)開啟或關(guān)閉即可。
mysql> show variables like '%double%write%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | innodb_doublewrite | ON | +--------------------+-------+ 1 row in set (0.00 sec)
1、Fursion-io 原子寫,如果每次寫16k就是16k,每次寫都是16k不會出現(xiàn)部分寫partial write寫4k的情況。設(shè)備帶來的益處。
2、 特定的文件系統(tǒng),支持原子寫。 b-tree file system
介紹double write之前我們有必要了解partial page write 問題 :
InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗也是針對這16KB來計算的,將數(shù)據(jù)寫入到磁盤是以Page為單位進(jìn)行操作的。而計算機(jī)硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性,16K的數(shù)據(jù),寫入4K 時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。
很多DBA 會想到系統(tǒng)恢復(fù)后,MySQL 可以根據(jù)redolog 進(jìn)行恢復(fù),而mysql在恢復(fù)的過程中是檢查page的checksum,checksum就是pgae的最后事務(wù)號,發(fā)生partial page write 問題時,page已經(jīng)損壞,找不到該page中的事務(wù)號,就無法恢復(fù)。
一 double write是什么?
Double write 是InnoDB在 tablespace上的128個頁(2個區(qū))是2MB;
其原理:
為了解決 partial page write 問題 ,當(dāng)mysql將臟數(shù)據(jù)flush到data file的時候, 先使用memcopy 將臟數(shù)據(jù)復(fù)制到內(nèi)存中的double write buffer ,之后通過double write buffer再分2次,每次寫入1MB到共享表空間,然后馬上調(diào)用fsync函數(shù),同步到磁盤上,避免緩沖帶來的問題,在這個過程中,doublewrite是順序?qū)?,開銷并不大,在完成doublewrite寫入后,在將double write buffer寫入各表空間文件,這時是離散寫入。
如果發(fā)生了極端情況(斷電),InnoDB再次啟動后,發(fā)現(xiàn)了一個Page數(shù)據(jù)已經(jīng)損壞,那么此時就可以從doublewrite buffer中進(jìn)行數(shù)據(jù)恢復(fù)了。
二double write的缺點是什么?
位于共享表空間上的double write buffer實際上也是一個文件,寫DWB會導(dǎo)致系統(tǒng)有更多的fsync操作, 而硬盤的fsync性能, 所以它會降低mysql的整體性能. 但是并不會降低到原來的50%. 這主要是因為:
1) double write 是一個連接的存儲空間, 所以硬盤在寫數(shù)據(jù)的時候是順序?qū)? 而不是隨機(jī)寫, 這樣性能更高.
2) 將數(shù)據(jù)從double write buffer寫到真正的segment中的時候, 系統(tǒng)會自動合并連接空間刷新的方式, 每次可以刷新多個pages;
三 double write在恢復(fù)的時候是如何工作的?
If there’s a partial page write to the doublewrite buffer itself, the original page will still be on disk in its real location.-
--如果是寫doublewrite buffer本身失敗,那么這些數(shù)據(jù)不會被寫到磁盤,InnoDB此時會從磁盤載入原始的數(shù)據(jù),然后通過InnoDB的事務(wù)日志來計算出正確的數(shù)據(jù),重新 寫入到doublewrite buffer.
When InnoDB recovers, it will use the original page instead of the corrupted copy in the doublewrite buffer. However, if the doublewrite buffer succeeds and the write to the page’s real location fails, InnoDB will use the copy in the doublewrite buffer during recovery.
--如果 doublewrite buffer寫成功的話,但是寫磁盤失敗,InnoDB就不用通過事務(wù)日志來計算了,而是直接用buffer的數(shù)據(jù)再寫一遍.
InnoDB knows when a page is corrupt because each page has a checksum at the end; the checksum is the last thing to be written, so if the page’s contents don’t match the checksum, the page is corrupt. Upon recovery, therefore, InnoDB just reads each page in the doublewrite buffer and verifies the checksums. If a page’s checksum is incorrect, it reads the page from its original location.
--在恢復(fù)的時候,InnoDB直接比較頁面的checksum,如果不對的話,就從硬盤載入原始數(shù)據(jù),再由事務(wù)日志 開始推演出正確的數(shù)據(jù).所以InnoDB的恢復(fù)通常需要較長的時間.
四 我們是否一定需要 double write ?
In some cases, the doublewrite buffer really isn’t necessary—for example, you might want to disable it on slaves. Also, some filesystems (such as ZFS) do the same thing themselves, so it is redundant for InnoDB to do it. You can disable the doublewrite buffer by setting InnoDB_doublewrite to 0.
五 如何使用 double write
InnoDB_doublewrite=1表示啟動double write
show status like 'InnoDB_dblwr%'可以查詢double write的使用情況;
相關(guān)參數(shù)與狀態(tài)
Double write的使用情況:
show status like "%InnoDB_dblwr%";
InnoDB_dblwr_pages_written 從bp flush 到 DBWB的個數(shù)
InnoDB_dblwr_writes 寫文件的次數(shù)
每次寫操作合并page的個數(shù)= InnoDB_dblwr_pages_written/InnoDB_dblwr_writes
網(wǎng)頁標(biāo)題:MySQLdoublewrite
標(biāo)題來源:http://muchs.cn/article16/gdopdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、定制網(wǎng)站、網(wǎng)頁設(shè)計公司、微信小程序、面包屑導(dǎo)航、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)