問題背景描述: 在MySQL中執行SQL語句,比如insert,賊慢,明明可能也就只是一行數據的插入,數據量很小,但是耗費的時間卻很多,為什麼?一、存儲結構分析MySQL存儲結構圖:解析:1、讀操作:記憶體讀-->cache緩存讀-->磁碟物理讀讀取到的數據會按上述順序往回送。2、寫操作:記憶體數據直接 ...
問題背景描述: 在MySQL中執行SQL語句,比如insert,賊慢,明明可能也就只是一行數據的插入,數據量很小,但是耗費的時間卻很多,為什麼?
一、存儲結構分析
MySQL存儲結構圖:
解析:
1、讀操作:記憶體讀-->cache緩存讀-->磁碟物理讀
讀取到的數據會按上述順序往回送。
2、寫操作:記憶體數據直接寫入cache緩存(非常快)-->寫入disk
由上可知,MySQL之所以讀寫速度快,cache在其中起到了關鍵作用。
1、Cache緩存特點:
1、速度快
2、掉電數據丟失
3、容量有限
2、保護數據安全(防止意外掉電的數據丟失)應對措施:
在存儲中,增加BBU(電池備份單元,就是電池),在掉電後,可以把緩存中的數據寫到磁碟中,保證數據不會丟失。
如果沒有提供BBU或者BBU壞了,記憶體數據就不會寫入cache緩存中,就會直接寫入disk中;相較於寫入記憶體,寫入磁碟的速度就大打折扣(萬倍之差)。與此同時,因為慢下來的“寫”占了絕大部分“讀”的帶寬。所以BBU問題是讀寫性能差的一很大的影響因素。
3、cache緩存容量有限
(4G、8G、16G、32G),系統為了保持cache有用,會周期性的將cache緩存的數據寫入磁碟中,避免cache被占滿。
二、存儲寫入速度慢分析
資料庫-->寫入速度慢-->系統hang住
Q:如何判斷寫入速度慢?
A:
1、懷疑BBU問題
監控BBU的bug,解決:重啟BBU
2、cache被占滿(類同於BBU壞了的情況)
1、海量的寫入數據占滿cache緩存,判斷:
shell> iostat -x
mysql> show global status like 'handler_write';
2、cache寫入disk的速度慢了(排水速度遠小於註水速度)
硬碟I/O異常,負載過高:資料庫海量的物理讀(異常SQL),判斷:
mysql> show status like 'Innodb_buffer_pool_reads';
3、存儲性能差問題
1、存儲設備差,更新設備
2、災備同步風險,“再好的工程師,敵不過藍翔的挖掘機、農民工的鋤頭……”
三、關於BBU
英文簡稱:BBU
英文全稱:Battery Backup Unit
中文全稱:電池備份單元,是電池
1、作用:
在掉電後,把緩存中的數據寫到硬碟中,保證數據不會丟失;
是為了意外掉電刷臟數據的一種保護措施;
能夠在系統外部供電失效的情況下,提供後備電源支持,以保證存儲陣列中業務數據的安全性。
2、許多存儲設備都會配備BBU
BBU在電源供應出現問題的時候,為RAID控制器緩存提供電源。當電源斷電時,BBU電力可以使控制器內緩存中的數據可以保存一定時間(根據BBU的型號而決定)。用戶只需要在BBU電力耗盡(電池有限)之前恢復正常供電,緩存中的數據即可被完整的寫回RAID中,避免斷電導致數據丟失。
和伺服器電池有點不一樣,伺服器中,在配置RAID卡的時候可以配一個電池,在系統掉電後,能維持記憶體中的數據不丟失,但時間有限,大約12個小時左右,假如是12小時,如果在12內沒有恢復,記憶體中的數據就會丟失;
3、超級電容
伺服器還有一種保護方式,叫超級電容,也是和RAID卡配套的,他能在伺服器掉電後把緩存中的數據寫入到電容中,而且會永久保存,類似寫入硬碟,實際上是寫入電容,你就理解成寫入U盤把。他比電池好,即使伺服器在12個小時後沒有恢覆電源,也不會造成數據丟失。