RAID各級別、軟RAID
0.目錄
1.RAID
1.1 什麼是RAID
RAID,全稱Redundant Array Inexpensive(Independent) Disks。這個名稱的由來有一定歷史原因,不贅述。現在就直接視為磁碟陣列。
磁碟陣列:將多塊磁碟,按一定的方式組合起來,以提高耐用性和IO能力。
需要注意的是,RAID有冗餘能力提高了耐用性,但取代不了資料備份。因RAID冗餘只能保證磁碟壞時資料不受影響,如果資料遭到誤刪,那和磁碟就沒關係了,所以重要資料還是要備份。
1.2 使用場景
1、資料儲存在某磁碟上,若該磁碟損壞,則會導致業務終止。
2、磁碟訪問密集時,其有限的I/O能力將成為業務瓶頸。
1.3 RAID如何提高磁碟耐用性和I/O能力
RAID耐用性的實現,主要通過磁碟冗餘來實現;
RAID使I/O能力的提升,可通過其自帶的“CPU”和“記憶體”(僅供RAID使用),也可理解為是RAID的控制器。
- 通過其“記憶體”的非同步存取可有效提升I/O能力。如果發生斷電等會導致非同步存取中斷。所以RAID一般配有電池,關機後仍可供電一段時間。
- 通過其“CPU”,可將需存取的資料切割為多個chunk(即多份相同大小的資料)。按一定策略(即各RAID級別)儲存在各磁碟上,讀取時再合併各chunk的資料。這樣可降低各磁碟的I/O壓力,從而提升整體的I/O能力。
1.4 RAID級別
RAID有不同級別,各級別表示的是其組織各磁碟的方式,並非有級別“高低”之分。
RAID級別的設定在BIOS中,而非作業系統。
2.RAID各級別組織方式
2.1 RAID-0
2.1.1 實現方式
RAID-0,也稱條帶卷。RAID-0實現方式:
資料儲存方式:
各chunk平均、依次分配儲存至各磁碟上,即把整個資料條帶化儲存了。
2.1.2 指標及分析
指標 | 產生結果(提升、下降均相對於單硬碟) |
---|---|
I/O能力 | 提升 |
耐用性 | 下降 |
使用的最少硬碟數 | 2 |
可用空間 | N*min(Disk1,Disk2……) |
分析:
- I/O能力
以上述圖示為例,如果資料的總大小為9G,每個硬碟僅需吞吐(即I/O)3G的資料,相對於單硬碟,RAID-0的每個硬碟I/O壓力明顯降低。
使用更多的磁碟,就會更多地分攤I/O壓力。不過並不是新增硬碟越多就越好。因為讀取時,控制器需要時間合併各磁碟讀來的資料;寫入時又要費時間來分割資料。 - 耐用性
由RAID-0組織方式,可以看出其無冗餘能力。任何一塊硬碟損壞,就會造成整個資料的不完整,而多個硬碟出故障的概率又大於單硬碟。所以RAID-0耐用性相對於單硬碟是降低的。
所以RAID-0不適合儲存關鍵資料。可用於儲存非關鍵的“中間資料”,比如交換分割槽資料、臨時檔案系統等。 - 最少硬碟數
由RAID-0組織方式,可知其最少使用2塊硬碟。 - 可用空間
RAID-0可用空間取決於其組成硬碟中最小的那個。因為根據RAID-0寫入資料的方式,任何一塊盤滿,其他硬碟也無法再寫入。
2.2 RAID-1
2.2.1 實現方式
RAID-1,也稱映象卷。RAID-1實現方式:
資料儲存方式:
各chunk,每個硬碟都存一份,如同映象。
2.2.2 指標及分析
指標 | 產生結果(提升、下降均相對於單硬碟) |
---|---|
I/O能力 | 寫效能略微下降;讀效能提升 |
耐用性 | 提升 |
儲存空間利用率 | 50%以下 |
使用的最少硬碟數 | 最少為2,且一般也只用2塊硬碟 |
可用空間 | 1*min(Disk1,Disk2…) |
分析:
- I/O能力
RAID-1各硬碟儲存的資料相同,在寫入時,資料在所有硬碟上都完整儲存才算寫入完成,所以雖然每個硬碟的寫入壓力相同,但RAID-1整體寫效能取決於最慢的那個硬碟。相對於單硬碟寫效能是略有下降的。
讀效能提升。讀取各chunk不一定要在一塊硬碟上。比如chunk1在第一塊讀,chunk2在第二塊讀等等。從而降低各硬碟讀取壓力,RAID-1整體讀效能提升。 - 耐用性
有冗餘能力,也是其最大優點。每個硬碟都儲存資料,只要不同時損壞,資料即可正常讀寫。耐用性提升。 - 儲存空間利用率
有冗餘的RAID級別,儲存空間利用率都不會是100%。
RAID-1若使用2塊盤,利用率為50%;使用更多則會在50%以下。因各硬碟資料都一樣。 - 使用最少硬碟數
由其組織方式決定,最少硬碟數為2,且一般就使用2個。如果使用2個以上,除了儲存空間利用率降低,寫效能也會進一步降低,因為寫入資料時要等所有硬碟都寫入完畢。 - 可用空間
各硬碟儲存的資料大小一致,所以只要其中1塊硬碟滿,其他硬碟均無法繼續寫入。且各硬碟儲存的內容相同。所以可用空間為1*min(Disk1,Disk2…)。
2.3 RAID-4
2.3.1 實現方式
RAID-4實現方式:
資料儲存方式:
前面硬碟按條帶卷儲存各chunk,最後一塊硬碟作為校驗盤,儲存前面硬碟資料計算得出的校驗碼(比如按位計算出的異或值)。如果儲存資料的某硬碟損壞,校驗盤可和剩下的正常硬碟資料計算,得出損壞盤上的資料1。
2.3.2 降級模式
- 什麼是降級模式
以RAID-4為例,一塊硬碟壞了之後,讀、寫仍是可以執行的。讀的話,需要邊計算邊讀,速度會比較慢;寫的話,也是邊計算邊寫到沒壞的硬碟和校驗盤上。
這種存在壞硬碟的情況下繼續工作的狀態稱為降級模式。 - 降級模式的風險及規避
顯然,降級模式下的讀、寫操作會增大剩餘好硬碟和校驗盤的壓力。對於RAID-4,處於降級模式時如果再壞一塊硬碟(也可以是校驗盤),那麼就徹底壞了。
所以在出現硬碟故障時,應暫停使用RAID,換一塊新硬碟(一般是熱備一塊空閒盤)並計算出原來硬碟的資料。這樣就和原來狀態一樣了。
不過,在計算原來硬碟資料的過程中也有可能出現新的壞盤(概率很小),對於RAID-4,這種情況也就意味著徹底壞了,RAID-4最多允許一塊壞盤。
2.3.3 缺陷
RAID-4的一大缺陷:單塊盤作為校驗盤,任何一個存資料的盤寫入資料,校驗盤的資料都要跟著變。這大大增加了校驗盤的壓力,使之成為RAID-4的效能瓶頸。
所以RAID-4不常用。
2.4 RAID-5
2.4.1 實現方式
資料儲存方式:
RAID-5儲存原理與RAID-4相同。不過為了避免RAID-4單個校驗盤的壓力,RAID-5採用了各硬碟輪流儲存校驗值的方式。
校驗資料從第一塊盤開始儲存,之後各硬碟依次做校驗盤,稱為左對襯。如上圖所示就是左對襯的方式(虛線標出)。相反地,校驗資料若從最後一塊盤開始,依次向前輪流做校驗盤,稱為右對稱。一般採用左對襯。
2.4.2 指標及分析
指標 | 產生結果(提升、下降均相對於單硬碟) |
---|---|
I/O能力 | 提升 |
耐用性 | 提升 |
儲存空間利用率 | (N-1)/N以下,其中N為硬碟總數 |
使用的最少硬碟數 | 最少3個 |
可用空間 | (N-1)*min(Disk1,Disk2…) |
分析:
- I/O能力
每個硬碟僅儲存資料的一部分,所以I/O壓力減小,RAID總體I/O能力提升。 - 耐用性
同RAID-4,最多允許一塊硬碟掛掉,掛掉後即變為降級模式。2塊以上掛掉則徹底掛。 - 可用空間
最小的一塊硬碟滿,則RAID-5無法繼續儲存資料。且校驗資料大小相當於其中一塊硬碟。所以可用空間為(N-1)*min(Disk1,Disk2…)。
2.5 RAID-10
2.5.1 實現方式
資料儲存方式:
各硬碟先分組做RAID-1,各組再在更高級別上做RAID-0。
2.5.2 指標及分析
指標 | 產生結果(提升、下降均相對於單硬碟) |
---|---|
I/O能力 | 提升 |
耐用性 | 提升 |
儲存空間利用率 | 50%以下 |
使用的最少硬碟數 | 4個 |
可用空間 | N*min(Disk1,Disk2…)/2 |
分析:
- I/O能力
每個硬碟僅儲存資料的一部分,所以I/O壓力減小,RAID總體I/O能力提升。 - 耐用性
除非某組映象卷的硬碟同時壞,否則資料不會損壞。映象捲包含硬碟較少,同時壞的可能性不大。
RAID-10是相對理想的機制。
2.6 RAID-01
2.6.1 實現方式
資料儲存方式:
用若干硬碟先做RAID-0,再用同樣數量的硬碟,在更高級別上做RAID-1。
兩邊的RAID-0儲存的總資料一樣,但由於兩邊RAID-0控制器對資料的切片方式未必相同,所以兩邊的切片結果未必相同(上圖中使用chunk1、chunk1一撇以示區分),所以兩邊的RAID-0若各有一個硬碟壞,則整個資料就會損壞。
雖然這種方式可以在某一邊RAID-0的全部硬碟壞的情況下,仍儲存完整資料,但發生這種情況概率較低。反而是兩邊各壞一塊硬碟的概率較高(兩邊都是一堆裡面壞一個)。
整體來看,RAID-01不如RAID-10。
2.7 RAID-50
2.7.1 實現方式
資料儲存方式:
各硬碟先分組做RAID-5,各組再在更高級別上做RAID-0。
2.8 JBOD概念
這裡僅作為了解。
Just a Bunch Of Disks,僅是一組硬碟的捆綁。
顧名思義,JBOD邏輯上是把一堆硬碟合起來當做一個磁碟來用(這點同RAID),但它沒有提升I/O能力和耐用性,功能僅是結合各硬碟儲存空間,即其可用空間為sum(Disk1,Disk2…)。儲存資料方式是前一個硬碟滿就繼續儲存在後一個上。
3.軟RAID
3.1 mdadm
3.1.1 使用格式
RAID也可通過軟體實現,但生產環境中肯定都是硬體實現。不過以下使用軟RAID使用舉例,可對RAID有更清晰的理解。
軟體實現RAID是基於核心中的MD(Multi Devices)模組。
centos6上,使用系統命令mdadm來與該模組通訊,它具有不同模式。使用格式為:
mdadm [mode] <raiddevice> [options] <component-devices>
各欄位 | 意義 |
---|---|
mode | 指定模式。 |
raiddevice | 指定RAID裝置2 |
options | 選項。對於不同模式,可用的選項不同。 |
component-devices | 組成RAID的成員裝置。 |
3.1.2 各常用模式
各模式 | 符號 | 意義 |
---|---|---|
建立 | -C | 用於建立(create) |
顯示 | -D | 顯示裝置詳細資訊(detail) |
監控 | -F | |
管理 | 無 | 該模式無需指定,使用某些選項預設就是在管理模式下。 |
停止 | -S | 停止指定RAID,釋放所有資源。 |
裝配 | -A | 裝配(assemble)一個已存在的陣列3 |
3.1.3 各常用選項
建立模式下
選項 意義 -n # 指定多少塊裝置建立RAID(#為數字,下同) -l # 指定建立的RAID級別(level)4 -a {yes|no} 指定是否自動(auto)建立RAID的裝置檔案 -c 指定RAID的chunk的大小,比如512K -x # 指定備用的空閒盤的個數5 管理模式下
選項 意義 -a 新增磁碟 -r 移除磁碟 -f 標記磁碟為損壞
3.2 使用舉例
3.2.1 建立
比如建立一個10G可用空間,3塊盤組成的RAID-5,另有1塊空閒盤備用。共需4硬碟。
建立4個分割槽當作硬碟,注意分割槽ID應為fd(Linux raid auto),否則無法裝配為RAID。建立分割槽結果:
[[email protected] ~]# fdisk -l /dev/sdb Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f7a5b9a Device Boot Start End Blocks Id System /dev/sdb1 1 654 5253223+ fd Linux raid autodetect /dev/sdb2 655 1308 5253255 fd Linux raid autodetect /dev/sdb3 1309 1962 5253255 fd Linux raid autodetect /dev/sdb4 1963 13054 89096490 5 Extended /dev/sdb5 1963 2616 5253223+ fd Linux raid autodetect
檢視/proc/mdstat(顯示當前系統所有RAID裝置),或檢視所有/dev/md#檔案,以新增新RAID裝置檔案時,避免和已有的裝置檔名重複。
[[email protected] ~]# cat /proc/mdstat Personalities : unused devices: <none> # 表示目前系統上沒有RAID裝置
使用mdadm建立RAID-5。chunk大小未指定,表示使用預設大小。
[[email protected] ~]# mdadm -C /dev/md0 -n 3 -x 1 -l 5 -a yes /dev/sdb{1,2,3,5} mdadm: /dev/sdb1 appears to contain an ext2fs file system size=3156740K mtime=Sun Dec 4 15:29:29 2016 Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
仍在/proc/mdstat檢視是否建立完畢。
[[email protected] ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb3[4] sdb5[3](S) sdb2[1] sdb1[0] 10498048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
active表示該RAID處於活動(可用)狀態;
如有recovery正在執行及其執行的百分比6,表示組成RAID的各裝置正在逐位對齊7。至此,RAID-5建立完成,可把該RAID在邏輯上看做為一個裝置了。
3.2.2 檢視
建立完成後,可使用顯示模式,檢視該軟RAID詳細資訊。
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Jan 23 22:06:37 2017
Raid Level : raid5
Array Size : 10498048 (10.01 GiB 10.75 GB)
Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Jan 23 22:07:11 2017
State : clean # clean表示目前軟RAID狀態正常
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric # 表示該RAID-5使用左對稱的方式
Chunk Size : 512K
Name : local:0 (local to host local)
UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4
Events : 18
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
3 8 21 - spare /dev/sdb5
3.2.3 格式化、掛載
格式化
[[email protected] ~]# mke2fs -t ext4 /dev/md0 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 657072 inodes, 2624512 blocks 131225 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2688548864 81 block groups 32768 blocks per group, 32768 fragments per group 8112 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 30 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
掛載
[[email protected] ~]# mount /dev/md0 test_md [[email protected] ~]# mount | grep /dev/md0 /dev/md0 on /root/test_md type ext4 (rw)
注意,如上所提到的,如果想讓其開機自動掛載,最好使用UUID或卷標來指定這個RAID,因為RAID的裝置檔案的數字在重啟後可能會改變。
3.2.4 冗餘測試
向該軟RAID掛載的目錄下拷貝一個檔案,後續驗證是否損壞。
[[email protected] ~]# echo hello > test_md/hello [[email protected] ~]# cat test_md/hello hello
使用指令,人為標記組成該軟RAID的某裝置損壞。
[[email protected] ~]# mdadm /dev/md127 -f /dev/sdb1 mdadm: set /dev/sdb1 faulty in /dev/md127 # 由於重啟過機器,該軟RAID的裝置檔案發生改變了,變為md127了。 # 此處是把/dev/sdb1標記為損壞。
此時檢視軟RAID的狀態。
損壞裝置時立即檢視,可以看到資料正在重建(rebuild)及重建的進度百分比。
[[email protected] ~]# mdadm -D /dev/md127 /dev/md127: Version : 1.2 Creation Time : Mon Jan 23 22:06:37 2017 Raid Level : raid5 Array Size : 10498048 (10.01 GiB 10.75 GB) Used Dev Size : 5249024 (5.01 GiB 5.38 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Wed Feb 1 20:21:34 2017 State : clean, degraded, recovering # 此時壞了一個裝置,備用的裝置在恢復(recovering)資料,所以只有兩塊可用,是降級(degraded)模式 Active Devices : 2 Working Devices : 3 Failed Devices : 1 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Rebuild Status : 17% complete Name : local:0 (local to host local) UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4 Events : 28 Number Major Minor RaidDevice State 3 8 21 0 spare rebuilding /dev/sdb5 1 8 18 1 active sync /dev/sdb2 4 8 19 2 active sync /dev/sdb3 0 8 17 - faulty /dev/sdb1
備用盤重建資料完成後再次檢視軟RAID資訊,可看到備用的/dev/sdb5完全替代了/dev/sdb1,其他資訊均和損壞前一樣。
[[email protected] ~]# mdadm -D /dev/md127 /dev/md127: Version : 1.2 Creation Time : Mon Jan 23 22:06:37 2017 Raid Level : raid5 Array Size : 10498048 (10.01 GiB 10.75 GB) Used Dev Size : 5249024 (5.01 GiB 5.38 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Wed Feb 1 20:22:20 2017 State : clean Active Devices : 3 Working Devices : 3 Failed Devices : 1 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Name : local:0 (local to host local) UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4 Events : 43 Number Major Minor RaidDevice State 3 8 21 0 active sync /dev/sdb5 1 8 18 1 active sync /dev/sdb2 4 8 19 2 active sync /dev/sdb3 0 8 17 - faulty /dev/sdb1
此時檢視軟RAID掛載點下的檔案,未損壞。
[[email protected] ~]# cat test_md/hello hello
再標記一個裝置損壞,使軟RAID變為降級模式,並檢視狀態和掛載點下的檔案。
[[email protected] ~]# mdadm /dev/md127 -f /dev/sdb2 mdadm: set /dev/sdb2 faulty in /dev/md127 # 標記損壞 [[email protected] ~]# mdadm -D /dev/md127 | grep "State :" State : clean, degraded # 檢視軟RAID狀態 [[email protected] ~]# mdadm -D /dev/md127 | tail -n 7 Number Major Minor RaidDevice State 3 8 21 0 active sync /dev/sdb5 2 0 0 2 removed 4 8 19 2 active sync /dev/sdb3 0 8 17 - faulty /dev/sdb1 1 8 18 - faulty /dev/sdb2 # 組成軟RAID各裝置的狀態 [[email protected] ~]# cat test_md/hello hello # 降級模式不影響資料
3.2.5 移除壞盤,新增好盤
標記為壞盤的裝置,在重啟後會自動被移除出軟RAID;也可通過命令,直接移除。
[[email protected] ~]# mdadm /dev/md127 -r /dev/sdb{1,2}
mdadm: hot removed /dev/sdb1 from /dev/md127
mdadm: hot removed /dev/sdb2 from /dev/md127
然後可再新增好盤,上述的/dev/sdb{1,2}並不是真的故障,所以再新增進去也沒有問題。軟RAID的狀態也恢復為正常。
[[email protected] ~]# mdadm /dev/md127 -a /dev/sdb{1,2}
mdadm: added /dev/sdb1
mdadm: added /dev/sdb2
[[email protected] ~]# mdadm -D /dev/md127 | grep "State :"
State : clean
3.2.6 停用、啟用、刪除軟RAID
當軟RAID不再使用時,可停用。停用前應先解除安裝,否則會報錯。
[[email protected] ~]# umount /dev/md127
[[email protected] ~]# mdadm -S /dev/md127
mdadm: stopped /dev/md127
[[email protected] ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>
如果軟RAID裝置檔案還在可使用裝配模式重新啟用;
如需刪除軟RAID,把所有組成裝置移除即可。
(完)
- 比如chunk1資料為1101,chunk2資料為0110,它們的異或值是1011。如果chunk1壞了,使用它們的異或值,和chunk2再做一次異或即可得出chunk1原來的1101。 ↩
- RAID裝置檔案一般為/dev/md#,在重啟後數字可能會改變,所以一般通過卷標、UUID來指定RAID裝置。 ↩
- 一個軟RAID停用後,再想啟用時,需使用裝配模式。此處的裝配可理解為啟用。 ↩
- mdadm支援的級別:LINEAR(即JBOD)、RAID-0、RAID-1、RAID-4、RAID-5、RAID-6、RAID-10。 ↩
- 顯然,只有有冗餘能力的RAID級別,指定空閒盤才有意義。 ↩
- 使用cat檢視的百分比顯然會是一個固定的數字,使用命令watch可動態檢視其完成進度。 ↩
- RAID的儲存尤其是有冗餘能力的RAID,各硬碟要逐位對齊,否則出現壞盤時無法按位計算壞盤上的資料。 ↩