磁盤陣列的英文全稱是Redundant Arrays of Inexpensive Disks(RAID),即容錯廉價磁盤陣列。可以通過一些技術將多個較小的磁盤整合成為一個較大的磁盤設備;而這個設備可不止存儲功能而已,它還具有數據保護功能。
RAID的等級:
× RAID-0(等量模式,stripe):性能較佳
這種模式使用相同型號和容量的磁盤來組成,可以有多個,RAID會將每個磁盤劃分成等量的區塊(一般為4K,2K等等),然後當一個文件被寫入時,該文件會依據塊大小切割好,之後依序放到各個磁盤裡面去,由於每個磁盤交錯存放數據,因此當你的數據要寫入RAID時,數據會被等量的放置到各個磁盤上去。越多磁盤組成RAID-0,那麼的話性能肯定就越好了。
缺點:一個磁盤掛點,整個文件系統崩盤,無法恢復了。並且所有磁盤容量必須一樣,不然性能會下降。
× RAID-1(映像模式,mirror):完整備份
這種模式也要相同型號,相同容量的磁盤,最好完全一樣,一個模子刻出來的。
數據傳送到I/O總線被復制多份到各個磁盤,因此寫的性能會變得很差,不過如果你用硬件RAID(磁盤陣列卡),磁盤陣列卡會主動幫你復制,不需要I/O總線。但是磁盤陣列卡很貴滴呀呀,我買不起,所以很悲劇。RAID-1最大的用途在於備份,不過它的讀取性能很好。
× RAID 0+1, RAID 1+0
RAID-0的性能較佳但是數據不安全,RAID-1數據安全但是性能不佳,那能不能組合下撒。
RAID 0+1:先讓N塊磁盤組成RAID-0, 同時再讓另外的N塊磁盤也組成RAID-0, 這樣子我得到了兩組RAID-0,然後將這兩組RAID-0再組成一組RAID-1。
RAID 1+0:先讓2N塊磁盤組成N個組,每個組兩個磁盤,每個組裡面的兩個磁盤組成RAID-1, 然後將這N組RAID-1組成RAID-0。
缺點:磁盤有一半的容量用來做備份了,悲劇呀!!!
RAID-5:性能與數據備份的均衡考慮
RAID-5至少需要三塊以上的磁盤才能組成這種類型的磁盤陣列。這種磁盤陣列的數據寫入有點類似RAID-0,不過每次循環寫入過程中,在每塊磁盤還加入一個同位檢查數據(Parity),這個數據會記錄其他磁盤的備份數據,用於當有磁盤損毀時的救援。
RAID-5的容量要減掉一個磁盤容量,也就是陣列的磁盤總數N-1,因為需要一個磁盤容量來保存同位檢查數據Parity
RAID-5的讀取性能很不錯,跟RAID-0有得一拼,但是寫入性能就很尴尬了,在軟件磁盤陣列的時候,CPU還得花時間去計算同位檢查數據。同時它只能保證一個磁盤損壞數據的安全,如果兩個磁盤損壞就掛了。
RAID-6:跟RAID-5類似,不過這次會使用兩塊磁盤容量作為Parity的存儲,它可以支持兩塊磁盤同時損壞,這個概率應該比走在馬路上被一輛驢車撞到的概率還低吧,^_^
====Spare Disk:預備磁盤的功能====
為了讓系統可以實時在壞掉磁盤時主動重建,需要預備磁盤spare disk的輔助,平時不包含在磁盤陣列中,當磁盤陣列有任何磁盤損壞時,spare disk馬上被主動拉入磁盤陣列中,並將壞掉的磁盤移除磁盤陣列,然後立即重建數據系統,如果你的磁盤陣列還支持熱插拔就更爽了,因為這個時候只需要把壞的那顆磁盤拔下來,換上一個新的,再將新的磁盤設置成spare disk,完成了,不用關機重啟可以完成一切。這對服務器的穩定性有很好的幫助。
磁盤陣列的優點:
× 數據安全與可靠性,這裡指的是硬盤壞了數據可以挽回。
× 讀寫性能,RAID-0可以加強讀寫性能,讓你的系哦I/O系統部分得以改善
× 容量:可以讓多個磁盤組合起來,因此單一文件系統可以有相當大的容量。
centos提供的軟件磁盤陣列為mdadm這套軟件,以分區或磁盤為單位,也就是說你不需要多個磁盤就可以設計你的磁盤陣列了。此外,mdadm支持剛剛提到的RAID-0,RAID-1,RAID-5等級,還支持spare disk的功能。而且提供的管理機制還可以達到類似可以熱插拔的功能,可以在線(文件系統正常使用)進行分區的抽換,使用上非常的方便。。
注意:硬盤磁盤陣列在linux看起來就是一個大的磁盤,所有設備文件名為/dev/sd[a-p],因為使用到SCSI的模塊的原因。而軟件磁盤陣列因為是系統仿真,因此使用的設備文件名時系統的設備文件,文件名為/dev/md0, /dev/md1,兩者注意區別。
====軟件磁盤陣列的設置====
# mdadm –detail /dev/md0
# mdadm –create –auto=yes /dev/md[0-9] –raid-device=4 –level=[015] –spare-device=2 /dev/sd5 /dev/sd6
–create:為新建RAID的參數
–auto=yes:決定新建後面接的軟件磁盤陣列設備,即/dev/md0, /dev/md1等
–raid-devices=N:使用N個磁盤作為磁盤陣列的設備
–spare-devices=N:使用N個磁盤作為備用spare設備
–level=[015]:設置磁盤陣列的等級。支持很多,不過建議只要用0,1,5即可
–detail:後面所接的那個磁盤陣列設備的詳細信息
注意最後面接的設備文件名,可以時整塊磁盤,比如/dev/sdb,也可以是一個分區,比如/dev/sdb1,不過這些設備文件名的數量總數必須等於–raid-devices和–spare-devices的個數總和才行。
下面我來試試建立一個RAID-5的軟件磁盤陣列,貌似這個比較常用,很適合。
我希望這個RAID-5環境時這樣子的:
× 利用4個分區組成RAID-5
× 每個分區大約為1G大小,需要確定每個分區一樣大較佳
× 另外加一個分區設置為sparedisk
× 這個sparedisk的大小與其他RAID所需分區一樣大
× 將此RAID-5設備掛載到/mnt/raid目錄下面
先用fdisk構建5個1G的分區:
# fdisk /dev/sda
前面省略。。。
Command (m for help):n
每次分1000M空間大小,注意,我不知道神馬原因,first 扇區要手動輸入,用p選項查看後,用最後一個分區的扇區號+2049才是第一個空閒扇區號,這個可能時fedora的一個bug,分區居然不是連續的,不管了,自己去試試。囧
最後的分區用p查看後,是這樣子的:
設備 Boot Start End Blocks Id System
/dev/sda1 2048 206847 102400 7 HPFS/NTFS/exFAT
/dev/sda2 * 206848 169859071 84826112 7 HPFS/NTFS/exFAT
/dev/sda3 169859072 462827821 146484375 7 HPFS/NTFS/exFAT
/dev/sda4 462829568 976773119 256971776 5 Extended
/dev/sda5 462833664 463243263 204800 83 Linux
/dev/sda6 463245312 631181311 83968000 83 Linux
/dev/sda7 631183360 799119359 83968000 83 Linux
/dev/sda8 799121408 803315711 2097152 82 Linux swap / Solaris
/dev/sda9 803317760 805365759 1024000 83 Linux
/dev/sda10 805367808 807415807 1024000 83 Linux
/dev/sda11 807417856 809465855 1024000 83 Linux
/dev/sda12 809467904 811515903 1024000 83 Linux
/dev/sda13 811517952 813565951 1024000 83 Linux
後面的從9到13就是剛剛我分的5個分區,每個大概1G,大小都相同。
# partprobe
接下來就簡單啦啦,,通過mdadm來創建磁盤陣列吧。哦也
# mdadm –create –auto=yes /dev/md0 –level=5 –raid-devices=4 –spare-devices=1 /dev/sda{9,10,11,12,13}
查看下(等下,先去喝杯咖啡先,因為如果你直接立馬運行,可能出現下面的正在building數據的信息):
復制代碼代碼如下:
# mdadm --detail /dev/md0
/dev/md0: <==RAID設備文件名
Version : 1.2
Creation Time : Sun Oct 28 10:03:43 2012 <==RAID被創建的時間
Raid Level : raid5 <==此RAID的等級
Array Size : 3068928 (2.93 GiB 3.14 GB) <==此RAID可用磁盤容量
Used Dev Size : 1022976 (999.17 MiB 1047.53 MB) <==每個設備可用容量
Raid Devices : 4 <==用作RAID的設備數量
Total Devices : 5 <==全部的設備數量
Persistence : Superblock is persistent
Update Time : Sun Oct 28 10:04:01 2012
State : clean, degraded, recovering
Active Devices : 3 <==啟動的(active)設備數量
Working Devices : 5 <==可工作的設備數量
Failed Devices : 0 <==出現錯誤的設備數量
Spare Devices : 2 <==預備spare磁盤的數量
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 17% complete
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
Events : 3
Number Major Minor RaidDevice State
0 8 9 0 active sync /dev/sda9
1 8 10 1 active sync /dev/sda10
2 8 11 2 active sync /dev/sda11
5 8 12 3 spare rebuilding /dev/sda12
4 8 13 - spare /dev/sda13
真正的完成build後的信息應該是:
復制代碼代碼如下:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Oct 28 10:03:43 2012
Raid Level : raid5
Array Size : 3068928 (2.93 GiB 3.14 GB)
Used Dev Size : 1022976 (999.17 MiB 1047.53 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Sun Oct 28 10:06:00 2012
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
Events : 20
Number Major Minor RaidDevice State
0 8 9 0 active sync /dev/sda9
1 8 10 1 active sync /dev/sda10
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
4 8 13 - spare /dev/sda13
還可以通過查看/proc/mdstat查看磁盤陣列情況:
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sda12[5] sda13[4](S) sda11[2] sda10[1] sda9[0]
3068928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
格式化與掛載使用RAID:
# mkfs -t ext4 /dev/md0
# mkdir /mnt/raid
# mount /dev/md
# mount /dev/md0 /mnt/raid
# df
文件系統 1K-塊 已用 可用 已用% 掛載點
rootfs 82649712 4681980 73769332 6% /
devtmpfs 1964632 4 1964628 1% /dev
tmpfs 1975352 600 1974752 1% /dev/shm
tmpfs 1975352 1160 1974192 1% /run
/dev/sda6 82649712 4681980 73769332 6% /
tmpfs 1975352 0 1975352 0% /sys/fs/cgroup
tmpfs 1975352 0 1975352 0% /media
/dev/sda7 82649712 8355056 70096256 11% /home
/dev/sda5 198337 90718 97379 49% /boot
/dev/md0 3020688 70048 2797196 3% /mnt/raid
看到了吧,最後一個,是不是很有成就感,=_=
====仿真RAID錯誤的救援模式====
# mdadm –manage /dev/md[0-9] [--add 設備] [--remove 設備] [--fail 設備]
–add:將後面的設備加入到這個md中
–remove:將後面的設備從這個md中刪除
–fail:將後面的設備設置成出錯的狀態
手動模擬磁盤錯誤:
# cp -a /etc /var/log /mnt/raid/
# df -h /mnt/raid/; du -smh /mnt/raid/*
文件系統 容量 已用 可用 已用% 掛載點
/dev/md0 2.9G 126M 2.7G 5% /mnt/raid
45M /mnt/raid/etc
4.4M /mnt/raid/log
16K /mnt/raid/lost+found
# mdadm –manage /dev/md0 –fail /dev/sda10
mdadm: set /dev/sda10 faulty in /dev/md0
然後馬上查看狀態,這個動作要快點,因為raid會自動重建數據系統:
復制代碼代碼如下:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Oct 28 10:03:43 2012
Raid Level : raid5
Array Size : 3068928 (2.93 GiB 3.14 GB)
Used Dev Size : 1022976 (999.17 MiB 1047.53 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Sun Oct 28 10:24:42 2012
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 6% complete
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
Events : 23
Number Major Minor RaidDevice State
0 8 9 0 active sync /dev/sda9
4 8 13 1 spare rebuilding /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
1 8 10 - faulty spare /dev/sda10
喝完咖啡後,看一下(其實也就1分鐘左右)
復制代碼代碼如下:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Oct 28 10:03:43 2012
Raid Level : raid5
Array Size : 3068928 (2.93 GiB 3.14 GB)
Used Dev Size : 1022976 (999.17 MiB 1047.53 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Sun Oct 28 10:26:53 2012
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
Events : 43
Number Major Minor RaidDevice State
0 8 9 0 active sync /dev/sda9
4 8 13 1 active sync /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
1 8 10 - faulty spare /dev/sda10
看到了吧,不用我來給你解釋了吧。
接下來,我將出錯的磁盤刪除並加入新的磁盤:
首先,先新建一個新的分區,這個分區大小要與其他的分區一樣大才好。然後再用mdadm刪除錯誤的並加入新的
# fdisk /dev/sda
….下面建新分區步驟省略,如果不知道怎麼建,參考我的企鵝日記(一)
# partprobe
# partprobe
[root@localhost ~]# mdadm –manage /dev/md0 –add /dev/sda14 –remove /dev/sda10
mdadm: added /dev/sda14
mdadm: hot removed /dev/sda10 from /dev/md0
復制代碼代碼如下:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Oct 28 10:03:43 2012
Raid Level : raid5
Array Size : 3068928 (2.93 GiB 3.14 GB)
Used Dev Size : 1022976 (999.17 MiB 1047.53 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Sun Oct 28 10:33:04 2012
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
Events : 45
Number Major Minor RaidDevice State
0 8 9 0 active sync /dev/sda9
4 8 13 1 active sync /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
6 8 14 - spare /dev/sda14
看到了吧,結果不用我解釋了吧。。哈哈
而這一切的一切都是online的狀態下完成的,是不是很NB呢 =_=
====開機自動掛載RAID====
只需要知道/dev/md0的UUID就行
# mdadm –detail /dev/md0 | grep -i uuid
UUID : 657db303:887c7b6f:b8d8fc91:dc7b3374
# vi /etc/mdadm.conf
ARRAY /dev/md0 UUID=657db303:887c7b6f:b8d8fc91:dc7b3374
# vi /etc/fstab,在最後一行加入
/dev/md0 /mnt/raid ext4 defaults 1 2
測試下可行否(這個很重要,因為如果fstab修改不對可能導致開不了機器)
# umount /dev/md0; mount -a
[root@localhost ~]# df /mnt/raid/
文件系統 1K-塊 已用 可用 已用% 掛載點
/dev/md0 3020688 120464 2746780 5% /mnt/raid
OK,沒有問題,那麼你就可以重啟了,看是不是自動掛載了呢。
====關閉RAID====
1,先卸載
# umount /dev/md0
2,刪除配置文件內容:
# vi /etc/fstab,刪除(注釋)下面這行
/dev/md0 /mnt/raid ext4 defaults 1 2
3,關閉/dev/md0:
# mdadm –stop /dev/md0
4,# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>
5,vi /etc/mdadm.conf,刪除(注釋)下面的行
ARRAY /dev/md0 UUID=657db303:887c7b6f:b8d8fc91:dc7b3374
好的,所有的RAID的基本都講完了。不過上面我用的時一塊磁盤,實際用途中記得用多塊磁盤啊!!
=======================================END=========================================