獨立冗餘磁碟陣列,也就是大家常說的RAID,英文全稱是:Redundant Array of Independent Disks,使用該技術,可以大幅提高硬碟裝置的 IO 讀寫速度,還存在數種資料冗餘備份機制提供使用者選擇,能夠降低使用者資料盤損壞帶來的資料丟失的風險。
RAID技術透過把多個硬碟裝置組合成一個容量更大、安全性更好的磁碟陣列,並把資料切割成多個區段後分別存放在各個不同的物理硬碟裝置上,然後利用分散讀寫技術來提升磁碟陣列整體的效能,同時把多個重要資料的副本同步到不同的物理硬碟裝置上,從而起到了非常好的資料冗餘備份效果。
常用的幾種RAID模式有RAID0、RAID1、RAID5和RAID10(RAID 一零)。
一、RAID的幾種模式
1、RAID0
RAID 0 技術把多塊物理硬碟裝置(至少兩塊)透過硬體或軟體的方式串聯在一起,組成一個大的卷組,並將資料依次寫入各個物理硬碟中。這樣一來,在最理想的狀態下,硬碟裝置的讀寫效能會提升數倍,但是若任意一塊硬碟發生故障,將導致整個系統的資料都受到破
壞。通俗來說,RAID 0 技術能夠有效地提升硬碟資料的吞吐速度,但是不具備資料誤修復能力。
如圖 所示,資料被分別寫入到不同的硬碟裝置中,兩塊硬碟會分別儲存資料資料,最終實現提升讀取、寫入速度的效果。
![一文全懂:獨立冗餘磁碟陣列(RAID)](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947560-1225825987.png)
- 最少需要的硬碟數:2
- 優點:更快的資料訪問。
- 缺點:沒有硬碟冗餘,所以資料丟失的風險會增加。未針對不同容量大小的硬碟進行最佳化。
2、RAID1
RAID1模式的磁碟陣列的模式就是“N+1”,無論有多少個磁碟,它只用一個儲存資料,其它每個磁碟都是它的映象,舉個例子:有兩個磁碟,那磁碟利用率就是50%,有N個磁碟,那磁碟利用率就是1/N。
這個模式是最沒用的模式了,因為太浪費空間了,基本也沒人用,除非是小型檔案儲存,而且對空間大小沒有什麼要求,但是對安全性有比較高的要求,那這時候就可以用到這個。相對於RAID0模式來說,它寫入速度要稍微慢一些,但是讀取速度要更快。
![一文全懂:獨立冗餘磁碟陣列(RAID)](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947778-176365981.png)
- 最少需要的硬碟數:2
- 優點:N 個硬碟冗餘。
- 缺點:儲存池可用空間被限制為一個硬碟的容量。未針對不同容量大小的硬碟進行最佳化。
3、RAID5
RAID5 技術是把硬碟裝置的資料奇偶校驗資訊儲存到其他硬碟裝置中。RAID 5 磁碟陣列中資料的奇偶校驗資訊並不是單獨儲存到某一塊硬碟裝置中,而是儲存到除自身以外的其他每一塊硬碟裝置上。這樣的好處是,其中任何一裝置損壞後都可以依賴其它幾塊裝置重建丟失的這塊硬碟資料。
好吧,以上說法太迷糊,那到底RAID5是如何實現一塊硬碟的資料冗餘,並在一塊硬碟損壞以後實現資料重建的呢?
首先,複習一下異或運算:
A | B | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0是偶數,1是基數,它們的異或結果就是奇偶校驗和。我們把上表中的A和B分別看做一個硬碟,0和1表示硬碟中儲存的資料,結果也看做一個硬碟,也就是說,把A和B中的儲存資料做了異或運算以後,放到第三個硬碟中;假如還有硬碟C、D、E、F呢?那結果就是 A異或B異或C異或D異或E異或F 。
這就是RAID5的原理了,但是並不完整,因為根據校驗和存放的位置不一樣,它會是不同的RAID模式:如果將所有的校驗和都放到一個硬碟中,那這個RAID模式就是RAID3;如果將校驗和分塊儲存到每個硬碟中,那就是RAID5了,可以說RAID5是RAID3的升級版。因為如果校驗和都放到一個硬碟中,那隻要存一條資料,就都要寫一次校驗和到校驗和盤,那這個專門存放校驗和的硬碟肯定容易壞。
在上圖中,Parity就是校驗和塊,每個磁碟都有其餘所有磁碟對應塊計算之後的校驗和,這樣就不怕任何一塊磁碟壞掉了,如果有一塊硬碟壞掉,只需要把所有其它盤對應塊的資料做一次校驗和,就知道缺失的這塊的資料是什麼了。這也就解釋了為什麼RAID5最少需要3塊硬碟,而且3塊硬碟的容量要一樣。
- 需要的硬碟數:3
- 優點:1 個硬碟的容錯機制並將儲存空間配置最佳化。
- 缺點:未針對不同容量大小的硬碟進行最佳化。
- 所有的校驗和塊加起來的大小正好是一塊硬碟的容量。
4、RAID10
首先,得說明,RAID10的叫法是“RAID一零",而非”RAID十“,RAID 10 技術是 RAID 1+RAID 0 技術的一個“組合體”。如下圖所示
![image-20240720160621392](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948506-651424470.png)
RAID10 技術需要至少 4 塊硬碟來組建,其中先分別兩兩製作成 RAID 1 磁碟陣列,以保證資料的安全性;然後再對兩個 RAID 1 磁碟陣列實施 RAID 0 技術,進一步提高硬碟裝置的讀寫速度。
這樣從理論上來講,只要壞的不是同一陣列中的所有硬碟,那麼最多可以損壞 50%的硬碟裝置而不丟失資料。由於 RAID 10 技術繼承了 RAID 0 的高讀寫速度和 RAID 1 的資料安全性,在不考慮成本的情況下 RAID 10 的效能也超過了 RAID 5,因此當前成為廣泛使用的一種儲存技術。
RAID 10 是先對資訊進行分割,然後再兩兩一組製作映象。也就是先將 RAID 1 作為最低階別的組合,然後再使用 RAID 0 技術將 RAID 1 磁碟陣列組合到一起,將它們視為“一整塊”硬碟。肯定會有人有疑問,是否可以先按照RAID0進行製作磁碟陣列,再利用RAID1技術將兩個磁碟陣列組合起來呢?這其實就是RAID01技術了。RAID01技術有很大缺陷,所以很少有人使用,原因如下:
- RAID10本質上是RAID0,它的擴充套件性很好,可以再新增幾個RAID1磁碟陣列也沒問題;但是RAID01本質上是RAID1磁碟陣列,它的缺點也正是RAID1磁碟陣列的缺點,那就是無論再增加幾個RAID0磁碟陣列,也只是增加了幾個映象而已,並不能真正的使用到新增加的磁碟陣列的容量。
- RAID10底層磁碟陣列是RAID1,它允許壞掉一塊磁碟而保證系統的正常執行;但是RAID01底層磁碟陣列是RAID0,一旦壞掉一塊磁碟,底層的RAID0磁碟陣列就會崩潰無法使用。
所以無論是從可擴充套件性上,還是資料安全性上,RAID10遠比RAID01磁碟陣列要好的多,以至於RAID01幾乎沒有人用。
二、使用mdadm命令管理RAID
linux中使用mdamd命令建立raid,mdadm英文全名為”multiple devices admin”,語法格式為“mdadm 引數 硬碟名稱”。
mdadm引數大全
引數 | 功能 |
---|---|
-a | 新增一塊裝置到磁碟陣列 |
-n | 指定裝置數量 |
-l | 指定 RAID 級別 |
-C | 建立 |
-v | 顯示過程 |
-f | 模擬裝置損壞 |
-r | 移除裝置 |
-Q | 檢視摘要資訊 |
-D | 檢視詳細資訊 |
-S | 停止 RAID 磁碟陣列 |
-x | 有幾塊備用盤 |
1、建立RAID10
以下操作均在在Vmware Workstation中進行
1.1 建立RAID10
一上來就建立RAID10,是不是難度有點高?其實不是,假設我們已經有了/dev/sdb
、/dev/sdc
、/dev/sdd
、/dev/sde
四個硬碟,大小都為20G,建立名稱為/dev/md0的命令只是一條就搞定了
mdadm -Cv /dev/md0 -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
-Cv:建立磁碟陣列並顯示過程
-n 4:該磁碟陣列有4個磁碟
-l 10:建立的磁碟陣列型別是RAID10
一條命令就建立好了RAID10,說真的,我還以為要手動建立若干個RAID1,然後將這些RAID1再用RAID0組合起來呢。
執行完該命令後,會有個初始化的過程,大概得一分鐘左右能初始化完成,可以透過mdadm -D /dev/md0
命令檢視該磁碟陣列的詳情
![image-20240720200142378](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948339-547978762.png)
1.2 格式化磁碟陣列
建立完磁碟陣列完成後,需要將磁碟陣列格式化之後才能使用,格式化命令還是mkfs命令
mkfs.ext4 /dev/md0
![image-20240720200611131](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948141-761038147.png)
1.3 掛載磁碟陣列
可以先建立一個資料夾/raid,然後掛載/dev/md0
mount /dev/md0 /raid
這時候再用lsblk
命令檢視,可以發現和以前的普通分割槽有所不同
![image-20240720201041698](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948214-2068297752.png)
磁碟陣列中的四個磁碟下都有md0分割槽,而且都是都是raid10型別。
為了永久掛載,還要寫配置檔案/etc/fstab
/dev/md0 /raid ext4 defaults 0 0
1.4 其它RAID模式
其它RAID模式是一樣的,只需要改變使用的硬碟數量和raild型別即可,故不再贅述其它型別的磁碟陣列建立。
2、磁碟損壞和更換
在使用磁碟陣列的過程中,不可避免的,總有一天會有硬碟損壞,在RAID10磁碟陣列中,最多同時允許壞掉50%的硬碟,這個容錯率是相當大了,那如果有一塊硬碟損壞了,如何更換這塊壞掉的硬碟呢?
先查詢下我們這個磁碟陣列的詳情
mdadm -D /dev/md0
![image-20240720215031119](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948282-1116202325.png)
可以看到md0磁碟陣列中有四塊硬碟。
首先,我們假設/dev/sdb這塊硬碟壞了,需要先將這塊硬碟標誌為不可用
mdadm /dev/md0 -f /dev/sdb
![image-20240720215208866](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947754-82002041.png)
然後移除該硬碟
mdadm /dev/md0 -r /dev/sdb
![image-20240720215305762](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947752-1617954609.png)
然後看下這個磁碟陣列當前的狀態
![image-20240720215723197](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948263-407369024.png)
可以看到磁碟陣列狀態多了個"degraded",表示磁碟陣列降級了,這意味著 RAID 陣列中至少有一個磁碟故障或處於離線狀態,導致陣列無法以完全冗餘的方式執行。因為我們移除了/dev/sdb硬碟,所以提示degraded狀態是正常的。
接下來我們新增一塊新硬碟/dev/sdf,替換掉壞掉的/dev/sdb,使用命令-a將其新增到磁碟陣列中
mdadm -D /dev/md0
![image-20240720220228630](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947773-2121837550.png)
然後看看當前磁碟陣列的狀態
![image-20240720220453827](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948318-1790102702.png)
可以看到狀態多了一個“recoverting”,表示磁碟陣列狀態正在恢復中,然後還有一個恢復進度,我們新增加的這塊硬碟被識別為“備用盤”,備用盤正在重建中。
耐心等一會兒,再看看磁碟陣列的狀態,它就正常了。
![image-20240720220750077](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948080-1315207508.png)
3、使用備份盤實現熱恢復
上一節我們實現了硬碟損壞的時候手動移除壞掉的硬碟,然後換上了新硬碟,整個過程其實有兩個問題
- 硬碟壞掉立馬被發現的機率比較低,往往要一段時間之後才會被發現硬碟壞掉了,處理的可能不夠很及時
- 更換硬碟的過程都是手動,甚至要關機安裝新硬碟,整個過程有操作失誤的風險
實際上有一種方式,能夠不用關機,不用手動移除,只要有一塊閒置的硬碟,這塊硬碟平時處於閒置狀態,一旦 RAID 磁碟陣列中有硬碟出現故障就會馬上自動頂替上去,並自動完成資料恢復,這功能豈不是很棒?
其實只需要初始化磁碟陣列的時候加上-x
引數即可。
接下來用RAID5為例演示該功能。RAID5要求最少要3塊硬碟,所以我準備了3塊硬碟+1塊備份盤一共四塊硬碟。下圖中的sdb、sdc、sdd、sde一共四塊。
![image-20240721103236385](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948005-1350799643.png)
接下來使用這四塊硬碟組raid5
mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
各項引數之前有過說明,不再贅述,主要是加了-x 1這個引數,表示有一塊備份盤。
然後透過mdadm -D /dev/md0
檢視組RAID詳情
![image-20240721103738255](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948117-24765464.png)
可以看到正在初始化,等一會兒,等它初始化結束了再操作下一步
![image-20240721103952055](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183949693-448689780.png)
可以看到該RAID5磁碟陣列中有4個硬碟,但是隻有3個是RAID的組成部分,還有一個Spare Device
,也就是備份盤。
接下來進行格式化和掛載
![image-20240721105210575](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948288-708234971.png)
使用df -h /raid
命令檢視/raid目錄的磁碟佔用情況
![image-20240721105406403](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947958-880990867.png)
可以看到3塊20G的硬碟組成的RAID5,掛載到/raid目錄後,可用儲存大小為40G,符合預期。
然後我們將一塊硬碟/dev/sdb
標記為已損壞,看看效果如何
mdadm /dev/md0 -f /dev/sdb
接下來,馬上執行命令mdadm -D /dev/md0
檢視當前磁碟陣列的詳情
![image-20240721121959656](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948172-634351016.png)
可以看到備份硬碟/dev/sde已經自動頂上去並開始初始化了,再過一會兒,在查詢下md0磁碟陣列
![image-20240721122244713](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183948274-1976899297.png)
可以看到/dev/sde已經完全取代了壞掉的/dev/sdb硬碟,並已經在正常工作。
4、刪除RAID
4.1 取消掛載
首先,刪除掉/etc/fstab檔案中相關的掛載內容
![image-20240721102306153](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947971-1726810357.png)
之後,手動取消掛載
umount /dev/md0
4.2 停止磁碟陣列
mdadm -S /dev/md0
![image-20240721102413410](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947778-1873906725.png)
停止磁碟陣列之後,會發現/dev/md0裝置已經消失不見了。
![image-20240721102659681](https://img2024.cnblogs.com/blog/516671/202407/516671-20240721183947993-472507563.png)
接下來,系統關機,拔出硬碟即可。
最後,歡迎關注我的部落格:https://blog.kdyzm.cn