1. 程式人生 > >RAID在數據庫存儲上的應用

RAID在數據庫存儲上的應用

class 很好 建議 遞增 inf bsp n) 無法 計算公式

隨著單塊磁盤在數據安全、性能、容量上呈現出的局限,磁盤陣列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出現了,RAID把多塊獨立的磁盤按不同的方式組合起來,形成一個磁盤組,以獲得比單塊磁盤更高的數據安全、性能、容量。

一. 常見的RAID 級別
RAID有RAID0~RAID7幾種級別,另外還有一些復合的RAID模式,比如:RAID10、RAID01、RAID50、RAID53。

常用的RAID模式有RAID0、RAID1、RAID5、RAID10。


1. RAID0
RAID0也就是常說的數據條帶化(Data Stripping),數據被分散存放在陣列中的各個物理磁盤上,需要2塊及以上的硬盤,成本低,性能和容量隨硬盤數遞增,在所有的RAID級別中,RAID 0的速度是最快的,但是RAID 0沒有提供冗余或錯誤修復能力,如果一個磁盤(物理)損壞,則所有的數據都無法使用。

技術分享圖片
對於有容災模式的RAID陣列,某塊磁盤損壞時,只要換上新的硬盤即可,陣列系統會自動同步數據到新的硬盤。(不支持熱插拔的話,需要先關機再開機)

2. RAID1
RAID1也就是常說的數據鏡像(Data Mirroring),2塊及以上的硬盤(偶數個),被分為2組,數據在每組磁盤中各有一份,若其中一組有磁盤損壞,另一組可以保證數據訪問不會中斷。RAID1同RAID0一樣,有很好的讀取速度,但是寫的速度,有所下降。

技術分享圖片


3. RAID5
RAID 5 是一種數據安全、性能、容量、成本、可行性都相對兼顧的解決方案,正因此,類似的RAID2、RAID3、RAID4、RAID6很少得以實際應用。
RAID5需要3塊及以上的硬盤, 它不是對存儲的數據直接進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成陣列的各個磁盤上,簡單來說就是:任意壞掉一塊盤時,另外的N-1塊盤可以利用奇偶校驗信息,把這塊壞掉的磁盤上的數據恢復出來。

RAID 5可以理解為是RAID 0和RAID 1的折衷方案,有和RAID 0相近似的數據讀取速度,有比RAID1低的容災能力(RAID5只允許一塊磁盤損壞),因為多了奇偶校驗信息,寫入數據的速度比RAID1慢。

技術分享圖片

4. RAID10
RAID10,名稱上便可以看出是RAID0與RAID1的結合體,顯然需要至少4塊磁盤。不過,先RAID0後RAID1,還是先RAID1後RAID0,是不一樣的。

RAID01,是先做RAID0,然後對2組RAID0再做RAID1,假設此時某個RAID0壞掉一塊磁盤,這個RAID0隨即不可用,所有的IO全部指向剩下的那個RAID0;

技術分享圖片


RAID10,是先做RAID1,然後對2組RAID1再做RAID0,假設此時某個RAID1壞掉一塊磁盤,當前RAID1仍然能提供服務,並且另一個RAID1也同時可以壞掉一塊磁盤。

技術分享圖片
所以,我們通常選擇RAID10,而不是RAID01。

5. 不同RAID級別的讀寫性能
假設都用4塊磁盤,RAID0,RAID1,RAID5,RAID10在多線程/多CPU情況下,都可以同時讀取多塊磁盤,讀的性能都很不錯;
寫的性能(IOPS)依次遞減,大致是:RAID0 > RAID10 > RAID1 > RAID5。

二. RAID的空間計算
在做RAID時,通常選擇統一規格的磁盤,如果真的有不同空間大小、不同讀寫速度的磁盤,陣列系統會以空間小、速度低的為標準,空間大、速度高的磁盤向下兼容。比如:100G,50G的2塊磁盤做RAID0,得到的空間為50G*2 = 100G。

RAID的空間計算公式:
RAID0的空間:Disk Size * N
RAID1的空間:(Disk Size * N)/2
RAID5的空間:((N-1)/N) * (Disk Size * N) = (N-1) * Disk Size
RAID10的空間:(Disk Size * N/2)/2 + (Disk Size * N/2)/2 = (Disk Size * N)/2

假設都用4塊磁盤,每塊磁盤都為100G
RAID0的空間:100G * 4 = 400G
RAID1的空間:(100G * 4)/2 = 200G
RAID5的空間:(4-1) * 100G = 300G
RAID10的空間: (100G * 4)/2 = 200G

三. RAID的IOPS計算
1. 單塊硬盤的IOPS是固定的
關於單塊磁盤IOPS的計算,在 0. 磁盤讀寫與數據庫的關系中有詳細的方法,但通常這個值是相對固定的,不需要重復計算,參考如下:
技術分享圖片
可以發現,同樣轉數,不同型號的單塊磁盤,IOPS都維持在一個類似的數量級。

2. RAID的IOPS計算
有了單塊磁盤的IOPS,那麽多塊磁盤的IOPS計算就很簡單了,比如,對於RAID0或者單純串聯磁盤(JBOD: just a bunch of disks)的存儲來說,10塊175 IOPS的磁盤的總IOPS就是10*175 = 1750 IOPS。
但是對於其他RAID級別並不是這樣,因為RAID有多次寫IO的開銷存在,簡單來說就是:對RAID發起一次寫IO,RAID內部會有不止一次的寫IO發生,RAID內部的IO開銷如下:
技術分享圖片
從圖中得到公式:用戶讀IO+N*用戶寫IO = 總IOPS (N就是RAID內部的IO開銷次數)

假設用戶讀寫請求各一半(50%),同樣還是以10塊175 IOPS的磁盤為例:
50% * 用戶總IO請求數 + N * (50% * 用戶總IO請求數) = 175 IOPS * 10

以RAID1為例,那麽N = 2,上式變為:1.5 *用戶總IO請求數 = 1750 IOPS
用戶總IO請求數 = 1167 IOPS
這就是10塊175 IOPS的磁盤做了RAID1,所能提供的IOPS。

3. RAID的IOPS計算在現實中的應用
在實際使用中,我們通常不是計算現有RAID的IOPS,而是反過來:選擇好磁盤規格,RAID模式,測試出系統的讀寫比例,系統需要達到的IOPS,然後看看,需要多少塊硬盤來完成陣列,才能達到這樣的IOPS需求?

假設:選擇了175 IOPS的磁盤,做RAID1,系統讀寫比例為60%:40%,系統需要達到2000 IOPS
問:要配置多少塊這樣規格的硬盤?

把上面的公式改為通用公式:
reads * Workload_IOPS + writes_impact * (writes * Workload_IOPS) = 175 * M
60% * 2000 + 2 * (40% * 2000) = 175 * M
M = 16 (也就是說,要達到指定的2000 IOPS,RAID1需要配置16塊175 IOPS的磁盤)

可能有人會覺得,系統的讀寫請求比例,系統需要達到多少IOPS,並不知道,如果沒有前期測試的話,那麽只能根據經驗來估測了。

四. RAID在數據庫存儲上的應用
以SQL Server數據庫為例,看下不同的RAID級別適用於什麽場景:
RAID0,由於沒有容災機制,很少被單獨使用。
有人提到過tempdb可以放在RAID0,因為tempdb不用擔心丟數據,事實上tempdb故障了,SQL Server是不能正常運行的,所以這麽做是不推薦的,建議把tempdb當成用戶數據庫來對待;

RAID1,操作系統、SQL Server實例、日誌文件;
RAID5,數據文件,備份文件;
RAID10,所有類型都適用,不過考慮成本,通常不會全部使用RAID10。

RAID在數據庫存儲上的應用