RAID 概述
RAID即廉價冗餘磁碟陣列(Redundant Array of Inexpensive Disk)的簡稱,通過該技術可以
將多個磁碟組成一個陣列整體,而應用時可以作為單個磁碟使用。RAID 磁碟陣列根據其使用的技
術不同,可用於提高資料讀寫效率、提高資料冗餘(備份),當陣列中的一個磁碟發生故障時,可
以通過校正資料從其他磁碟中進行恢複,大大增強了應用系統資料的讀寫效能及可靠性。
較常見的 RAID技術包括如下幾個層級:
„ RAID 0:最基本的一種陣列方式,通過簡單的將多個磁碟(最少2 塊)組成到一起,作為
一個大磁碟使用。存取資料時,通過將資料分段同時寫入到不同的磁碟中,大大提高了效
率。但是這種方式沒有資料冗餘,其中任何一個磁碟壞了以後,都可能導致資料丟失。
„ RAID 1:即磁碟鏡像技術,需要最少 2 塊磁碟(磁碟利用率:1/n)。這種方式將資料同時
寫入到陣列中的多塊磁碟中,不同磁碟中的資料互為鏡像。因此,其中任何一個磁碟壞了
以後,資料不會丟失。
„ RAID 5:通過引入資料校正技術來保證資料的安全,需要最少 3 塊磁碟(磁碟利用率: n-1)。
這種方式並不使用固定的某塊磁碟存放校正資料,而是分段儲存在各個磁碟中。因此,其
中任何一個磁碟壞了以後,也可以根據其他磁碟中的校正資料進行恢複。
由於 RAID5 陣列技術既通過資料冗餘增強了可靠性,又通過多塊磁碟同時寫入資料提高了效
率,一直以來受到廣泛的應用。
未使用硬體磁碟卡方式實現的 RAID 技術,通常稱為軟 RAID 技術。本文將在 RHEL5 系統中,
使用不同磁碟中的多個分區,配置實現 RAID 5磁碟陣列。
9.2 構建使用軟 RAID磁碟陣列
在 RHEL5 系統中,配置軟 RAID 陣列可以通過安裝 mdadm 軟體包實現。該軟體包一般為系
統預設安裝,若檢查沒有安裝的話,從 RHEL5 系統光碟片中尋找安裝即可。
[root@localhost ~]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@localhost ~]# rpm -ivh /media/cdrom/Server/mdadm-2.5.4-3.el5.i386.rpm
Preparing... ########################################### [100%]
1:mdadm ########################################### [100%]
[root@localhost ~]# rpm -qi mdadm | grep "Summary"
Summary : mdadm 控制 Linux md 裝置 (軟體 RAID 陣列)
下面將以 RAID5磁碟陣列為例,講解軟磁碟陣列的配置使用方法。
準備用於 RAID陣列的分區
用於組成 RAID陣列的各個分區應該位於不同的磁碟裝置中,否則實用價值不大。各分區的容
量最好也相同,必要時可以將整個硬碟劃分為一個分區。
為 Linux伺服器添加 4塊 SCSI 硬碟,並使用 fdisk 工具各劃分出一塊 2GB 的分區,依次為:
/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1。分區前請注意確保沒有別的程式正在使用對應的
磁碟。下一小節中將以這 4 個分區為例(RAID 5需要至少 3 塊磁碟或分區)講解 RAID5 磁碟陣列
的建立方法。
對於上述分區還應該將其類型 ID更改為“fd”,對應為“Linux raid autodetect”,表示支援用
於 RAID磁碟陣列。
[root@localhost ~]# fdisk /dev/sdb
……
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522): +2048M
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): p
……
Device Boot Start End Blocks Id System
/dev/sdb1 1 250 2008093+ fd Linux raid autodetect
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#
建立好三個分區以後,執行“partprobe”重新探測分區表(或重啟系統),驗證分區類型和容
量等資訊。
[root@localhost ~]# partprobe
[root@localhost ~]# fdisk -l /dev/sd[b-e] | grep "^/dev/sd"
/dev/sdb1 1 250 2008093+ fd Linux raid autodetect
/dev/sdc1 1 250 2008093+ fd Linux raid autodetect
/dev/sdd1 1 250 2008093+ fd Linux raid autodetect
/dev/sde1 1 250 2008093+ fd Linux raid autodetect
建立 RAID裝置
使用 mdadm 工具可以組合多個 RAID 分區作為一個磁碟陣列,陣列裝置檔案名稱習慣上使用
“/dev/md0”、“/dev/md1”等。
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n4 -l5 /dev/sd[b-e]1
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 64K
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=4 ctime=Sat Jul 25 08:44:50 2009
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=4 ctime=Sat Jul 25 08:44:50 2009
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=4 ctime=Sat Jul 25 08:44:50 2009
mdadm: /dev/sde1 appears to be part of a raid array:
level=raid5 devices=4 ctime=Sat Jul 25 08:44:50 2009
mdadm: size set to 2008000K
Continue creating array? y
mdadm: array /dev/md0 started.
[root@localhost ~]#
在上述命令操作中,“/dev/md0”為建立的 RAID陣列裝置檔案名稱,“/dev/sd[bcd]1”表示此陣
列將使用/dev/sdb1、/dev/sdc1、/dev/sdd1 這三個分區。其他各部分選項、參數的含義如下:
„ -C,等同於 --create:建立一個新的陣列裝置
„ -v,等同於 --verbose:執行過程中輸出細節資訊
„ -a,等同於 --auto=:指定參數為 yes 時,表示若對應的裝置檔案不存在則自動建立
„ -n,等同於 --raid-devices=:用於組成陣列的分區裝置個數,“-n3”表示為 3 個
„ -l,等同於 --level=:使用的 RAID層級,“-l5”表示為 RAID 5
關於 mdadm 命令更多選項的使用,請參考“man mdadm”協助資訊。
建立好 md0陣列裝置後,將自動被啟用,執行“cat /proc/mdstat”可以觀察陣列裝置的
運行狀態。
[root@localhost ~]# ls -l /dev/md0
brw------- 1 root root 9, 0 07-25 09:03 /dev/md0
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdd1[2] sdc1[1] sdb1[0]
6024000 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
其中,“[4/4]”部分中的第一個“4”表示成員裝置個數,後邊的“4”表示當前的活動裝置個
數,“UUUU”對應為成員裝置的狀態。例如,若出現“[4/3][UUU_]”的資訊時,則表示第 4 個成
員裝置(/dev/sde1)出現故障了。
在 RAID裝置中建立檔案系統
建立好磁碟陣列裝置檔案“/dev/md0”以後,就可以在該裝置中建立檔案系統了。在 RHEL5
系統中,可以使用 mkfs 命令格式化該裝置,將其作為 ext3檔案系統來使用。
[root@localhost ~]# mkfs -t ext3 /dev/md0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
753664 inodes, 1506000 blocks
75300 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1543503872
46 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
掛載並使用檔案系統
建立掛載點目錄“/mdata”,並將上一小節中建立好的檔案系統掛載到該目錄,即可正常使用。
[root@localhost ~]# mkdir /mdata
[root@localhost ~]# mount /dev/md0 /mdata
[root@localhost ~]# df -T | grep "md0" //驗證掛載的“/mdata”檔案系統
/dev/md0 ext3 5929360 142976 5485184 3% /mdata
除去一個成員裝置作為校正盤以後,磁碟陣列的有效儲存空間為 3個成員裝置的容量之和(大
約為 2GB×3=6GB)。
如果希望在每次開機後自動掛載該陣列裝置,可以在“/etc/fstab”檔案中添加相應設定。
[root@localhost ~]# vi /etc/fstab
/dev/md0 /mdata ext3 defaults 0 0
陣列的管理及裝置恢複
基本管理操作
1.掃描或查看磁碟陣列資訊
使用 mdadm 命令時,“-D”選項相當於“--detail”,表示顯示掃描結果的詳細內容;“-s”
選項相當於“--scan”,用於掃描陣列裝置。
未指定陣列裝置檔案時,可以顯示出當前系統中的陣列配置資訊、RAID裝置列表。
[root@localhost ~]# mdadm -vDs
ARRAY /dev/md0 level=raid5 num-devices=4
UUID=35bcffa1:cdc5ba41:0c5b5702:e32a3259
devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
當指定陣列裝置作為參數時,可以輸出指定陣列裝置的詳細參數,包括活動裝置個數、失
效裝置個數、更新時間、列表成員裝置位置等。
[root@localhost ~]# mdadm -vDs /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Sat Jul 25 11:23:07 2009
Raid Level : raid5
Array Size : 6024000 (5.74 GiB 6.17 GB)
Device Size : 2008000 (1961.27 MiB 2056.19 MB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sat Jul 25 11:26:01 2009
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : 35bcffa1:cdc5ba41:0c5b5702:e32a3259
Events : 0.6
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
3 8 18 3 active sync /dev/sde1
2.建立設定檔 mdadm.conf
mdamd 的設定檔為“/etc/mdadm.conf”,該檔案只是用來方便使用者管理和使用,缺少
此檔案並不會影響磁碟陣列的功能。在設定檔中可以儲存多個磁碟陣列的配置資訊。配置文
件中的基本資料可以通過前面講過的“mdadm -vDs”命令獲得。
[root@localhost ~]# vi /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
ARRAY /dev/md0 level=raid5 num-devices=4
UUID=35bcffa1:cdc5ba41:0c5b5702:e32a3259
devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
CREATE owner=root group=root mode=0640
在上述檔案中, “ARRAY”、“UUID” “devices”部分是位於同一行中的內容,最後一
行中的“CREATE”用於設定自動建立陣列裝置檔案的屬主、屬組及預設許可權。關於mdadm.conf
設定檔中更多配置項的使用,可以參考“man mdadm.conf”協助資訊。
3.啟動/停止RAID陣列
在確保沒有相關程式讀寫磁碟陣列裝置的情況下,可以停止陣列裝置。只需使用 mdadm
命令結合“-S”選項(等同於“--stop”選項)即可。執行該操作將會禁用對應的陣列裝置,
釋放相關資源。
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
結合“-A”選項(等同於“--assemble”選項)可以重新組合對應的磁碟陣列裝置。
[root@localhost ~]# mdadm -A /dev/md0
mdadm: /dev/md0 has been started with 4 drives.
[root@localhost ~]# mount /dev/md0 /mdata/
裝置恢複操作
1.類比陣列裝置故障
對於運行中的磁碟陣列,可以結合 mdadm 命令的“-f”選項(等同於“”選項)用於模
擬成員裝置故障,例如可將陣列中的“/dev/sdb1”標記為故障裝置。
[root@localhost ~]# mdadm /dev/md0 -f /dev/sde1
mdadm: set /dev/sde1 faulty in /dev/md0
當陣列中的某個成員裝置出現故障時,陣列會將其標記為失活狀態。此時通過“cat
/proc/mdstat”可以觀察到丟失出現故障的裝置(/dev/sde1)。
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3](F) sdd1[2] sdc1[1] sdb1[0]
6024000 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
2.更換故障裝置,並恢複資料
對於出現故障的裝置,可以結合“-r”選項將其移除,然後換上正常的裝置,結合“-a”
選項重新添加到陣列中即可。
[root@localhost ~]# mdadm /dev/md0 -r /dev/sde1
mdadm: hot removed /dev/sde1 //移除故障裝置
[root@localhost ~]# mdadm /dev/md0 -a /dev/sde1
mdadm: re-added /dev/sde1 //重新加入正常裝置
RAID5 磁碟陣列能夠在較短時間內進行重構和資料恢複,當需要恢複的資料較多時,可
以在此期間觀察到陣列狀態的恢複進度。
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdd1[2] sdc1[1] sdb1[0]
6024000 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
[===>.................] recovery = 16.3% (328192/2008000) finish=2.6min
speed=10586K/sec
unused devices: <none>
待資料恢複完成以後,再次查看陣列狀態即顯示為正常了。
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdd1[2] sdc1[1] sdb1[0]
6024000 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>