1. 關於Doublewrite Buffe的總結
Doublewrite Buffer:Doublewrite Buffer出現的初衷是防止buffer pool中的髒頁刷新到磁盤中,出現部分寫的問題,innodb頁大小一般為16k,而Linux操作系統的block size一般為4k。這樣在刷新的過程中,如果OS發生crash或者停電,會導致16k的頁塊只有部分block刷新到磁盤中,而其它的沒有,這樣會導致數據不一致。Doublewrite Buffer放到系統表空間中,有100個頁的大小,當innodb將buffer pool中的頁刷新到磁盤中時,會首先copy到Doublewrite Buffer中,再刷新到磁盤中。如果在刷新磁盤的過程中出現問題,innodb會利用doublewrite buffer中存儲的頁來恢復數據。如果在刷新doublewrite buffer的過程中出現問題,則會利用物理磁盤上的原始頁和redo log來恢復數據。
Doublewrite Buffer的啟用會對MySQL的整體性能降低5-10%,可通過innodb_doublewrite參數進行設置,默認是開啟的。
Percona有個單獨的參數來設置Doublewrite Buffer的存放位置,innodb_doublewrite_file。
2. 根據以下內容,演算推導出機器相關的指標:
響應時間 查詢和操作請求ms級返回。
數據總量 1年內數據量大約500G數據量。
每秒請求量 每秒有3w次請求。
讀寫比 讀寫比是1:1。
重要程度 核心系統,P1級故障。
其他說明 數據記錄長度約為1KB,數據1周內數據操作頻繁
推導過程:
Step1:1年內數據大約500G
結果:每秒產生的數據量大約诶500*1024*1024/(365*24*60*60)=17KB/s
Step2: 每秒有3w次請求,讀寫比是1:1
結果:每秒讀請求為3w/2=1.5w/s,每秒寫請求為3w/2=1.5w/s
Step3: 記錄長度大約為1KB
結果:根據Step1得出的結果,每秒insert的速率為17次/s,根據Step2得到的每秒寫請求為1.5w/s,可知每秒14983次為delete和update操作。由於MySQL數據讀寫操作按照頁來處理,頁大小為16KB,假設每次操作的頁都不相同。那麼每秒寫操作數據量為:16KB*1.5w=234MB/s,每秒讀操作數據量為:16KB*1.5w=234MB/s
Step4:數據1周內數據操作頻繁
結果:熱數據量為:(500/365)*7=9.6G
Step5:操作ms級返回
操作ms級別返回,那麼需要盡可能的將熱數據加載到內存。按照內存命中率接近100%計算的話,那麼Innodb buffer大約為9.6GB,而其他內存需求大概為1~2GB,因此內存超配大約為12GB。按照超配原則,寫帶寬(wBPS)限制為300MB/s;讀帶寬(rBPS)限制為300MB/s。