MySQL--Double Write

##=======================================##
目前大部分服務器使用4K或512B來格式化磁盤,而Innodb存儲引擎使用默認16K的數據頁,在寫入16KB數據頁時,可能存在頁面部分數據寫入到磁盤便發生宕機的狀況,該問題被稱爲部分寫失效(Partial page write)。雖然Innodb存儲引擎提供redo log來保證事務ACID特性和數據庫宕機恢復,但redo log中存放的是頁面的物理操做,而非頁面的數據,所以沒法利用redo log來解決部分寫失效的問題。數據庫

##=======================================##
爲避免部分寫失效問題,MySQL引入double write特性,即在刷新髒頁過程當中,先使用memcopy把髒頁數據複製到內存的double write buffer,而後先將1MB數據寫到共享表空間,最後調用fsync來將數據寫到磁盤,分兩次寫操做來將髒頁刷新到磁盤。
一、若是在髒頁寫入到共享表空間時發生宕機,那麼數據庫在磁盤上的數據頁面未受破壞,能夠經過redo log來恢復到宕機前的狀態。
二、若是在髒頁寫入到數據庫在磁盤對應的頁面時發生宕機,那麼因爲共享表空間中有最新數據,能夠經過該數據來恢復,而後再根據redo log來恢復。服務器

##=======================================##
MySQL在共享表空間(system tablespace)中存在2M的空間,分爲2個單元功128個數據頁,主要分爲兩類操做:
一、批量刷新髒頁:該類操做由後臺線程發起,不會影響前臺操做,屬於異步寫操做,使用128個數據頁中的120個。
二、Single Page Flash:該類操做由用戶線程發起,在只有在Buffer pool中的free page不夠時觸發,須要儘快刷新髒頁以替換出空閒頁面,屬於同步寫操做,使用128個數據頁中的8個。異步

在MySQL的提供兩個狀態值來展現髒頁刷新狀況:
一、Innodb_dblwr_pages_written :刷新到磁盤的髒頁總數
二、Innodb_dblwr_writes:刷新髒頁的次數性能

在Buffer pool夠用時,MySQL主要經過批量刷新方式來完成寫髒頁操做,而批量刷新每次刷新64個髒頁(1MB)到磁盤,所以Innodb_dblwr_pages_written:Innodb_dblwr_writes的比值遠遠低於61:1時,代表系統壓力較低。測試

##=======================================##
Double Write影響
因爲Double Write寫共享表空間時是順序寫操做,且將髒頁從double write buffer中寫到正在的物理磁盤時,系統自動合併相鄰的髒頁,實現一次刷新多個髒頁,所以Double Write對影響影響較小,Percona測試發現約影響5%的性能。atom

對於SDD硬盤,Double Write會增長磁盤磨損。spa

##=======================================##
Mariadb/MySQL的改進
引入Double Write特性是爲解決部分寫失效問題,最根本緣由是16KB的數據頁沒法原子寫入到磁盤,但若是使用FusionIO/DirectFS文件系統時,能夠得到原子寫特性。
在Mariadb中使用innodb_use_atomic_writes來控制原子寫行爲,當該開始開啓時,若是啓動時檢查到支持atomic write時,會自動關閉掉double write特性。
在MySQL 5.7版本中一樣支持FusionIO的Atomic Write特性,對於支持原子寫的文件系統,會自動關閉double write特性。線程

##=======================================##
Facebook改進
因爲服務器宕機並致使部分寫失效問題的機率較低,因而Facebook提供選項來關閉DoubleWrite特性,僅在刷新Page的過程前記錄要刷新Page號,服務器宕機恢復時,根據這些Page號讀取出相關頁面根據checksum檢查是否存在頁面損壞,若是損壞則經過從庫或備份來恢復數據。htm

##=======================================##
Percona 5.7版本改進
在Percona 5.7版本中,將Double Write Buffer擴展到每一個Buffer Pool中,按照每一個Buffer Pool的lru鏈表來進行髒頁刷新,提高刷新效率。blog

##=======================================##
摘抄自:
https://m.aliyun.com/yunqi/articles/80423
https://yq.aliyun.com/articles/50627
http://stor.51cto.com/art/201804/570942.htm

##=======================================##

相關文章
相關標籤/搜索