7.1 RAID概念
RAID獨立磁盤冗余陣列(Redundant Array of Independent Disks),RAID技術是將許多塊硬盤設備組合成一個容量更大、更安全的硬盤組,可以將數據切割成多個區段后分別存放在各個不同物理硬盤設備上,然后利用分散讀寫需求來提升硬盤組整體的性能,同時將重要數據同步保存多份到不同的物理硬盤設備上,可以有非常好的數據備份效果。
由於對成本和技術兩方面的考慮,因此需要針對不同的需求在數據可靠性及讀寫性能上做權衡,制定出各自不同的合適方案,目前已有的RAID硬盤組的方案至少有十幾種,RAID0、RAID1、RAID5、RAID10和RAID01是五種最常見的方案。
不得不說的是,raid了解越深入,越能體會到選擇和平衡的思想。
關於詳細的raid技術和原理實現方面,查看man md,該文檔中給出了非常詳細的實現方式,包括數據是如何組織的。
7.1.1 RAID 0
首先是RAID0硬盤組,這項技術是將多塊物理硬盤設備通過硬件或軟件的方式串聯在一起,成為一個大的卷組,有時它稱為條帶卷(striping)。它將數據依次分別寫入到各個物理硬盤中,這樣最理想的狀態會使得讀寫性能提升數倍,但若任意一塊硬盤故障則會讓整個系統的數據都受到破壞。
通俗來說RAID0硬盤組技術至少需要兩塊物理硬盤設備,能夠有效的提高硬盤的性能和吞吐量,但沒有數據的冗余和錯誤修復能力。如圖中所示,數據被分別寫入到不同的硬盤設備中。
7.1.2 RAID 1
RAID0技術雖然提高了存儲設備的IO讀寫速度,但RAID0中數據是被分開存放的,也就是說其中任何一塊硬盤出現問題都會破壞數據完整性。因此追求數據安全性的時候就不應該使用RAID0,而是使用RAID1。
如圖所示,RAID1硬盤組技術是將兩塊以上的存儲設備進行綁定,目的是讓數據被多塊硬盤同時寫入,類似於把數據再制作出多份鏡像,當有某一塊硬盤損壞后,一般可以立即通過熱交換方式來恢復數據的正常使用。
RAID1注重了數據的安全性,但因為是將多塊硬盤中寫入相同的數據,也就是說硬盤空間的真實可用率在理論上只有50%(利用率是1/n,n是陣列中的磁盤數量,不分奇偶),因此會明顯的提高硬盤組成本。另外,因為需要將數據同時寫入到兩塊以上的硬盤設備中,這無疑也會增加一定系統負載。
但要注意,raid1因為同一份數據保存了多份,所以讀性能和RAID0是一樣的(粗略的說是一樣。更細致的要分隨機讀、順序讀,這時不一定和raid0一樣)。
7.1.3 RAID 5
實際上單從數據安全和成本問題上來講,就不可能在保持存儲可用率的同時還不增加新設備的情況下大幅提升數據的安全性,RAID5硬盤組技術雖然理論上是兼顧三者的,但實際上是對各個方面的互相妥協和平衡。
7.1.4 RAID 10
RAID5在成本問題和讀寫速度以及安全性能上進行了妥協,但絕大部分情況下,相比硬盤的價格,數據的價值才是更重要的.因此更多的是使用RAID10,就是對RAID1+RAID0的一個"組合體"。
如圖所示,RAID10需要至少4塊硬盤,先分別兩兩制作成RAID1,保證數據的安全性,然后再對兩個RAID1實施RAID0技術,進一步的提高存儲設備的讀寫速度,這樣理論上只要壞的不是同一組中的所有硬盤,那么最多可以損壞50%的硬盤設備而不丟失數據,因此RAID10硬盤組技術繼承了RAID0更高的讀寫速度和RAID1更安全的數據保障,在不考慮成本的情況下RAID10在讀寫速度和數據保障性方面都超過了RAID5,是較為廣泛使用的存儲技術。
注意,上圖中一個數據塊是相鄰存儲在相同偏移的,即A和A在相鄰設備的同一高度,這只是RAID10的一種復制方法,稱為near復制方法,也是默認復制方法。此外,還有far、offset兩種復制方法。
7.1.5 RAID 01
RAID 10是RAID1+RAID0,而RAID01則是RAID0+RAID1。看起來它們是相同的,但實際上它們的差別在安全性上差很大。
如下圖。從圖中可以看出,在RAID01正常工作的時候,它的性能和RAID10是一樣的,都是條帶一份,鏡像一份。但是區別就在於安全性上。
如果RAID0組中的一塊磁盤壞了,對於這一個RAID0組來說,它已經失效了,並不是還可以從該組中的另一塊磁盤中讀取一半數據。
也就是說,RAID01只要壞了一塊盤后,該RAID0組就失效,IO的壓力就只在另一個RAID0組上,這很容易導致這一個raid0組也損壞磁盤,只要這時再壞一塊盤,所有數據就丟失了。
所以RAID01基本無人使用,太不安全。
7.1.6 RAID的冗余和性能計算
以下圖片截自wiki:https://en.wikipedia.org/wiki/Standard_RAID_levels
7.1.7 關於raid的理想值和實際應用值
上面介紹的,已經很多書上、老師講解的都是raid的理論情況,比如raid10的持續寫速度是"單盤速度*盤數量除2",raid5能實現盤數量-1的最大理論速度。但是這些都是"去他媽"的理論值,RAID的實際使用情況和理論之間有巨大的差別。所以,很有必要了解一下實際應用中那些理論之外的內容。
以下是我找到的一篇很不錯的介紹raid的理論外文章:https://zhuanlan.zhihu.com/p/31944934
7.2 Linux上軟raid管理
7.2.1 實現RAID10
首先需要為虛擬機中添加4塊硬盤設備(若以分區加入,則分區標識符為raid)來制作一個RAID10。然后使用mdadm工具用於在Linux系統中創建和管理軟RAID。
mdadm命令的格式為:
mdadm [模式] <RAID設備名稱> [選項] [成員設備名稱] 選項說明: 【創建模式】 -C:創建(create a new array) -l:指定raid級別(Set RAID level,0,1,5,10) -c:指定chunk大小(Specify chunk size of kibibytes,default 512KB) -a:檢測設備名稱(--auto=yes),yes表示自動創建設備文件/dev/mdN -n:指定設備數量(--raid-devices:Specify the number of active devices in the array) -x:指定備用設備數量(--spare-devices:Specify the number of spare (eXtra) devices in the initial array) -v:顯示過程 -f:強制行為 -r:移除設備(remove listed devices) -S:停止陣列(--stop:deactivate array, releasing all resources) -A:裝配陣列,將停止狀態的陣列重新啟動起來 【監控模式】 -Q:查看摘要信息(query) -D:查看詳細信息(Print details of one or more md devices) mdadm -D --scan >/etc/mdadm.conf,以后可以直接mdadm -A進行裝配這些陣列 【管理模式】 mdadm --manage /dev/md[0-9] [--add 設備名] [--remove 設備名] [--fail 設備名] --manage :mdadm使用manage模式,此模式下可以做--add/--remove/--fail/--replace動作 -add :將后面列出的設備加入到這個md --remove :將后面列出的設備從md中移除,相當於硬件raid的拔出動作 --fail :將后面列出的設備設定為錯誤狀態,即人為損壞,損壞后該設備放在raid中已經是無意義狀態的
(1).准備磁盤或分區,以分區為例。
/dev/sd{b,c,d,e}1這四個分區都是200M大小。
(2).使用mdadm命令創建RAID10,名稱為"/dev/md0"。
用-C參數代表創建一個RAID陣列卡,-v參數來顯示出創建的過程,同時在后面追加一個設備名稱,-a yes參數代表自動創建設備文件,-n 4參數代表使用4塊硬盤(分區)來制作這個RAID組,而-l 10參數則代表RAID10,最后再加上4塊設備的名稱就可以了。
[root@xuexi ~]# mdadm -C /dev/md0 -n 4 -l 10 -a yes /dev/sd{b,c,d,e}1
mdadm: /dev/sdb1 appears to contain an ext2fs file system size=10485760K mtime=Thu Jan 1 08:00:00 1970 Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
查看RAID設備信息。
[root@xuexi ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Jun 9 21:44:59 2017 Raid Level : raid10 Array Size : 387072 (378.06 MiB 396.36 MB) # 總共能使用的空間,因為是raid10,所以總可用空間為400M左右,除去元數據,大於370M左右 Used Dev Size : 193536 (189.03 MiB 198.18 MB) # 每顆raid組或設備上的可用空間,也即每個RAID1組可用大小為190M左右 Raid Devices : 4 # raid中設備的個數 Total Devices : 4 # 總設備個數,包括raid中設備個數,備用設備個數等 Persistence : Superblock is persistent Update Time : Fri Jun 9 21:45:02 2017 State : clean # 當前raid狀態,有clean/degraded(降級)/recovering/resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 # RAID10數據分布方式,有near/far/offset,默認為near,即數據的副本存儲在相鄰設備的相同偏移上。near=2表示要備份2份數據 Chunk Size : 512K Name : xuexi.longshuai.com:0 (local to host xuexi.longshuai.com) UUID : ff2b7d7c:381a4c47:c31e7edd:7cdef01e Events : 17 Number Major Minor RaidDevice State 0 8 17 0 active sync set-A /dev/sdb1 # 第一個raid1組A成員 1 8 33 1 active sync set-B /dev/sdc1 # 第一個raid1組B成員 2 8 49 2 active sync set-A /dev/sdd1 # 第二個raid1組A成員 3 8 65 3 active sync set-B /dev/sde1 # 第二個raid1組B成員
raid創建好后,它的運行狀態信息放在/proc/mdstat中。
[root@xuexi ~]# cat /proc/mdstat Personalities : [raid10] md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0] 387072 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU] unused devices: <none>
其中"md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]"表示md0是raid10級別的raid,且是激活狀態,sdX[N]表示該設備在raid組中的位置是N,如果有備用設備,則表示方式為sdX[N][S],S就表示spare的意思。
其中"387072 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]"表示該raid可用總空間為387072個block,每個block為1K,所以為378M,chunks的大小512K,[m/n]表示此raid10陣列需要m個設備,且n個設備正在正常運行,[UUUU]表示分別表示m個的每一個運行狀態,這里表示這4個設備都是正常工作的,如果是不正常的,則以"_"顯示。
再看看lsblk的結果。
[root@xuexi ~]# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT loop0 iso9660 CentOS_6.6_Final /mnt sda ├─sda1 ext4 77b5f0da-b0f9-4054-9902-c6cdacf29f5e /boot ├─sda2 ext4 f199fcb4-fb06-4bf5-a1b7-a15af0f7cb47 / └─sda3 swap 6ae3975c-1a2a-46e3-87f3-d5bd3f1eff48 [SWAP] sr0 sdb └─sdb1 linux_raid_member xuexi.longshuai.com:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e └─md0 sdc └─sdc1 linux_raid_member xuexi.longshuai.com:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e └─md0 sdd └─sdd1 linux_raid_member xuexi.longshuai.com:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e └─md0 sde └─sde1 linux_raid_member xuexi.longshuai.com:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e └─md0
(3).將制作好的RAID組格式化創建文件系統。
以創建ext4文件系統為例。
[root@xuexi ~]# mke2fs -t ext4 /dev/md0
(4).掛載raid設備,掛載成功后可看到可用空間為359M,因為RAID在創建文件系統時也消耗了一部分空間存儲文件系統的元數據。
[root@xuexi ~]# mount /dev/md0 /mydata [root@xuexi ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 2.7G 14G 16% / tmpfs tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 ext4 239M 28M 199M 13% /boot /dev/md0 ext4 359M 2.1M 338M 1% /mydata
7.2.2 損壞磁盤陣列及修復
通過manage模式可以模擬陣列中的設備損壞。
mdadm --manage /dev/md[0-9] [--add 設備名] [--remove 設備名] [--fail 設備名] 選項說明: manage :mdadm使用manage模式,此模式下可以做--add/--remove/--fail/--replace動作 --add :將后面列出的設備加入到這個md --remove :將后面列出的設備從md中移除 --fail :將后面列出的設備設定為錯誤狀態,即人為損壞
模擬/dev/sdc1損壞。
[root@xuexi mydata]# mdadm --manage /dev/md0 --fail /dev/sdc1 mdadm: set /dev/sdc1 faulty in /dev/md0
再查看raid狀態。
[root@xuexi mydata]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Jun 9 21:44:59 2017 Raid Level : raid10 Array Size : 387072 (378.06 MiB 396.36 MB) Used Dev Size : 193536 (189.03 MiB 198.18 MB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Fri Jun 9 22:22:29 2017 State : clean, degraded Active Devices : 3 Working Devices : 3 Failed Devices : 1 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Name : xuexi.longshuai.com:0 (local to host xuexi.longshuai.com) UUID : ff2b7d7c:381a4c47:c31e7edd:7cdef01e Events : 19 Number Major Minor RaidDevice State 0 8 17 0 active sync set-A /dev/sdb1 2 0 0 2 removed 2 8 49 2 active sync set-A /dev/sdd1 3 8 65 3 active sync set-B /dev/sde1 1 8 33 - faulty /dev/sdc1
由於4塊磁盤組成的raid10允許損壞一塊盤,且還允許壞第二塊非對稱盤。所以這里損壞了一塊盤后raid10是可以正常工作的。
現在可以將損壞的磁盤拔出,然后向raid中加入新的磁盤即可。
mdadm --manage /dev/md0 --remove /dev/sdc1
再修復時,可以將新磁盤加入到raid中。
mdadm --manage /dev/mn0 --add /dev/sdc1
7.2.3 raid備份盤
使用mdadm的"-x"選項可以指定備份盤的數量,備份盤的作用是自動頂替raid組中壞掉的盤。
7.2.4 停止和裝配raid
shell> umount /dev/md0 shell> mdadm --stop /dev/md0
關閉raid陣列后,該raid組/dev/md0就停止工作了。
如果下次想繼續啟動它,直接使用-A來裝配/dev/md0是不可以的,需要再次指定該raid中的設備成員,且和關閉前的成員一樣,不能有任何不同。
mdadm -A /dev/md0 /dev/sd{b,c,d,e}1
這樣做不太保險,其實可以在停止raid前,掃描raid,將掃描的結果保存到配置文件中,下次啟動的時候直接讀取配置文件即可。
mdadm -D --scan >> /etc/mdadm.conf # 這是默認配置文件
下次直接使用-A就可以裝置配置文件中的raid組。
mdadm -A /dev/md0
如果不放在默認配置文件中,則裝配的時候使用"-c"或"--config"選項指定配置文件即可。
shell> mdadm -D --scan >> /tmp/mdadm.conf
shell> mdadm -A /dev/md0 -c /tmp/mdadm.conf
7.2.5 徹底移除raid設備
當已經確定一個磁盤不需要再做為raid的一部分,可以將它移除掉。徹底移除一個raid設備並非那么簡單,因為raid控制器已經標記了一個設備,即使將它"mdadm --remove"也無法徹底消除raid的信息。
以移除/dev/md127中的/dev/sdb1為例。
首先,卸載、停止、移除:
umount /dev/sdb1 mdadm --stop /dev/md127 mdadm --manage /dev/md127 --remove /dev/sdb1
雖然從raid中移除了,但是江湖上還有它的傳說:刪除分區、創建分區、格式化,格式化的時候將被保護
$ parted /dev/sdb rm 1 $ parted /dev/sdb mkpart p 1 20G $ mke2fs -t ext4 /dev/sdb1 /dev/sdb1 is apparently in use by the system; will not make a filesystem here!
然后再去掃描raid設備,發現它又出現在raid組中:
$ mdadm -D -s ARRAY /dev/md/xuexi.longshuai.com:0 metadata=1.2 ............
$ lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs 367d6a77-033b-4037-bbcb-416705ead095 /boot ├─sda2 xfs b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / └─sda3 swap d505113c-daa6-4c17-8b03-b3551ced2305 [SWAP] sdb └─sdb1 linux_raid_member xue........ └─md127 ext4 2fed1dcc-b9a2-477f-8c8f-7131bbd4e919
換句話說,只要這個設備曾經是raid的一份子,你就沒法再直接使用它。就算你分區了,也不讓你格式化。
所以,要徹底移除一個raid設備,需要清空控制器可以讀取的raid簽名,只需將這個raid設備(可能是一個分區)的raid superblock用0去覆蓋掉就行了:
$ umount /dev/sdb1 $ mdadm --stop /dev/md127 $ mdadm --manage /dev/md127 --remove /dev/sdb1 $ mdadm --zero-superblock --force /dev/sdb1 # 這條命令是關鍵
然后,這個設備就和raid控制器完全say goodbye了:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
...........
sdb
└─sdb1
現在格式化也可以正常進行了:
mke2fs -t ext4 /dev/sdb1