隨著單塊磁碟在數據安全、性能、容量上呈現出的局限,磁碟陣列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出現了,RAID把多塊獨立的磁碟按不同的方式組合起來,形成一個磁碟組,以獲得比單塊磁碟更高的數據安全、性能、容量。 一. 常見的R ...
隨著單塊磁碟在數據安全、性能、容量上呈現出的局限,磁碟陣列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出現了,RAID把多塊獨立的磁碟按不同的方式組合起來,形成一個磁碟組,以獲得比單塊磁碟更高的數據安全、性能、容量。
一. 常見的RAID 級別
RAID有RAID0~RAID7幾種級別,另外還有一些複合的RAID模式,比如:RAID10、RAID01、RAID50、RAID53。
常用的RAID模式有RAID0、RAID1、RAID5、RAID10。
- RAID0
RAID0也就是常說的數據條帶化(Data Stripping),數據被分散存放在陣列中的各個物理磁碟上,需要2塊及以上的硬碟,成本低,性能和容量隨硬碟數遞增,在所有的RAID級別中,RAID 0的速度是最快的,但是RAID 0沒有提供冗餘或錯誤修複能力,如果一個磁碟(物理)損壞,則所有的數據都無法使用。
對於有容災模式的RAID陣列,某塊磁碟損壞時,只要換上新的硬碟即可,陣列系統會自動同步數據到新的硬碟。(不支持熱插拔的話,需要先關機再開機)
- RAID1
RAID1也就是常說的數據鏡像(Data Mirroring),2塊及以上的硬碟(偶數個),被分為2組,數據在每組磁碟中各有一份,若其中一組有磁碟損壞,另一組可以保證數據訪問不會中斷。RAID1同RAID0一樣,有很好的讀取速度,但是寫的速度,有所下降。
- RAID5
RAID 5 是一種數據安全、性能、容量、成本、可行性都相對兼顧的解決方案,正因此,類似的RAID2、RAID3、RAID4、RAID6很少得以實際應用。 RAID5需要3塊及以上的硬碟, 它不是對存儲的數據直接進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成陣列的各個磁碟上,簡單來說就是:任意壞掉一塊盤時,另外的N-1塊盤可以利用奇偶校驗信息,把這塊壞掉的磁碟上的數據恢復出來。 RAID 5可以理解為是RAID 0和RAID 1的折衷方案,有和RAID 0相近似的數據讀取速度,有比RAID1低的容災能力(RAID5只允許一塊磁碟損壞),因為多了奇偶校驗信息,寫入數據的速度比RAID1慢。
- 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。
- 不同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計算
- 單塊硬碟的IOPS是固定的 關於單塊磁碟IOPS的計算,中有詳細的方法,但通常這個值是相對固定的,不需要重覆計算,參考如下:
可以發現,同樣轉數,不同型號的單塊磁碟,IOPS都維持在一個類似的數量級。
- 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。
可參考寫懲罰(write penalty)
- RAID的IOPS計算在現實中的應用 在實際使用中,我們通常不是計算現有RAID的IOPS,而是反過來:選擇好磁碟規格,RAID模式,測試出系統的讀寫比例,系統需要達到的IOPS,然後看看,需要多少塊硬碟來完成陣列,才能達到這樣的IOPS需求?
假設:選擇了175 IOPS的磁碟,做RAID1,系統讀寫比例為60%:40%,系統需要達到2000 IOPS 問:要配置多少塊這樣規格的硬碟?
把上面的公式改為通用公式: reads * WorkloadIOPS + writesimpact * (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,由於沒有容災機制,很少被單獨使用。
RAID1,操作系統、SQL Server實例、日誌文件; RAID5,數據文件,備份文件; RAID10,所有類型都適用,不過考慮成本,通常不會全部使用RAID10。 五、使用mdadm創建RAID 創建RAID陣列
我們可以通過 mdadm 命令來創建軟體RAID,比如下麵命令可以創建一個RAID5
sudo mdadm --create /dev/md0 -a yes -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd -x 1 /dev/sde
其中
--create /dev/md0 創建一個新RAID,名字叫做 /dev/md0 -a yes 自動在/dev/下創建對應的RAID陣列設備 -l 5 指定RAID級別為5 -n 3 指定硬碟數量。表示用三塊硬碟來創建RAID5,分別為 /dev/sdb, /dev/sdc, /dev/sdd
我們會發現 /dev 下出現了一個名為 md0 的設備
ls -l /dev/md0
brw-rw----. 1 root disk 9, 0 Sep 11 09:40 /dev/md0
自動啟用RAID
在創建好RAID以後,可以將RAID信息保存到 /etc/mdadm.conf 文件中,這樣在下次操作系統重新啟動時,系統會自動載入這個文件來啟用RAID
sudo mdadm -D --scan >/etc/mdadm.conf
cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=MiWiFi-R3-srv:0 UUID=ece6c656:c9999ff6:9d17c0ec:08a0e3af
查看RAID陣列信息
創建好RAID陣列後,我們可以通過 mdadm --misc 模式來查看剛創建好的RAID的詳細信息
mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Sep 11 09:40:45 2018
Raid Level : raid5
Array Size : 16758784 (15.98 GiB 17.16 GB)
Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Tue Sep 11 10:03:35 2018
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : MiWiFi-R3-srv:0 (local to host MiWiFi-R3-srv)
UUID : ece6c656:c9999ff6:9d17c0ec:08a0e3af
Events : 18
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
或者我們也可以通過 /proc/mdstat 文件來查看RAID的簡潔信息
cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd[3] sdc[1] sdb[0]
16758784 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
使用RAID陣列
在創建好RAID陣列後,我們就不能直接操作組成陣列的磁碟了,否則會損壞剛創建好的RAID陣列。 我們通過 /dev/md0 這個設備來進行文件格式化和掛載
set -x
exec 2>&1
mkfs.xfs -f /dev/md0
mount /dev/md0 /mnt
mount |grep md0
+ mkfs.xfs -f /dev/md0
meta-data=/dev/md0 isize=512 agcount=16, agsize=261760 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=4188160, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
+ mount /dev/md0 /mnt
+ mount
+ grep md0
/dev/md0 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,sunit=1024,swidth=2048,noquota)
關閉RAID
我們可以通過 mdadm --misc 模式來關閉RAID。這會釋放所有資源
在關閉RAID之前需要先卸載RAID:
sudo umount /mnt
然後關閉RAID
sudo mdadm --misc --stop /dev/md0
關閉RAID後,我們可以通過 mdadm --misc --zero-superblock 來清空磁碟中RAID陣列的超級塊信息。 清空就能夠正常使用這些磁碟了
mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd
模擬RAID故障
我們可以通過 mdadm --manage /dev/md0 --fail 來將某塊磁碟設置成故障狀態
sudo mdadm /dev/md0 -f /dev/sdd 2>&1
mdadm: set /dev/sdd faulty in /dev/md0
然後我們再來查一下這個RAID的信息
sudo mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Sep 11 10:32:21 2018
Raid Level : raid5
Array Size : 16758784 (15.98 GiB 17.16 GB)
Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Tue Sep 11 10:35:12 2018
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : MiWiFi-R3-srv:0 (local to host MiWiFi-R3-srv)
UUID : c031d0c9:998a4e86:5cf90e71:52b229cd
Events : 20
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
- 0 0 2 removed
3 8 48 - faulty /dev/sdd
你會發現 /dev/sdd 的狀態現在變成了 faulty, 但是RAID5這個級別是允許一塊磁碟損壞而不造成數據損壞的。 移除RAID陣列中的磁碟
sudo mdadm --manage /dev/md0 --remove /dev/sdd
更換新磁碟
set -x
exec 2>&1
sudo mdadm --manage /dev/md0 --add /dev/sdd
sudo mdadm --misc --detail /dev/md0
+ sudo mdadm --manage /dev/md0 --add /dev/sdd
mdadm: added /dev/sdd
+ sudo mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Sep 11 10:32:21 2018
Raid Level : raid5
Array Size : 16758784 (15.98 GiB 17.16 GB)
Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Tue Sep 11 10:40:41 2018
State : clean, degraded
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : MiWiFi-R3-srv:0 (local to host MiWiFi-R3-srv)
UUID : c031d0c9:998a4e86:5cf90e71:52b229cd
Events : 22
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
- 0 0 2 removed
3 8 48 - spare /dev/sdd