什么是 RAID
磁盤陣列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,容錯式廉價磁盤陣列。 RAID 可以通過一些技術(軟件或硬件),將多個較小的磁盤整合成為一個較大的磁盤設備; 而這個較大的磁盤功能可不止是儲存而已,他還具有數據保護的功能呢。整個 RAID 由亍選擇的等級 (level) 不同,而使得整合后的磁盤具有不同的功能, 基本常見的 level 有這幾種(注1):
RAID-0 (等量模式, stripe):效能最佳
這種模式如果使用相同型號與容量的磁盤來組成時,效果較佳。這種模式的 RAID 會將磁盤先切出等量的區塊 (舉例來說, 4KB), 然后當一個文件要寫入 RAID 時,該文件會依據塊的大小切割好,之后再依序放到各個磁盤里面去。由於每個磁盤會交錯的存放數據, 因此當你的數據要寫入 RAID 時,數據會被等量的放置在各個磁盤上面。舉例來說,你有兩顆磁盤組成 RAID-0 , 當你有 100MB 的數據要寫入時,每個磁盤會各被分配到 50MB 的儲存量。RAID-0 的示意圖如下所示:
RAID-1 (映像模式, mirror):完整備份
這種模式也是需要相同的磁盤容量的,最好是一模一樣的磁盤啦!如果是不同容量的磁盤組成 RAID-1 時,那么總容量將以最小的那一顆磁盤為主!這種模式主要是『讓同一份數據,完整的保存在兩顆磁盤上頭』。舉例來說,如果我有一個 100MB 的檔案,且我僅有兩顆磁盤組成 RAID-1 時, 那么這兩顆磁盤將會同步寫入 100MB 到他們的儲存空間去。 因此,整體 RAID 的容量幾乎少了 50%。由於兩顆硬盤內容一模一樣,好像鏡子映照出來一樣, 所以我們也稱他為 mirror(鏡像) 模式。
RAID 0+1,RAID 1+0
RAID-0 的效能佳但是數據不安全,RAID-1 的數據安全但是效能不佳,那么能不能將這兩者整合起來設置 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所謂的 RAID 0+1 就是: (1)先讓兩顆磁盤組成 RAID 0,再讓這樣的設置共有兩組; (2)將這兩組 RAID 0 再組成一組 RAID 1。這就是 RAID 0+1 啰!反過來說,RAID 1+0 就是先組成 RAID-1 再組成 RAID-0 的意思。
RAID 5:性能與數據備份的均衡考慮
RAID-5 至少需要三塊以上的磁盤才能夠組成這種類型的磁盤陣列。這種磁盤陣列的數據寫入有點類似 RAID-0 , 不過每個循環的寫入過程中,在每顆磁盤還加入一個同位檢查數據 (Parity) ,這個數據會記錄其他磁盤的備份數據, 用於當有磁盤損毀時的救援。RAID-5 讀寫的情況有點像底下這樣:
Spare Disk:預備磁盤的功能
當磁盤陣列的磁盤損毀時,就得要將壞掉的磁盤拔除,然后換一顆新的磁盤。換成新磁盤並且順利啟勱磁盤陣列后, 磁盤陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁盤數據到新的磁盤上!然后你磁盤陣列上面的數據就復原了! 這就是磁盤陣列的優點。不過,我們還是得要動手拔插硬盤,此時通常得要關機才能這么做。 為了讓系統可以實時的在壞掉硬盤時主動的重建,因此就需要預備磁盤 (spare disk) 的輔助。 所謂的 spare disk 就是一顆或多顆沒有包含在原本磁盤陣列等級中的磁盤,這顆磁盤平時並不會被磁盤陣列所使用, 當磁盤陣列有任何磁盤損毀時,則這顆 spare disk 會被主動的拉進磁盤陣列中,再將壞掉的那顆硬盤移出磁盤陣列! 然后立即重建數據系統。如此你的系統則可以永保安康啊!若你的磁盤陣列有支持熱拔插那就更完美了! 直接將壞掉的那顆磁盤拔除換一顆新的,再將那顆新設置成為 spare disk ,就完成了!
磁盤陣列的優點:
說的口沫橫飛,重點在哪里呢?其實你的系統如果需要磁盤陣列的話,其實重點在於:
數據安全與可靠性:指的並非信息安全,而是的那個硬件 (指磁盤) 損毀時,數據是否還能夠安全的救援或使用之意;
讀寫效能:例如 RAID 0 可以加強讀寫效能,讓你的系統 I/O 部分得以改善;
容量:可以讓多塊磁盤組合起來,故單一文件系統可以有相當大的容量。
尤其數據的可靠性與完整性更是使用 RAID 的考慮重點!畢竟硬件壞掉換掉就好了,軟件數據損毀那可不是鬧着玩的! 所以企業界為何需要大量的 RAID 來做為文件系統的硬件基准,現在您有點了解了吧?
software, hardware RAID
硬件磁盤陣列 (hardware RAID) 是透過磁盤陣列卡來達成數組的目的。 磁盤陣列卡上面有一塊專門的芯片在處理 RAID 的仸務,因此在效能方面會比較好。在很多任務 (例如 RAID 5 的同位檢查碼計算) 磁盤陣列並不會重復消耗原本系統的 I/O 總線,理論上效能會較佳。此外目前一般的中高階磁盤陣列卡都支持熱拔插, 亦即在不關機的情況下抽換損壞的磁盤,對於系統的復原與數據的可靠性方面非常的好用。
軟件磁盤陣列 (software RAID)。軟件磁盤陣列主要是透過軟件來仿真數組的仸務, 因此會損耗較多的系統資源,比如說 CPU 的運算不 I/O 總線的資源等。
另外你必項要知道的是,硬件磁盤陣列在 Linux 底下看起來就是一顆實際的大磁盤,因此硬件磁盤陣列的裝置文件名為 /dev/sd[a-p] ,因為使用到 SCSI 的模坑之故。至於軟件磁盤陣列則是系統仿真的,因此使用的裝置文件名是系統的裝置文件, 文件名為 /dev/md0, /dev/md1...,兩者的裝置文件名並不相同!
軟件磁盤陣列的設定:
- # mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N --level=[015] --spare-devices=N /dev/sdx /dev/hdx...
- 選頃不參數:
- --create :為建立 RAID 的參數。
- --auto=yes :決定建立后面接的軟件磁盤陣列裝置,亦即 /dev/md0,/dev/md1...
- --raid-devices=N :使用幾個磁盤 (partition) 作為磁盤陣列的裝置
- --spare-devices=N :使用幾個磁盤作為備用 (spare) 裝置
- --level=[015] :設定這組磁盤陣列的等級。支持很多,不過建議只要用 0, 1, 5 即可
- --detail :后面所接的那個磁盤陣列裝置的詳紳信息
利用我的測試機來建置一個 RAID 5 的軟件磁盤陣列給您瞧瞧!
- [root@linux ~]# fdisk -l
- Disk /dev/sda: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 13 104391 83 Linux
- /dev/sda2 14 274 2096482+ 82 Linux swap / Solaris
- /dev/sda3 275 1044 6185025 83 Linux
- Disk /dev/sdb: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdc: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdd: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sde: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Disk /dev/sdf: 8589 MB, 8589934592 bytes
- 255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Disk /dev/sdf doesn't contain a valid partition table
下面是我希望做成的 RAID 5 環境:
利用 4 個磁盤組成 RAID 5;
每個磁盤約為 8GB 大小,需確定每個磁盤一樣大較佳;
利用 1 個磁盤設定為 spare disk
這個 spare disk 的大小與其他 RAID 所需磁盤一樣大!
將此 RAID 5 裝置掛載到 /mnt/raid 目錄下
最終我需要 5 個 8GB 的磁盤。
- [root@linux ~]# mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=4 --spare-devices=1 /dev/sd{b,c,d,e,f}
- mdadm: array /dev/md0 started.
- [root@linux ~]# mdadm --detail /dev/md0
- /dev/md0: --RADI設備名
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012 --RAID被創建的時間
- Raid Level : raid5 --RAID等級為RAID 5
- Array Size : 25165632 (24.00 GiB 25.77 GB) --此RAID的可用磁盤容量
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB) --每個設備的可用容量
- Raid Devices : 4 --用作RAID的設備數量
- Total Devices : 5 --全部設備的數量
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 19:14:22 2012
- State : clean
- Active Devices : 4 --啟動的設備數量
- Working Devices : 5 --可動作的設備數量
- Failed Devices : 0 --出現錯誤的設備數量
- Spare Devices : 1 --預備磁盤的數量
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b --此設備的RAID標識符
- Events : 0.2
- Number Major Minor RaidDevice State
- 0 8 16 0 active sync /dev/sdb
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 80 - spare /dev/sdf
也可以查閱如下的檔案杢看看系統軟件磁盤陣列的情況:
- [root@linux ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[4](S) sdd[2] sdc[1] sdb[0] --第一行
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] --第二行
- unused devices: <none>
第一行部分:指出 md0 為 raid5 ,丏使用了 sdb, sdc, sdd, sde 等四顆磁盤裝置。每個裝置后面的中括號 [] 內的數字為此磁盤在 RAID 中的順序 (RaidDevice);至亍 sdf 后面的 [S] 則代表 sdf 為 spare 之意。
第二行:此磁盤陣列擁有 25165632 個block(每個 block 單位為 1K),所以怪容量約為24GB, 使用 RAID 5 等級,寫入磁盤的小區坑 (chunk) 大小為 64K,使用 algorithm 2 磁盤陣列算法。 [m/n] 代表此數組需要 m 個裝置,且 n 個裝置正常運作。因此本 md0 需要 4 個裝置且這 4 個裝置均正常運作。 后面的 [UUUU] 代表的是四個所需的裝置 (就是 [m/n] 里面的 m) 的啟勱情況,U 代表正常運作,若為 _ 則代表不正常。
格式化與掛載使用RAID
- [root@linux ~]# 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)
- 3145728 inodes, 6291408 blocks
- 314570 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=0
- 192 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, 1605632, 2654208,
- 4096000
- Writing inode tables: done
- Creating journal (32768 blocks): done
- Writing superblocks and filesystem accounting information: done
- This filesystem will be automatically checked every 22 mounts or
- 180 days, whichever comes first. Use tune2fs -c or -i to override.
- [root@linux ~]# mkdir /mnt/raid
- [root@linux ~]# mount /dev/md0 /mnt/raid/
- [root@linux ~]# df
- 文件系統 1K-塊 已用 可用 已用% 掛載點
- /dev/sda3 5991232 2656564 3025420 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- /dev/md0 24770748 176200 23336268 1% /mnt/raid
仿真 RAID 錯誤的救援模式
- # mdadm --manage /dev/md[0-9] [--add 設備] [--remove 設備] [--fail 設備]
- 參數:
- --add :會將后面的設備加入到這個 md 中!
- --remove :會將后面的設備從這個 md 中移除
- --fail :會將后面的設備設定成為出錯的狀態
設置磁盤為錯誤
- [root@linux raid]# cp -a /etc/ /var/log/ /mnt/raid/ --先復制一些數據
- [root@linux raid]# df /mnt/raid/
- 文件系統 1K-塊 已用 可用 已用% 掛載點
- /dev/md0 24770748 279932 23232536 2% /mnt/raid
- [root@linux raid]# du -sm /mnt/raid/*
- 106 /mnt/raid/etc --看吧!確實有數據在里面
- 2 /mnt/raid/log
- 1 /mnt/raid/lost+found
- [root@linux raid]# ll /mnt/raid/
- 總計 40
- drwxr-xr-x 101 root root 12288 02-16 20:37 etc
- drwxr-xr-x 16 root root 4096 02-16 18:24 log
- drwx------ 2 root root 16384 02-16 20:36 lost+found
- [root@linux raid]# mdadm --manage /dev/md0 --fail /dev/sdb --假設這個磁盤設備出錯了。
- mdadm: set /dev/sdb faulty in /dev/md0
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 20:51:49 2012
- State : clean, degraded, recovering
- Active Devices : 3
- Working Devices : 4
- Failed Devices : 1 --出錯的磁盤有一個
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 64K
- Rebuild Status : 16% complete
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.4
- Number Major Minor RaidDevice State
- 4 8 80 0 spare rebuilding /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 5 8 16 - faulty spare /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[4] sdd[2] sdc[1] sdb[5](F)
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]
- [======>..............] recovery = 34.3% (2878256/8388544) finish=3.2min speed=28577K/sec
- unused devices: <none>
重建完畢的RAID 5情況
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[0] sdd[2] sdc[1] sdb[4](F)
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:02:31 2012
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 1
- Spare Devices : 0
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.12
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 16 - faulty spare /dev/sdb
將錯誤的磁盤刪除並加入新磁盤
- [root@linux raid]# mdadm --manage /dev/md0 --remove /dev/sdb
- mdadm: hot removed /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde[3] sdf[0] sdd[2] sdc[1]
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 4
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:06:32 2012
- State : clean
- Active Devices : 4
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 0
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.14
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- [root@linux raid]# mdadm --manage /dev/md0 --add /dev/sdb
- mdadm: added /dev/sdb
- [root@linux raid]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Thu Feb 16 19:11:44 2012
- Raid Level : raid5
- Array Size : 25165632 (24.00 GiB 25.77 GB)
- Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
- Raid Devices : 4
- Total Devices : 5
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Thu Feb 16 21:06:32 2012
- State : clean
- Active Devices : 4
- Working Devices : 5
- Failed Devices : 0
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- Events : 0.14
- Number Major Minor RaidDevice State
- 0 8 80 0 active sync /dev/sdf
- 1 8 32 1 active sync /dev/sdc
- 2 8 48 2 active sync /dev/sdd
- 3 8 64 3 active sync /dev/sde
- 4 8 16 - spare /dev/sdb
- [root@linux raid]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdb[4](S) sde[3] sdf[0] sdd[2] sdc[1]
- 25165632 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
- unused devices: <none>
開機自動啟動RAID並自動掛載
- [root@linux raid]# mdadm --detail /dev/md0 | grep UUID
- UUID : 84c5171f:50290a3e:8673f81b:4cc9501b
- [root@linux raid]# vi /etc/mdadm.conf
- ARRAY /dev/md0 UUID=84c5171f:50290a3e:8673f81b:4cc9501b
- [root@linux raid]# vi /etc/fstab
- /dev/md0 /mnt/raid ext3 defaults 1 2
- [root@linux ~]# umount /dev/md0
- [root@linux ~]# df
- 文件系統 1K-塊 已用 可用 已用% 掛載點
- /dev/sda3 5991232 2655024 3026960 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- [root@linux ~]# mount -a --參數 -a:依照配置文件 /etc/fstab 的數據將所有未掛載的磁盤都掛載上來
- [root@linux ~]# df
- 文件系統 1K-塊 已用 可用 已用% 掛載點
- /dev/sda3 5991232 2655024 3026960 47% /
- /dev/sda1 101086 11373 84494 12% /boot
- tmpfs 517548 0 517548 0% /dev/shm
- /dev/md0 24770748 279936 23232532 2% /mnt/raid
關閉軟件RAID
除非你未來就是要使用這顆 software RAID (/dev/md0),否則你勢必要將這個 /dev/md0 關閉!如果你只是將 /dev/md0 卸除,然后忘記將 RAID 關閉, 結果就是....未來你在重新分割 /dev/sb* 時可能會出現一些莫名的錯錯誤狀況啦!
- # 1. 先卸載且刪除配置文件內與這個 /dev/md0 有關的設置:
- [root@linux ~]# umount /dev/md0
- [root@linux ~]# vi /etc/fstab
- /dev/md0 /mnt/raid ext3 defaults 1 2 --將這一行刪除掉!或者是批注掉也可以!
- # 2. 直接關閉 /dev/md0 的方法!
- [root@linux ~]# mdadm --stop /dev/md0
- mdadm: stopped /dev/md0 --這樣就關閉了!
- [root@linux ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- unused devices: <none> --看吧!確實不存在仸何數組設備!
- [root@linux ~]# vi /etc/mdadm.conf
- ARRAY /dev/md0 UUID=84c5171f:50290a3e:8673f81b:4cc9501b --同樣啦!刪除他或是批注他!