作為一名DBA,選擇自己的數據存儲在什么上面,應該是最基本的事情了。但是很多DBA卻容易忽略了這一點,我就是其中一個。之前對raid了解的並不多,本文就記錄下學習的raid相關知識。
一、RAID的基礎知識
【定義】RAID(Redundant Array of Independent Disk)是一種獨立冗余磁盤陣列。
1、為什么要使用RAID?
我們知道,單塊磁盤無論是從性能上、容量上、還是安全上都存在單點問題,如果把多塊硬盤組成一個group,當成一個邏輯驅動器,從而實現同時從多塊硬盤存取數據,那樣可以提高了存儲的吞吐量,同時也提高了存取速度和擴大存儲容量。
RAID(Redundant Array of Independent Disk 獨立冗余磁盤陣列)技術就是專門干這事的。RAID就是一種由多塊廉價磁盤構成的冗余陣列,在操作系統下是作為一個獨立的大型存儲設備出現。RAID可以充分發揮出多塊硬盤的優勢,可以提升硬盤速度,增大容量,提供容錯功能夠確保數據安全性,易於管理的優點,在任何一塊硬盤出現問題的情況下都可以繼續工作,不會受到損壞硬盤的影響,這對於數據庫存儲領域是非常必要的。
2、RAID的幾種工作級別
我們比較常用的RAID級別有RAID-0、RAID-1、RAID-10/RAID-01、RAID-5,其他的如RAID-3、RAID-4、RAID-6就不在此介紹了。
- RAID-0
RAID-0采用數據分條技術(Striped)把多塊磁盤串聯成一個更為龐大的磁盤組,可以提高磁盤的性能和吞吐量。它讀寫數據的速度是最快的,要求比較低,要求兩個磁盤即可做RAID-0,相對成本是最低的,但是RAID-0不提供冗余或奇偶校驗數據的功能,如果驅動器出現故障,數據將無法恢復,安全性最弱。一般只是在那些對性能要求高、數據安全性要求不高的情況下才被使用,不適合數據庫的存儲。
- RAID-1
RAID-1采用鏡像(Mirroring)的方式冗余數據。RAID-1要求至少兩個或2xN個磁盤,每次寫數據時會同時寫入鏡像盤。這種陣列可靠性很高,但其有效容量減小到總容量的一半,同時這些磁盤的大小應該相等,否則總容量只具有最小磁盤的大小。RAID-1的數據安全性在所有的RAID級別上來說是最好的。但是其磁盤的利用率卻只有50%,是所有RAID級別中最低的。
- RAID-10
由於RAID-0和RAID-1都存在明顯的優點和缺點,為了結合兩者的優點、避免兩者的缺點,從而產生了RAID-10,RAID-10適合用在速度需求高,又要完全容錯,當然成本也很多的應用。不過在做RAID-10時需要注意的是先做RAID-1,再做RAID-0還是先做RAID-0,再做RAID-1,二者還是有區別的。舉個栗子,假如現在有四塊磁盤:
先做RAID-0,再做RAID-1:每兩塊磁盤先做RAID-0,在此基礎上,再把兩個RAID-0做成RAID-1。這時如果A類或者B類磁盤同時有一個故障,整個RAID將不可用。
(RAID 0) A = (Drive A1 + Drive A2) (Striped) (RAID 0) B = (Drive B1 + Drive B2) (Striped) (RAID-1)AB = (A + B) (Mirrored)
先做RAID-1,再做RAID-0:每兩塊磁盤先做RAID-1,在此基礎上,再把兩個RAID-1做成RAID-0。這時只有A類或者B類磁盤兩個都故障時,整個RAID才不可用。
(RAID-1) A = (Drive A1 + Drive A2) (Mirrored) (RAID-1) B = (Drive B1 + Drive B2) (Mirrored) (RAID-0)AB = (A + B) (Striped)
綜合上面來看,先做RAID-1,再做RAID-0相對更安全,建議這種方式,所以我們平時說的RAID-10就是先做RAID-1,再做RAID-0。
- RAID-5
RAID-5應該處於RAID-0和RAID-1之間的一種工作模式,它盡量平衡RAID-0和RAID-1的優點和缺點,是我們平時使用比較多的一種模式。做RAID-5至少需要三塊磁盤,它采用校驗碼冗余數據,校驗信息分布在多個磁盤上,當數據每次寫入到磁盤上,同時還需要寫入校驗信息,因此寫入性能相對不如RAID-0。當某個磁盤出現故障,可以使用其他磁盤上校驗信息來恢復數據。相對RAID-1,它磁盤空間利用率為(N-1)/N
3、RAID的幾種工作級別優缺點
【注】以上的高、中、低只是相對於RAID-0、RAID-1、RAID-10、RAID-5而言。
二、如何判斷RAID級別、寫入策略、電池狀況
1、判斷RAID級別:MegaCli64工具輸入磁盤信息如下:
[root()@xxxx ~]# MegaCli64 -LdInfo -lAll -aALL Adapter 0 -- Virtual Drive Information: Virtual Drive: 0 (Target Id: 0) Name : RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0 Size : 278.875 GB Is VD emulated : No Mirror Data : 278.875 GB State : Optimal Strip Size : 64 KB Number Of Drives : 2 Span Depth : 1 Default Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Default Access Policy: Read/Write Current Access Policy: Read/Write Disk Cache Policy : Disabled Encryption Type : None Default Power Savings Policy: Controller Defined Current Power Savings Policy: None Can spin up in 1 minute: Yes LD has drives that support T10 power conditions: Yes LD's IO profile supports MAX power savings with cached writes: No Bad Blocks Exist: No PI type: No PI Is VD Cached: No Virtual Drive: 1 (Target Id: 1) Name : RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0 Size : 2.180 TB Is VD emulated : Yes Mirror Data : 2.180 TB State : Optimal Strip Size : 64 KB Number Of Drives per span : 2 Span Depth : 3 Default Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Default Access Policy: Read/Write Current Access Policy: Read/Write Disk Cache Policy : Disabled Encryption Type : None Default Power Savings Policy: Controller Defined Current Power Savings Policy: None Can spin up in 1 minute: No LD has drives that support T10 power conditions: No LD's IO profile supports MAX power savings with cached writes: No Bad Blocks Exist: No PI type: No PI Is VD Cached: No
網上有人僅僅通過RAID Level列中的Primary-1, Secondary-0, RAID Level Qualifier-0來判斷,我認為不是很准確。先來了解下Primary、Secondary、RAID Level Qualifier啥意思?
Primary字段:基本上可以確定RAID的級別,但是無法區分是RAID-1和RAID-10,因為有情況下他們的Primary值都是Primary-1, Secondary-0, RAID Level Qualifier-0
在這種情況下如何區分RAID-1和RAID-10?我認為還得結合另外兩列進行判斷:
Number Of Drives per span : 2 #每個區段有2塊磁盤 Span Depth : 3 #一共三個區段
結合primary-1,該RAID表示一共六塊磁盤,每兩個做RAID-1,最后將三個RAID-1做RAID-0
【總結:如何判斷RAID級別】:
1) 除了RAID-1和RAID-10,其他級別通過Primary字段值就可以判斷;
2) 至於RAID-1和RAID-10,還需要結合Number Of Drives (per span)、Span Depth兩列的值,如果Span Depth值為1表示為RAID-1,不為1表示RAID-10;還有一種情況:Primary-1, Secondary-3, RAID Level Qualifier-0也是表示RAID-10;
2、判斷RAID寫入策略和電池狀態
RAID的寫入策略對IO性能有很大影響,有兩種寫入策略:
WriteBack:表示寫入到磁盤緩存上,寫入性能好,如果采用此策略,RAID必須支持電池可用,否則一旦斷點,數據將丟失。
WriteThrough:表示直接寫入到硬盤上,寫入性能沒有WriteBack好,一般沒有電池時采用此策略
2.1)查看RAID的寫入策略
[root()@xxxx ~]# MegaCli64 -LDInfo -Lall -aALL|grep 'Cache Policy' ********************************************************************************** Default Cache Policy: WriteBack, ReadAdaptive, Direct, Write Cache OK if Bad BBU Current Cache Policy: WriteBack, ReadAdaptive, Direct, Write Cache OK if Bad BBU
以上表示采用WriteBack(回寫)策略,如果電池壞了也強制寫入cache
Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
如果是這個,表示采用WriteThrough策略
**********************************************************************************
Disk Cache Policy : Disabled #表示硬盤的cache,一般這里禁用,防止丟失數據
2.2)查看電池狀態
[root()@xxxx ~]# MegaCli64 -adpbbucmd -aall |grep -E 'Battery State|Charger Status|isSOHGood|Relative State of Charge' Battery State : Operational #電池狀態,operational表示正在運行 Relative State of Charge: 98 % #電池電量,如果低於15%,那么寫入策略會由WB轉變為WC,IO性能下降,需要關注 Charger Status: Complete #充電情況,表示已完成 isSOHGood: Yes #不是Yes需要關注
三、MySQL適合的RAID存儲方案
通過上面對RAID的了解,我們已經知道各級別RAID的優缺點,對於MySQL數據庫的存儲,如何選擇RAID級別呢?
我們可以根據MySQL各種文件類型分別選擇,MySQL數據庫重要的文件類型有:
1、數據文件(frm,ibd):存儲核心的數據,非常重要,安全性要求高,同時需要頻繁的寫入、更新數據,磁盤性能要求也比較高,首先建議物理磁盤是SSD,對於RAID的選擇,如果預算足夠,建議RAID-10,其次是RAID-5 2、二進制日志文件:寫入非常頻繁,寫性能要求高,由於從庫依賴該文件,安全性也很重要,綜合成本考慮,可以用兩塊SATA硬盤,做成RAID-1即可。 3、redo文件,共享表空間文件:安全性要求高,如果預算足夠,RAID-10,通常RAID-1也是可以的,一般而言,redo文件和共享表空間和數據文件存儲在一起即可。
參考文章:
http://www.chinastor.com/a/jishu/raid/yes.html
http://blog.csdn.net/haiross/article/details/38557373
http://ju.outofmemory.cn/entry/92025