如何淺析mysql中的doublewrite-創(chuàng)新互聯(lián)

這篇文章給大家介紹如何淺析mysql中的double write ,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)是一家集網站建設,寶雞企業(yè)網站建設,寶雞品牌網站建設,網站定制,寶雞網站建設報價,網絡營銷,網絡優(yōu)化,寶雞網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。

介紹double write之前我們有必要了解partial page write 問題 : 
    InnoDB 的Page Size一般是16KB,其數據校驗也是針對這16KB來計算的,將數據寫入到磁盤是以Page為單位進行操作的。而計算機硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性,16K的數據,寫入4K 時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。
很多DBA 會想到系統(tǒng)恢復后,MySQL 可以根據redolog 進行恢復,而mysql在恢復的過程中是檢查page的checksum,checksum就是pgae的最后事務號,發(fā)生partial page write 問題時,page已經損壞,找不到該page中的事務號,就無法恢復。

一 double write是什么?
    Double write 是InnoDB在 tablespace上的128個頁(2個區(qū))是2MB;
其原理:
    為了解決 partial page write 問題 ,當mysql將臟數據flush到data file的時候, 先使用memcopy 將臟數據復制到內存中的double write buffer ,之后通過double write buffer再分2次,每次寫入1MB到共享表空間,然后馬上調用fsync函數,同步到磁盤上,避免緩沖帶來的問題,在這個過程中,doublewrite是順序寫,開銷并不大,在完成doublewrite寫入后,在將double write buffer寫入各表空間文件,這時是離散寫入。
如果發(fā)生了極端情況(斷電),InnoDB再次啟動后,發(fā)現(xiàn)了一個Page數據已經損壞,那么此時就可以從doublewrite buffer中進行數據恢復了。

二double write的缺點是什么?
    位于共享表空間上的double write buffer實際上也是一個文件,寫DWB會導致系統(tǒng)有更多的fsync操作, 而硬盤的fsync性能, 所以它會降低mysql的整體性能. 但是并不會降低到原來的50%. 這主要是因為: 
1) double write 是一個連接的存儲空間, 所以硬盤在寫數據的時候是順序寫, 而不是隨機寫, 這樣性能更高. 
2) 將數據從double write buffer寫到真正的segment中的時候, 系統(tǒng)會自動合并連接空間刷新的方式, 每次可以刷新多個pages;

三 double write在恢復的時候是如何工作的?
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本身失敗,那么這些數據不會被寫到磁盤,InnoDB此時會從磁盤載入原始的數據,然后通過InnoDB的事務日志來計算出正確的數據,重新 寫入到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就不用通過事務日志來計算了,而是直接用buffer的數據再寫一遍.
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.
--在恢復的時候,InnoDB直接比較頁面的checksum,如果不對的話,就從硬盤載入原始數據,再由事務日志 開始推演出正確的數據.所以InnoDB的恢復通常需要較長的時間.

四 我們是否一定需要 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的使用情況;
相關參數與狀態(tài)
Double write的使用情況:
show status like  "%InnoDB_dblwr%";
InnoDB_dblwr_pages_written 從bp flush 到 DBWB的個數
InnoDB_dblwr_writes            寫文件的次數
每次寫操作合并page的個數= InnoDB_dblwr_pages_written/InnoDB_dblwr_writes

關于如何淺析mysql中的double write 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當前題目:如何淺析mysql中的doublewrite-創(chuàng)新互聯(lián)
轉載來于:http://muchs.cn/article10/dcphdo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、Google、建站公司、營銷型網站建設、企業(yè)網站制作、品牌網站設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網站建設