歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux Software RAID實踐

Linux Software RAID實踐

日期:2017/2/28 16:23:18   编辑:Linux教程
在計算機術語中,RAID(Redundant Array of Independent Disks,獨立磁盤冗余數組)的基本思想就是把多個相對便宜的硬盤組合起來,成為一個磁盤數組,使性能達到甚至超過一個價格昂貴、容量巨大的硬盤.
根據選擇的版本不同,RAID比單顆硬盤有以下一個或多個方面的好處:
增強數據集成度
增強容錯功能
增加處理量或容量
另外,磁盤數組組對於計算機來說,看起來就像一個單獨的硬盤或邏輯存儲單元.簡單來說,RAID把多個硬盤組合成為一個邏輯磁區,因此,操作系統只會把它當作一個硬盤.RAID常被用在服務器計算機上,並且常使用完全相同的硬盤作為組合.由於硬盤價格的不斷下降與RAID功能更加有效地與主板集成,它也成為了玩家的一個選擇,特別是需要大容量儲存空間的工作,如:視頻與音頻制作.
常用RAID的等級介紹
為了各自的特定應用,所需要的磁盤的組合方式也有所不同,通常我們將這種組合方式稱為RAID等級.常用的RAID等級如下: RAID0(Stripping,條帶)
將多個磁盤合並成一個大的磁盤,不具有冗余,並行I/O,速度最快.RAID0亦稱為帶區集.它是將多個磁盤並列起來,成為一個大磁盤.在存放數據時,其將數據按磁盤的個數來進行分段,然後同時將這些數據寫進這些盤中.所以,在所有的級別中,RAID0的速度是最快的.但是RAID0沒有冗余功能,如果一個磁盤(物理)損壞,則所有的數據都會丟失.
理論上越多的磁盤效能就等於[單一磁盤效能]x[磁盤數],但實際上受限於總線I/O瓶頸及其它因素的影響,RAID效能會隨邊際遞減,也就是說,假設一個磁盤的效能是50MB/秒,兩個磁盤的RAID0效能約96MB/秒,三個磁盤的RAID0也許是130MB/秒而不是150MB/秒.所以,兩個磁盤的RAID0最能明顯感受到效能的提升.
Size = 2 * min(S1, S2)
但如果是以軟件方式來實現RAID,則磁盤的空間則不見得受限於此(例如Linux Software RAID),通過軟件實現可以經由不同的組合而善用所有的磁盤空間.
Size = sum of all disk RAID1(Mirror,鏡像)
兩組以上的N個磁盤相互作鏡像,速度沒有提高,除非擁有相同數據的主磁盤與鏡像同時損壞,否則數據不會丟失,可靠性最高.其原理為在主硬盤上存放數據的同時也在鏡像硬盤上寫一樣的數據.當主硬盤(物理)損壞時,鏡像硬盤則代替主硬盤的工作.因為有鏡像硬盤做數據備份,所以RAID1的數據安全性在所有的RAID級別上來說是最好的.但無論用多少磁盤做RAID1,僅算一個磁盤的容量,是所有RAID上磁盤利用率最低的一個級別.
Size = 2 * min(S1, S2) RAID5(分布奇偶位條帶)
RAID5是一種存儲性能,數據安全和存儲成本兼顧的存儲解決方案.它使用的是Disk Striping(硬盤分割)技術.RAID5至少需要三顆硬盤,RAID 5不對存儲的數據進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁盤上,並且奇偶校驗信息和相對應的數據分別存儲於不同的磁盤上.當RAID5的一個磁盤數據發生損壞後,利用剩下的數據和相應的奇偶校驗信息去恢復被損壞的數據. RAID5可以理解為是RAID0和RAID1的折衷方案.RAID5可以為系統提供數據安全保障,但保障程度要比鏡像低而磁盤空間利用率要比鏡像高.RAID5具有和RAID0相近似的數據讀取速度,只是多了一個奇偶校驗信息.寫入數據的速度相當的慢,若使用"回寫高速緩存"可以讓效能改善不少.同時由於多個數據對應一個奇偶校驗信息,RAID5的磁盤空間利用率要比RAID1高,存儲成本相對較便宜.
Size = (N - 1) * min(S1, S2, ...Sn) RAID10/01
RAID10/01其實可細分為RAID1+0或RAID0+1.
RAID1+0(鏡像陣列條帶)是先鏡射再分割數據.是將所有硬盤分為兩組,視為是RAID0的最低組合,然後將這兩組各自視為RAID1運作.RAID1+0有著不錯的讀取速度,而且擁有比RAID0更高的數據保護性.
RAID0+1則是跟RAID1+0的程序相反,是先分割再將數據鏡射到兩組硬盤.它將所有的硬盤分為兩組,變成RAID1的最低組合,而將兩組硬盤各自視為RAID0運作.RAID0+1比起RAID1+0有著更快的讀寫速度,不過也多了一些會讓整個硬盤組停止運轉的機率;因為只要同一組的硬盤全部損毀,RAID0+1就會停止運作,而RAID1+0則可以在犧牲RAID0的優勢下正常運作.
RAID10巧妙的利用了RAID0的速度以及RAID1的保護兩種特性,不過它的缺點是需要的硬盤數較多,因為至少必須擁有四個以上的偶數硬盤才能使用.
Linux Software RAID實踐
在Linux系統中目前以MD(Multiple Devices)虛擬塊設備的方式實現軟件RAID,利用多個底層的塊設備虛擬出一個新的虛擬塊設備,並且利用條帶化(stripping)技術將數據塊均勻分布到多個磁盤上來提高虛擬設備的讀寫性能,利用不同的數據冗余算法來保護用戶數據不會因為某個塊設備的故障而完全丟失,而且還能在設備被替換後將丟失的數據恢復到新的設備上.軟RAID陣列實際上可以使用任何標准的塊設備作為底層設備,如SCSI設備,IDE設備,RAM disk磁盤和NBD(Network Block Device)等,甚至是其他的MD設備.目前MD支持linear,multipath,raid0(stripping),raid1(mirror),raid4,raid5,raid6,raid10等不同的冗余級別和組成方式,當然也能支持多個RAID陣列的層疊組成raid1+0,raid5+1等類型的陣列.
RHEL5已經將MD驅動模塊直接編譯到內核中,我們可以在機器啟動後通過cat /proc/mdstat看內核是否已經加載MD驅動或者cat /proc/devices是否有md塊設備.
[root@server ~]# cat /proc/mdstat
Personalities :
unused devices: <none>
[root@server ~]# cat /proc/devices | grep md
1 ramdisk
9 md
254 mdp
在Linux系統中用戶層以前使用raidtool工具集來管理MD設備,目前廣泛使用mdadm軟件來管理MD設備,而且該軟件都會集成在Linux的發布版中.mdadm主要有7種使用模式,分別如下:
--assemble -A: 將原來屬於一個陣列的每個塊設備組裝為陣列
--build -B: 構建沒有元數據塊的陣列
--create -C: 構建一個新陣列,與build的不同之處在於每個設備具有元數據塊
--manage : 管理已經存儲陣列中的設備,比如增加熱備磁盤或者刪除磁盤
--misc : 報告或者修改陣列中相關設備的信息,比如查詢陣列或者設備的狀態信息
--monitor -F: 監控一個或多個陣列,上報指定的事件
--grow -G: 改變陣列中每個設備被使用的容量或陣列中的設備的數目
在RHEL5中可以直接使用YUM來安裝mdadm軟件包,也可以從安裝光盤上找到該軟件包用RPM安裝.
[root@server ~]# mdadm --version
mdadm - v2.6.4 - 19th October 2007
安裝好後,就可以開始今天的試驗了. 1.准備源盤
我們先在虛擬機下虛擬9塊SCSI硬盤.
RAID0: sdb sdc
RAID1: sdd sde sdf
RAID5: sdg sdh sdi sdj
新建一文件answer,內容如下:
n
p
1
t
FD
w
然後執行如下操作:
[root@server ~]# for i in b c d e f g h i j; do fdisk /dev/sd$i < answer; done
[root@server ~]# fdisk -l | grep 'Linux raid autodetect'
/dev/sdb1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdc1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdd1 1 1044 8385898+ fd Linux raid autodetect
/dev/sde1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdf1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdg1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdh1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdi1 1 1044 8385898+ fd Linux raid autodetect
/dev/sdj1 1 1044 8385898+ fd Linux raid autodetect
以上操作確保把每個盤分區,再設置為FD的磁盤. 2.創建新的陣列
用sdb1,sdc1創建RAID0
mdadm --create /dev/md0 --level=0 --chunk=32 --raid-devices=2 /dev/sd[bc]1
選項解釋:
--level=,-l:指定raid的級別,可選的值為0,1,4,5,6,linear,multipath和synonyms
--chunk=,-c:指定條帶數據塊的大小,以K為單位.默認為64K,條帶單元的大小配置對不同負載的陣列讀寫性能有很大影響
--raid-devices=,-n:指定活動磁盤的數量
以上命令也可寫作:mdadm -C /dev/md0 -l0 -c32 -n2 /dev/sdb[bc]1
用sdd1,sde1,sdf1創建RAID1
mdadm --create /dev/md1 --level=1 --raid-devices=2 --spare-devices=1 /dev/sd[d-f]1
選項解釋:
--spare-devices=,-x:表示陣列中熱備盤的個數,一旦陣列中的某個磁盤失效,MD內核驅動程序自動用將熱備磁盤加入到陣列,然後重構丟失磁盤上的數據到熱備磁盤上.
以上命令也可寫作:mdadm -C /dev/md1 -l1 -n2 -x1 /dev/sd[d-f]1
用sdg1,sdh1,sdi1,sdj1創建RAID5
mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sd[g-i]1 --spare-devices=1 /dev/sdj1
以上命令也可寫作:mdadm -C /dev/md2 -l5 -n3 /dev/sd[g-i]1 -x1 /dev/sdj1
此外還可以參考如下命令,創建一個RAID1+0設備
mdadm -C /dev/md0 -l1 -n2 /dev/sd[bc]1
mdadm -C /dev/md1 -l1 -n2 /dev/sd[de]1
mdadm -C /dev/md2 -l1 -n2 /dev/sd[fg]1
mdadm -C /dev/md3 -l0 -n3 /dev/md[0-2]
當RAID1/4/5/6/10等創建成功後,需要計算每個條帶的校驗和信息並寫入到相應磁盤上,使用cat /proc/mdstat信息查詢RAID陣列當前狀態,重構的速度和預期的完成時間.
[root@server ~]# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdi1[4] sdj1[3](S) sdh1[1] sdg1[0]
16771584 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 1.9% (167760/8385792) finish=9.7min speed=13980K/sec

md1 : active raid1 sdf1[2](S) sde1[1] sdd1[0]
8385792 blocks [2/2] [UU]

md0 : active raid0 sdc1[1] sdb1[0]
16771584 blocks 32k chunks

unused devices: <none> 3.管理陣列
mdadm可以在manage模式下,對陣列進行管理.最常用的操作是標識損壞的磁盤,增加熱備磁盤,以及從陣列中移走失效的磁盤等等.
使用--fail(或者其縮寫-f)指定磁盤損壞.
[root@server ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0]
md2 : active raid5 sdj1[3](S) sdi1[2] sdh1[1] sdg1[0]
16771584 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] [root@server ~]# mdadm /dev/md2 --fail /dev/sdh1
mdadm: set /dev/sdh1 faulty in /dev/md2 [root@server ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0]
md2 : active raid5 sdj1[3] sdi1[2] sdh1[4](F) sdg1[0]
16771584 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
[>....................] recovery = 0.8% (74172/8385792) finish=7.4min speed=18543K/sec
第一次查看狀態時,sdj1是熱備盤,當我們指定sdh1損壞後,系統自動將數據重構到熱備盤sdj1上,在重構過程中,狀態是U_U.
用--remove命令可以將損壞的磁盤移走.
[root@server ~]# mdadm /dev/md2 --remove /dev/sdh1
mdadm: hot removed /dev/sdh1
此時查看狀態時,已經只有三個盤了,沒有備用的熱備盤.
[root@server ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0]
md2 : active raid5 sdj1[1] sdi1[2] sdg1[0]
16771584 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
當我們的損壞的磁盤經過處理後,可以將其添加到陣列中作熱備盤.
用--add命令可以添加熱備盤.
[root@server ~]# mdadm /dev/md2 --add /dev/sdh1
mdadm: added /dev/sdh1
[root@server ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0]
md2 : active raid5 sdh1[3](S) sdj1[1] sdi1[2] sdg1[0]
16771584 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] 此外還可以用--grow命令增加可用的活動磁盤. [root@server ~]#mdadm --grow /dev/md0 --raid-disks=4
4.使用陣列
新建三個掛載點:
[root@server ]# mkdir /mnt/MD0
[root@server ]# mkdir /mnt/MD1
[root@server ]# mkdir /mnt/MD2
對RAID設備做文件系統格式化:
[root@server ]# mkfs.ext3 /dev/md0
[root@server ]# mkfs.ext3 /dev/md1
[root@server ]# mkfs.ext3 /dev/md2
掛載:
[root@server ]# mount /dev/md0 /mnt/MD0
[root@server ]# mount /dev/md1 /mnt/MD1
[root@server ]# mount /dev/md2 /mnt/MD2
查看效果:
[root@server ]# df -h
......
/dev/md0 16G 173M 15G 2% /mnt/MD0
/dev/md1 7.9G 147M 7.4G 2% /mnt/MD1
/dev/md2 16G 173M 15G 2% /mnt/MD2
現在我們就可以正常使用RAID設備了.
當我們要停止RAID設備時,需要先將其卸載:
[root@server ~]# umount /mnt/MD0
然後再用如下命令停止設備:
[root@server ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
此時再用命令查看發現,已經沒有md0了.
[root@server ~]# cat /proc/mdstat | grep md0
如果需要再次使用則需要將其"組裝起來",由於先前曾創建過,mdadm的assemble模式可檢查底層設備的元數據信息,然後再組裝為活躍的陣列.
[root@server ~]# mdadm --assemble /dev/md0 /dev/sd[bc]1
mdadm: /dev/md0 has been started with 2 drives.
[root@server ~]# cat /proc/mdstat | grep md0
md0 : active raid0 sdb1[0] sdc1[1]
這樣就又可以重新掛載使用了. 5.陣列的元數據應用
Build模式可以用來創建沒有元數據的RAID0/1設備,不能創建RAID4/5/6/10等帶有冗余級別的MD設備,而create模式建立的RAID設備都是帶有元數據的.以使用命令--examine(-E)來檢測當前的塊設備上是否有陣列的元數據信息.
[root@server ~]# mdadm -E /dev/sdh1
/dev/sdh1:
Magic : a92b4efc
Version : 00.90.00
UUID : cea9dd57:59f61370:00969939:2ef303d5
Creation Time : Sun May 17 12:15:50 2009
Raid Level : raid5
Used Dev Size : 8385792 (8.00 GiB 8.59 GB)
Array Size : 16771584 (15.99 GiB 17.17 GB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 2

Update Time : Sun May 17 13:07:43 2009
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Checksum : 95f50002 - correct
Events : 0.2

Layout : left-symmetric
Chunk Size : 64K

Number Major Minor RaidDevice State
this 1 8 113 1 active sync /dev/sdh1

0 0 8 97 0 active sync /dev/sdg1
1 1 8 113 1 active sync /dev/sdh1
2 2 8 129 2 active sync /dev/sdi1
3 3 8 145 3 spare /dev/sdj1
從以上信息可以看到sdg1,sdh1,sdi1和sdj1共同組成了一個raid5設備,sdj1做備份盤,該設備創建於2009 12:15:50,條帶數據塊大小采用了默認值64k.此外還有一個重要的數據那就是UUID,它是陣列的唯一標識,組成同一陣列的相關磁盤上的UUID是相同的.
可以用以下命令來將具有相同元數據的磁盤重先組裝成RAID.
[root@server ~]# mdadm --assemble -v --uuid=cea9dd57:59f61370:00969939:2ef303d5 /dev/md2 /dev/sd[b-j]1
mdadm: looking for devices for /dev/md2
mdadm: /dev/sdb1 has wrong uuid. --1--
mdadm: /dev/sdc1 has wrong uuid.
mdadm: cannot open device /dev/sdd1: Device or resource busy --2--
mdadm: /dev/sdd1 has wrong uuid.
mdadm: cannot open device /dev/sde1: Device or resource busy
mdadm: /dev/sde1 has wrong uuid.
mdadm: cannot open device /dev/sdf1: Device or resource busy
mdadm: /dev/sdf1 has wrong uuid.
mdadm: /dev/sdg1 is identified as a member of /dev/md2, slot 0.
mdadm: /dev/sdh1 is identified as a member of /dev/md2, slot 1.
mdadm: /dev/sdi1 is identified as a member of /dev/md2, slot 2.
mdadm: /dev/sdj1 is identified as a member of /dev/md2, slot 3.
mdadm: added /dev/sdh1 to /dev/md2 as 1
mdadm: added /dev/sdi1 to /dev/md2 as 2
mdadm: added /dev/sdj1 to /dev/md2 as 3
mdadm: added /dev/sdg1 to /dev/md2 as 0
mdadm: /dev/md2 has been started with 3 drives and 1 spare.
--1--,/dev/sdb1與我們命令中的UUID不匹配.
--2--,/dev/sdd1正忙,無法獲取到相關UUID. 6.RAID的配置文件
在RHEL5的rc.sysinit配置文件中,有這樣一段代碼:
if [ -f /etc/mdadm.conf ]; then
/sbin/mdadm -A -s
fi
即:如果RAID的配置文件mdadm.conf存在,則調用mdadm檢查配置文件裡的選項,然後啟動RAID陣列.
所以我們如果要讓軟RAID的配置在機器下次啟動時自動生效的話,得把配置寫進配置文件/etc/mdadm.conf,可用下面的命令來完成.
[root@server ~]# echo DEVICE /dev/sd[b-j]1 > /etc/mdadm.conf
[root@server ~]# mdadm --detail --scan >> /etc/mdadm.conf
[root@server ~]# cat /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1
ARRAY /dev/md0 level=raid0 num-devices=2 UUID=8d4ebb05:b74a1b15:de9a89ee:b2b3a642
ARRAY /dev/md1 level=raid1 num-devices=2 spares=1 UUID=fa205b5a:0bb04eff:279165d9:b39ba52d
ARRAY /dev/md2 level=raid5 num-devices=3 spares=1 UUID=cea9dd57:59f61370:00969939:2ef303d5
這樣我們在下次啟動時,RAID就會自動生效了.
Copyright © Linux教程網 All Rights Reserved