目前 RAID技術大致分為兩種:基於硬件的RAID技術和基於軟件的RAID技術。其中在Linux下通過自帶的軟件就能實現RAID功能,這樣便可省去購買昂貴的硬件 RAID 控制器和附件就能極大地增強磁盤的 IO 性能和可靠性。由於是用軟件去實現的RAID功能,所以它配置靈活、管理方便。同時使用軟件RAID,還可以實現將幾個物理磁盤合並成一個更大的虛擬設備,從而達到性能改進和數據冗余的目的。當然基於硬件的RAID解決方案比基於軟件RAID技術在使用性能和服務性能上稍勝一籌,具體表現在檢測和修復多位錯誤的能力、錯誤磁盤自動檢測和陣列重建等方面。在本節將詳細講述如何在紅旗Linux服務器上創建和維護軟RAID。
隨著RAID技術經過不斷的發展,現已有RAID 0 到 RAID 6 七種基本的RAID 級別,同時還有RAID 0和RAID 1的組合形式,稱為RAID10。其中的級別並不代表技術的高低,而RAID 2和RAID 4基本上不再使用了,RAID 3則是由於實現起來太復雜也很少使用。目前這些常用的RAID級別Linux內核都能夠支持,本節就以Linux 2.6的內核為例,在Linux 2.6內核中的軟 RAID 可支持以下級別: RAID 0、RAID 1、RAID 4、RAID 5以及RAID 6等。Linux 2.6的內核除支持以上幾種RAID級別外,還可支持LINEAR(線性模式)的軟RAID,線性模式是將兩個或更多的磁盤組合到一個物理設備中,磁盤不必具有相同的大小,在寫入RAID 設備時會首先填滿磁盤A,然後是磁盤B,以此類推。
RAID 0
也稱為條帶模式(striped),即把連續的數據分散到多個磁盤上存取,如圖1所示。當系統有數據請求就可以被多個磁盤並行的執行,每個磁盤執行屬於它自己的那部分數據請求。這種數據上的並行操作可以充分利用總線的帶寬,顯著提高磁盤整體存取性能。因為讀取和寫入是在設備上並行完成的,讀取和寫入性能將會增加,這通常是運行 RAID 0 的主要原因。但RAID 0沒有數據冗余,如果驅動器出現故障,那麼將無法恢復任何數據。
500)this.width=500;" border=0>圖1 RAID 0示意圖
RAID 1
RAID 1又稱為鏡像(Mirroring),一個具有全冗余的模式,如圖2所示。RAID 1可以用於兩個或2xN個磁盤,並使用0塊或更多的備用磁盤,每次寫數據時會同時寫入鏡像盤。這種陣列可靠性很高,但其有效容量減小到總容量的一半,同時這些磁盤的大小應該相等,否則總容量只具有最小磁盤的大小。
500)this.width=500;" border=0>圖2 RAID 1示意圖
RAID 4
創建RAID 4需要三塊或更多的磁盤,它在一個驅動器上保存校驗信息,並以RAID 0方式將數據寫入其它磁盤,如圖3所示。因為一塊磁盤是為校驗信息保留的,所以陣列的大小是(N-l)*S,其中S是陣列中最小驅動器的大小。就像在 RAID 1中那樣,磁盤的大小應該相等。
如果一個驅動器出現故障,那麼可以使用校驗信息來重建所有數據。如果兩個驅動器出現故障,那麼所有數據都將丟失。不經常使用這個級別的原因是校驗信息存儲在一個驅動器上。每次寫入其它磁盤時,都必須更新這些信息。因此,在大量寫入數據時很容易造成校驗磁盤的瓶頸,所以目前這個級別的RAID很少使用了。
500)this.width=500;" border=0>圖3 RAID 4示意圖
RAID 5
在希望結合大量物理磁盤並且仍然保留一些冗余時,RAID 5 可能是最有用的 RAID 模式。RAID 5可以用在三塊或更多的磁盤上,並使用0塊或更多的備用磁盤。就像 RAID 4一樣,得到的 RAID5 設備的大小是(N-1)*S。
RAID5 與 RAID4 之間最大的區別就是校驗信息均勻分布在各個驅動器上,如圖4所示,這樣就避免了RAID 4中出現的瓶頸問題。如果其中一塊磁盤出現故障,那麼由於有校驗信息,所以所有數據仍然可以保持不變。如果可以使用備用磁盤,那麼在設備出現故障之後,將立即開始同步數據。如果兩塊磁盤同時出現故障,那麼所有數據都會丟失。RAID5 可以經受一塊磁盤故障,但不能經受兩塊或多塊磁盤故障。
500)this.width=500;" border=0>圖4 RAID 5示意圖
RAID 6
RAID 6是在RAID 5基礎上擴展而來的。與RAID 5一樣,數據和校驗碼都是被分成數據塊然後分別存儲到磁盤陣列的各個硬盤上。只是RAID 6中增加一塊校驗磁盤,用於備份分布在各個磁盤上的校驗碼,如圖5所示,這樣RAID 6磁盤陣列就允許兩個磁盤同時出現故障,所以RAID 6的磁盤陣列最少需要四塊硬盤。
500)this.width=500;" border=0>圖5 RAID 6示意圖
創建軟RAID
在紅旗Linux服務器中是通過mdadm工具來創建和維護軟RAID的,mdadm在創建和管理軟RAID時非常方便,而且很靈活。mdadm常用的參數有如下:
--create或-C:創建一個新的軟RAID,後面接raid設備的名稱。例如,/dev/md0,/dev/md1等。
--assemble或-A:加載一個已存在的陣列,後面跟陣列以及設備的名稱。
--detail或-D:輸出指定RAID設備的詳細信息。
--stop或-S:停止指定的RAID設備。
--level或-l:設置RAID的級別,例如,設置“--level=5”則表示創建陣列的級別是RAID 5。
--raid-devices或-n:指定陣列中活動磁盤的數目。
--scan或-s:掃描配置文件或/proc/mdstat文件來搜索軟RAID的配置信息,該參數不能單獨使用,只能配置其它參數才能使用。
下面將通過一個實例來講述通過mdadm如何實現軟RAID的功能。
【實例1】
某台機器上有4塊空閒的硬盤,分別是/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde,並用這四塊硬盤來創建來創建一個RAID 5,具體操作步驟如下:
1、創建分區
首先使用“fdisk”命令在每塊硬盤上創建一個分區,操作如下:
# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-102, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-102, default 102):
Using default value 102
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
針對其余幾塊硬盤也做相同操作,如果是直接基於磁盤來創建RAID設備,那麼就可以跳過這一步。
2、創建RAID 5
創建完/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四個分區後,下面就可以來創建RAID 5了,其中設定/dev/sde1作為備用設備,其余為活動設備,備用設備的作用是一旦某一設備損壞可以立即使用備用設備替換。操作命令如下:
# mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd[b-e]1
mdadm: array /dev/md0 started.
其中“--spare-devices=1”表示當前陣列中備用設備只有一塊,即作為備用設備的“/dev/sde1”,若有多塊備用設備,則將“--spare-devices”的值設置為相應的數目。成功創建完成RAID設備後,通過如下命令可以查看到RAID的詳細信息:
# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.01
Creation Time : Mon Jan 22 10:55:49 2007
Raid Level : raid5
Array Size : 208640 (203.75 MiB 213.65 MB)
Device Size : 104320 (101.88 MiB 106.82 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Mon Jan 22 10:55:52 2007
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 64K
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 65 -1 spare /dev/sde1
UUID : b372436a:6ba09b3d:2c80612c:efe19d75
Events : 0.6
3、創建RAID的配置文件
RAID的配置文件名為“mdadm.conf”,默認是不存在的,所以需要手工創建,該配置文件存在的主要作用是系統啟動的時候能夠自動加載軟RAID,同時也方便日後管理。“mdadm.conf”文件內容包括:由DEVICE選項指定用於軟RAID的所有設備,和ARRAY選項所指定陣列的設備名、RAID級別、陣列中活動設備的數目以及設備的UUID號。生成RAID配置文件操做如下:
# mdadm --detail --scan > /etc/mdadm.conf
但是當前生成“mdadm.conf”文件的內容並不符合所規定的格式,所以也是不生效的,這時需要手工修改該文件內容為如下格式:
# vi /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=b372436a:6ba09b3d:2c80612c:efe19d75
如果沒有創建RAID的配置文件,那麼在每次系統啟動後,需要手工加載軟RAID才能使用,手工加載軟RAID的命令是:
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/md0 has been started with 3 drives and 1 spare.
4、創建文件系統
接下來就只需要在RAID設備上創建文件系統就可使用了,在RAID設備上創建文件系統和在分區或磁盤上創建文件系統的方法一樣。在設備“/dev/md0”上創建ext3的文件系統命令如下:
# mkfs.ext3 /dev/md0
創建完文件系統後,將該設備掛載上就可正常的使用了。如果要創建其它級別的RAID,其步驟和創建RAID 5基本都一樣,區別在於指定“--level”值的時候,需要將該值設置為相應的級別。
軟RAID雖然很大程度上能保證數據的可靠性,但是在日常的工作中,有時可能需要對RAID進行調整以及不排除RAID設備物理介質損壞的可能等相關問題
,當遇到這些情況時,那麼同樣可以通過“mdadm”命令來完成這些操作。下面也將通過一個實例來介紹更換RAID故障磁盤的完整過程。
【實例2】
以前面的【實例1】為基礎,假定其中的“/dev/sdc1”設備出現故障時,更換一個新的磁盤,整個過程的詳細說明如下:
1、模擬故障磁盤
在實際中,當軟RAID檢測到某個磁盤有故障時,會自動標記該磁盤為故障磁盤,並停止對故障磁盤的讀寫操作,所以這裡需要將/dev/sdc1標記為出現故障的磁盤,命令如下:
# mdadm /dev/md0 --fail /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
由於【實例1】中的RAID 5設置了一個備用設備,所以當有標記為故障磁盤的時候,備用磁盤會自動頂替故障磁盤工作,陣列也能夠在短時間內實現重建。通過“/proc/mdstat”文件可查看到當前陣列的狀態,如下:
# cat /proc/mdstat
Personalities : [raid5]
md0 : active raid5 sde1[3] sdb1[0] sdd1[2] sdc1[4](F)
208640 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
[=====>...............] recovery = 26.4% (28416/104320) finish=0.0min speed=28416K/sec
unused devices: <none>
以上信息表明陣列正在重建,當一個設備出現故障或被標記故障時,相應設備的方括號後將被標以(F),如“sdc1[4](F)”,其中“[3/2]”的第一位數表示陣列所包含的設備數,第二位數表示活動的設備數,因為目前有一個故障設備,所以第二位數為2;這時的陣列以降級模式運行,雖然該陣列仍然可用,但是不具有數據冗余;而“[U_U]”表示當前陣列可以正常使用的設備是/dev/sdb1和/dev/sdd1,如果是設備“/dev/sdb1”出現故障時,則將變成[_UU]。
重建完數據後,再次查看陣列狀態時,就會發現當前的RAID設備又恢復了正常,如下:
# cat /proc/mdstat
Personalities : [raid5]
md0 : active raid5 sde1[1] sdb1[0] sdd1[2] sdc1[3](F)
208640 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
2、移除故障磁盤
既然“/dev/sdc1”出現了故障,當然要移除該設備,移除故障磁盤的操作如下:
# mdadm /dev/md0 --remove /dev/sdc1
mdadm: hot removed /dev/sdc1
其中“—remove”表示移除指定RAID設備中的某個磁盤,也可用“-r”來代替該參數。
3、添加新硬盤
在添加新的硬盤前,同樣需要對新硬盤進行創建分區的操作,例如,添加新硬盤的設備名為“/dev/sdc1”,則具體操作如下:
# mdadm /dev/md0 --add /dev/sdc1
mdadm: hot added /dev/sdc1
其中“--add”與前面的“--remove”其義剛好相反,用於將某個磁盤添加到指定的設備中,也可用“-a”代替該參數。
由於【實例1】中的RAID 5設置了一個備用設備,所以不需要做任何操作RAID 5也能正常運行,但是如果這時某塊磁盤再出現故障的話,會導致RAID 5沒有數據冗余功能,這對於存放重要的數據的設備來說顯得太不安全了。那麼這時增加到RAID 5中的“/dev/sdc1”則作為備用設備出現在陣列中,如下:
# mdadm --detail /dev/md0
/dev/md0:
……
……
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 65 1 active sync /dev/sde1
2 8 49 2 active sync /dev/sdd1
3 8 33 -1 spare /dev/sdc1
UUID : b372436a:6ba09b3d:2c80612c:efe19d75
Events : 0.133