RAID(Redundant Array of Inexpensive Disks)稱為廉價磁碟冗餘陣列。RAID 的基本想法是把多個便宜的小磁碟組合到一起,成為一個磁碟組,使效能達到或超過一個容量巨大、價格昂貴的磁碟。
目前 RAID技術大致分為兩種:基於硬體的RAID技術和基於軟體的RAID技術。其中在Linux下通過內建的軟體就能實現RAID功能,這樣便可省去購買昂貴的硬體 RAID 控制器和附件就能極大地增強磁碟的 IO 效能和可靠性。由於是用軟體去實現的RAID功能,所以它配置靈活、管理方便。同時使用軟體RAID,還可以實現將幾個物理磁碟合并成一個更大的虛擬設備,從而達到效能改進和資料冗餘的目的。當然基於硬體的RAID解決方案比基於軟體RAID技術在使用效能和服務效能上稍勝一籌,具體表現在檢測和修複多位錯誤的能力、錯誤磁碟自動檢測和陣列重建等方面。在本節將詳細講述如何在紅旗Linux伺服器上建立和維護軟RAID。
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,以此類推。
也稱為條帶模式(striped),即把連續的資料分散到多個磁碟上存取,1所示。當系統有資料請求就可以被多個磁碟並行的執行,每個磁碟執行屬於它自己的那部分資料請求。這種資料上的並行操作可以充分利用匯流排的頻寬,顯著提高磁碟整體存取效能。因為讀取和寫入是在裝置上並行完成的,讀取和寫入效能將會增加,這通常是運行 RAID 0 的主要原因。但RAID 0沒有資料冗餘,如果磁碟機出現故障,那麼將無法恢複任何資料。
圖1 RAID 0
RAID 1又稱為鏡像(Mirroring),一個具有全冗餘的模式,2所示。RAID 1可以用於兩個或2xN個磁碟,並使用0塊或更多的備用磁碟,每次寫資料時會同時寫入鏡像盤。這種陣列可靠性很高,但其有效容量減小到總容量的一半,同時這些磁碟的大小應該相等,否則總容量只具有最小磁碟的大小。
圖2 RAID 1
建立RAID 4需要三塊或更多的磁碟,它在一個磁碟機上儲存校正資訊,並以RAID 0方式將資料寫入其它磁碟,3所示。因為一塊磁碟是為校正資訊保留的,所以陣列的大小是(N-l)*S,其中S是陣列中最小磁碟機的大小。就像在 RAID 1中那樣,磁碟的大小應該相等。
如果一個磁碟機出現故障,那麼可以使用校正資訊來重建所有資料。如果兩個磁碟機出現故障,那麼所有資料都將丟失。不經常使用這個層級的原因是校正資訊儲存在一個磁碟機上。每次寫入其它磁碟時,都必須更新這些資訊。因此,在大量寫入資料時很容易造成校正磁碟的瓶頸,所以目前這個層級的RAID很少使用了。
圖3 RAID 4
在希望結合大量物理磁碟並且仍然保留一些冗餘時,RAID 5 可能是最有用的 RAID 模式。RAID 5可以用在三塊或更多的磁碟上,並使用0塊或更多的備用磁碟。就像 RAID 4一樣,得到的 RAID5 裝置的大小是(N-1)*S。
RAID5 與 RAID4 之間最大的區別就是校正資訊均勻分布在各個磁碟機上,4所示,這樣就避免了RAID 4中出現的瓶頸問題。如果其中一塊磁碟出現故障,那麼由於有校正資訊,所以所有資料仍然可以保持不變。如果可以使用備用磁碟,那麼在裝置出現故障之後,將立即開始同步資料。如果兩塊磁碟同時出現故障,那麼所有資料都會丟失。RAID5 可以經受一塊磁碟故障,但不能經受兩塊或多塊磁碟故障。
圖4 RAID 5
RAID 6是在RAID 5基礎上擴充而來的。與RAID 5一樣,資料和校正碼都是被分成資料區塊然後分別儲存到磁碟陣列的各個硬碟上。只是RAID 6中增加一塊校正磁碟,用於備份分布在各個磁碟上的校正碼,5所示,這樣RAID 6磁碟陣列就允許兩個磁碟同時出現故障,所以RAID 6的磁碟陣列最少需要四塊硬碟。
圖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的檔案系統命令如下:
建立完檔案系統後,將該裝置掛載上就可正常的使用了。如果要建立其它層級的RAID,其步驟和建立RAID 5基本都一樣,區別在於指定“--level”值的時候,需要將該值設定為相應的層級。
維護軟RAID
軟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 |