RAID 方案總結

lcy_ltpsr發表於2016-07-10

RAID 方案總結

1、簡介

RAID是redundant array of independent disks的縮寫,意指獨立磁碟冗餘陣列,是把相同的資料儲存在多個硬

盤的不同的地方的方法。通過把資料放在多個硬碟上,輸入輸出操作能以平衡的方式交疊,改良效能。因為多個硬碟增加了平均故障間隔時間(MTBF),儲存冗餘資料也增加了容錯。

2、RAID級別

當前已出現的RAID的級別

有 RAID0RAID1RAID01/RAID10RAID2RAID3RAID4RAID5RAID6RAID7越到後面的結構就是對前面結構的一種重複和再利用。常用的結構有RAID0RAID1RAID0+1RAID5

一般越是效能可靠的陣列需要更多的冗餘資料,單位位元的儲存成本也越高,例如RAID1RAID6。為了減少冗

餘資料量,RAID結構也引入資料校驗演算法(奇偶/hamming)來校驗及恢復資料,這種機制副作用是隨機讀寫資料時對校驗盤的訪問造成了速度瓶頸,不適用於大資料量的讀寫,例如RAID2345

對於不同的裝置而言,需要對於不同的應用場景使用不同的RAID結構,瞭解這些RAID結構的優缺點是有必要

的,以下將詳細闡述。

2.1 RAID 0:僅提高資料傳輸率的方案

RAID 0連續以位或位元組為單位分割資料,並行讀/寫於多個磁碟上,因此具有很高的資料傳輸率,但它沒有數

據冗餘,因此並不能算是真正的RAID結構。RAID 0只是單純地提高效能,並沒有為資料的可靠性提供保證,而且其中的一個磁碟失效將影響到所有資料。因此,RAID 0不能應用於資料安全性要求高的場合。

2.2 RAID 1:無需重組資料的高可靠高儲存成本方案

RAID 1是通過磁碟資料映象實現資料冗餘,在成對的獨立磁碟上產生互為備份的資料。當原始資料繁忙時,可

直接從映象拷貝中讀取資料,因此RAID 1可以提高讀取效能RAID 1是磁碟陣列中單位成本最高的,但提供了很高的資料安全性和可用性。當一個磁碟失效時,系統可以自動切換到映象磁碟上讀寫,而不需要重組失效的資料。

2.3 RAID 01/10RAID0+RAID1的複合方案

RAID 01/10根據組合分為RAID 10RAID 01,實際是將RAID 0RAID 1標準結合的產物,在連續地以位或位元組

為單位分割資料並且並行讀/寫多個磁碟的同時,為每一塊磁碟作磁碟映象進行冗餘。它的優點是同時擁有RAID 0的超凡速度RAID 1的資料高可靠性,但是CPU佔用率同樣也更高,而且磁碟的利用率比較低RAID 1+0是先鏡射再分割槽資料,再將所有硬碟分為兩組,視為是RAID 0的最低組合,然後將這兩組各自視為RAID 1運作。RAID 0+1則是跟RAID 1+0的程式相反,是先分割槽再將資料鏡射到兩組硬碟。它將所有的硬碟分為兩組,變成RAID 1的最低組合,而將兩組硬碟各自視為RAID 0運作。效能上,RAID 0+1RAID 1+0有著更快的讀寫速度。可靠性上,當RAID 1+0有一個硬碟受損,其餘三個硬碟會繼續運作。RAID 0+1 只要有一個硬碟受損,同組RAID 0的另一隻硬碟亦會停止運作,只剩下兩個硬碟運作,可靠性較低。因此,RAID 10遠較RAID 01常用,零售主機板絕大部份支援RAID 0/1/5/10,但不支援RAID 01



2.4 RAID 2:帶Hamming校驗的低速方案

RAID 2資料條塊化地分佈於不同的硬碟上,條塊單位為位或位元組,並使用稱為“加重平均糾錯碼(漢明

碼)”的編碼技術來提供錯誤檢查及恢復。


2.5 RAID 3:含奇偶校驗資訊塊低速方案

RAID 3RAID 2非常類似,都是將資料條塊化分佈於不同的硬碟上,區別在於RAID 3使用簡單的奇偶校驗,並

用單塊磁碟存放奇偶校驗資訊。如果一塊磁碟失效,奇偶盤及其他資料盤可以重新產生資料;如果奇偶盤失效則不影響資料使用。RAID 3對於大量的連續資料可提供很好的傳輸率,但對於隨機資料來說,奇偶盤會成為寫操作的瓶頸。

2.6 RAID 4:含1個校驗資訊塊低速可靠方案

RAID4RAID3很象,不同的是,它對資料的訪問是按資料塊進行的,也就是按磁碟進行的,每次是一個盤。在

圖上可以這麼看,RAID3是一次一橫條,而RAID4一次一豎條。它的特點和RAID3也挺象,不過在失敗恢復時,它的難度可要比RAID3大得多了,控制器的設計難度也要大許多,而且訪問資料的效率不怎麼好。

2.7 RAID 5

RAID 5不單獨指定的奇偶盤,而是在所有磁碟上交叉地存取資料及奇偶校驗資訊。在RAID 5上,讀/寫指標可

時對陣列裝置進行操作,提供了更高的資料流量。RAID 5適合於小資料塊和隨機讀寫的資料。RAID 3RAID 5相比,最主要的區別在於RAID 3每進行一次資料傳輸就需涉及到所有的陣列盤;而對於RAID 5來說,大部分資料傳輸只對一塊磁碟操作,並可進行並行操作。在RAID 5中有“寫損失”,即每一次寫操作將產生四個實際的讀/寫操作,其中兩次讀舊的資料及奇偶資訊兩次寫新的資料及奇偶資訊

2.8 RAID50

RAID 50RAID50RAID5RAID0的結合。此配置在RAID5的子磁碟組的每個磁碟上進行包括奇偶資訊在內的

資料的剝離。每個RAID5子磁碟組要求三個硬碟。RAID50具備更高的容錯能力,因為它允許某個組內有一個磁碟出現故障,而不會造成資料丟失。而且因為奇偶位分部於RAID5子磁碟組上,故重建速度有很大提高。優勢:更高的容錯能力,具備更快資料讀取速率的潛力。需要注意的是:磁碟故障會影響吞吐量。故障後重建資訊的時間比映象配置情況下要長。

2.9 RAID 6:含2個校驗資訊塊低速高可靠方案

RAID 5相比,RAID 6增加了第二個獨立的奇偶校驗資訊塊。兩個獨立的奇偶系統使用不同的演算法,資料的可

靠性非常高,即使兩塊磁碟同時失效也不會影響資料的使用。但RAID 6需要分配給奇偶校驗資訊更大的磁碟空間,相對於RAID 5有更大的“寫損失”,因此“寫效能”非常差。較差的效能和複雜的實施方式使得RAID 6很少得到實際應用。

2.10 RAID 7:帶高速緩衝的新標準

RAID 7是一種新的RAID標準,其自身帶有智慧化實時作業系統和用於儲存管理的軟體工具,可完全獨立於主機

執行,不佔用主機CPU資源。RAID 7可以看作是一種儲存計算機(Storage Computer),它與其他RAID標準有明顯區別。

RAID7所有的I/O傳送均是同步進行的,可以分別控制,這樣提高了系統的並行性,提高系統訪問資料的速度;每

個磁碟都帶有高速緩衝儲存器,實時作業系統可以使用任何實時操作晶片,達到不同實時系統的需要。允許使用SNMP協議進行管理和監視,可以對校驗區指定獨立的傳送通道以提高效率。可以連線多臺主機,因為加入高速緩衝儲存器,當多使用者訪問系統時,訪問時間幾乎接近於0。由於採用並行結構,因此資料訪問效率大大提高。需要注意的是它引入了一個高速緩衝儲存器,這有利有弊,因為一旦系統斷電,在高速緩衝儲存器內的資料就會全部丟失,因此需要和UPS一起工作。當然了,這麼快的東西,價格也非常昂貴。

2.11 其他

除了以上的各種標準,我們可以如RAID 0+1那樣結合多種RAID規範來構築所需的RAID陣列,例如RAID 

5+3RAID 53)就是一種應用較為廣泛的陣列形式。使用者一般可以通過靈活配置磁碟陣列來獲得更加符合其要求的磁碟儲存系統。


3、mdadm 實踐

首先顯示當前使用mdadm版本。

# mdadm -V
mdadm - v3.2.5 - 18th May 2012
3.1 建立RAID基本過程

以建立RAID1陣列為例,給出基本過程,建立其他RAID級別陣列過程類似。假設目前有兩個硬碟/dev/sda

/dev/sdb,目標是組成RAID1陣列裝置/dev/md0

3.1.1. 硬碟分割槽

首先在硬碟/dev/sda上分別建立一個分割槽

 # fdisk /dev/sda
     Command (m for help): n              按n建立新分割槽
     Command action
         e   extended
         p   primary partition (1-4)         輸入p 選擇建立主分割槽
     Partition number (1-4):                輸入 1 建立第一個主分割槽
First cylinder (1-204, default 1):          直接回車,選擇分割槽開始柱面這裡就從 1 開始
Last cylinder or +size or +sizeM or +sizeK (1-204, default 204):  直接回車,最後一個柱面
     Command (m for help): t               輸入t 指定分割槽型別!
Selected partition 1
     Hex code (type L to list codes): fd     fd 指 Linux raid auto,可用命令l顯示檔案格式列表確認
Command (m for help): w                 然後輸入w寫盤! 
    The partition table has been altered!
Calling ioctl() to re-read partition table.
    Syncing disks.

同樣的方法對/dev/sdb分割槽。

3.1.2.組成陣列

#mdadm --create --verbal /dev/md0 --level 1 -n2 /dev/sda1 /dev/sdb1
mdadm: /dev/sda1 appears to contain an ext2fs file system
    size=512000K  mtime=Thu Aug 21 08:25:31 2014
mdadm: /dev/sda1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Thu Aug 21 09:34:32 2014
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Thu Aug 21 09:34:32 2014
mdadm: size set to 58581824K
mdadm: largest drive (/dev/sda1) exceeds size (58581824K) by more than 1%
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
md: bind<sda1>
md: bind<sdb1>
md/raid1:md0: not clean -- starting background reconstruction
md/raid1:md0: active with 2 out of 2 mirrors
md0: detected capacity change from 0 to 59987787776
mdadm: array /demd: resync of RAID array md0
md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
v/md0 started.
md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
md: using 128k window, over a total of 58581824k.

之後可以檢視RAID同步資料的進度。不必等待同步作業完成,我們即可進行格式化,掛載,拷貝資料等其他工

作,及時關閉系統,同步工作也會在下次RAID啟動後繼續進行。
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
      58581824 blocks super 1.2 [2/2] [UU]
      [==================>..]  resync = 90.7% (53178304/58581824) finish=2.1min speed=42078K/sec

unused devices: <none>
3.1.3. 格式化陣列為linux ext4格式
# mkfs.ext4 /dev/md0
3.1.4.掛載到 /mnt/myRAID 後,就可以對RAID裝置進行讀寫操作了。
# mkdir /mnt/myRAID
# mount /dev/md0 /mnt/myRAID
3.2 啟動已有的RAID
3.2.1.啟動 mdadm 監視任務
# /etc/init.d/mdadm start

使用 restart 引數,在啟動前殺死可能已經啟動的相同程式。

# /etc/init.d/mdadm restart
Stopping MD monitoring service: mdadm --monitorNo /sbin/mdadm found running; none killed.
.
Starting MD monitoring service: mdadm --monitor.

3.2.2.啟動 mdadm-raid 任務,將自動掃描所有分割槽裝置,如果有裝置是RAID檔案系統,將按其中巨集塊資訊建立相應md裝置 /dev/mdX

# /etc/init.d/mdadm-raid restart

使用 restart 引數,在啟動前殺死可能已經啟動的相同程式。

# /etc/init.d/mdadm-raid restart
md: md0 stopped.
md: bind<sdb1>
md: bind<sda1>
md/raid1:md0: not clean -- starting background reconstruction
md/raid1:md0: active with 2 out of 2 mirrors
md0: detected capacity change from 0 to 59987787776
md: resync of RAID array md0
md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
md: using 128k window, over a total of 58581824k.
md0: unknown partition table
md: resuming resync of md0 from checkpoint.
Assembling MD array md0...done (started [2/2]).
Generating udev events for MD arrays...done.
3.2.3.掛載到 /mnt/myRAID 後,就可以對RAID裝置進行讀寫操作了。
# mkdir /mnt/myRAID
# mount /dev/md0 /mnt/myRAID
3.3 移除和新增磁碟

為了進行測試,我們需要從RAID移除及新增磁碟,同時檢視資料同步的效果。

3.3.1.移除磁碟

移除磁碟的方法最簡單的就是關閉電源後將磁碟拔下。不關電源需要實現的話使用以下指令。

# mdadm /dev/md0 --fail /dev/sdb    # 模擬磁碟錯誤
md/raid1:md0: Disk failure on sdb, disabling device.
md/raid1:md0: Operation continuing on 1 devices.
md: md0: recovery done.
mdadm: set /dev/sdb faulty in /dev/md0
# mdadm /dev/md0 --remove /dev/sdb    # 從/dev/md0移除磁碟/dev/sdb
md: unbind<sdb>
md: export_rdev(sdb)
mdadm: hot removed /dev/sdb from /dev/md0

如果沒有執行第一條命令,你將得到一個錯誤資訊。實際應用中我們應該通過檢測磁碟資訊來確定是否需要從

RAID中移除某塊磁碟,然後提示使用者更換。

# mdadm /dev/md0 -r /dev/sdb
md: cannot remove active disk sdb from md0 ...
mdadm: hot remove failed for /dev/sdb: Device or resource busy

3.3.2. 新增磁碟

新增磁碟使用以下命令

# mdadm /dev/md0 -a /dev/sdb    #向/dev/md0新增磁碟/dev/sdb
md: export_rdev(sdb)
md: bind<sdb>
mdadm: added /demd: recovery of RAID array md0
v/sdb
md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
md: using 128k window, over a total of 58581824k.
# cat /proc/mdstat                #顯示資料同步進度
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sdb[2] sda[3]
      58581824 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  1.5% (927104/58581824) finish=17.6min speed=54535K/sec

unused devices: <none>

當需要新增的磁碟已經被掛載(mount),你將得到以下錯誤資訊,下面的例子中,/dev/sdb1已經被掛載(mount)

到 /mnt/sdb1

# mdadm /dev/md0 -a /dev/sdb
mdadm: Cannot open /dev/sdb: Device or resource busy
# mdadm /dev/md0 -a /dev/sdb1
mdadm: Cannot open /dev/sdb1: Device or resource busy

當需要新增的磁碟容量小於現有RAID容量,你將獲得以下錯誤資訊。

# mdadm /dev/md0 -a /dev/sdb2
mdadm: /dev/sdb2 not large enough to join array

3.4 資料恢復測試

以下測試用於展示mdadmRAID管理功能。

測試1:通過--add新增磁碟病重新同步

假設/dev/md0是由/dev/sda/dev/sdb組成的RAID1,並已經掛載(mount)/mnt/myRAID

測試步驟:

# touch /mnt/myRAID/testfile            #向RAID分割槽寫入一些資料,用於後期檢查
# mdadm /dev/md0 --fail /dev/sdb        #模擬磁碟錯誤
# mdadm /dev/md0 --remove /dev/sdb   # 從/dev/md0移除磁碟/dev/sdb
# fdisk /dev/sdb                        #將/dev/sdb重新分割槽,或刪除所有分割槽
# mkfs.msdos /dev/sdb1                # 格式化/dev/sdb,確保磁碟內容被改寫。
# mdadm /dev/md0 --add /dev/sdb       # 向/dev/md0新增磁碟/dev/sdb
# cat /proc/mdstat                      # 顯示RAID同步進度

可以注意到,即使在納入RAID後,使用“fdisk–l /dev/sdb”檢視之前對/dev/sdb的分割槽結構沒有變化,而這

些不影響RAID使用。

測試2:通過--create新增磁碟並重新同步

假設/dev/md0是由/dev/sda/dev/sdb組成的RAID1,並已經掛載(mount)/mnt/myRAID測試步驟:

# touch /mnt/myRAID/testfile            #向RAID分割槽寫入一些資料,用於後期檢查
# mdadm /dev/md0 --fail /dev/sdb        #模擬磁碟錯誤
# mdadm /dev/md0 --remove /dev/sdb   # 從/dev/md0移除磁碟/dev/sdb
# fdisk /dev/sdb                        #將/dev/sdb重新分割槽,或刪除所有分割槽
# mkfs.msdos /dev/sdb1                # 格式化/dev/sdb,確保磁碟內容被改寫。
# reboot                               # 重啟系統
# mdadm -Cv /dev/md0 -l1 -n2 /dev/sd[ab]1        #按原有引數重新建立/dev/md0
# mount /dev/md0 /mnt/myRAID         # 掛載RAID
# ls /mnt/myRAID                       # 顯示RAID檔案
# cat /proc/mdstat                      # 顯示RAID同步進度


4、總結

RAID的意義在於在磁碟損壞時最大程度地保護資料。下表列出一些典型的RAID級別的效能特徵:

RAID級別

需要的磁碟數量

磁碟利用率

容許磁碟損壞個數

RAID0

2

100%

0

RAID1

2

50%

1

RAID0+1RAID1+0

4

50%

1

RAID5

4

75%

1

RAID6

5

60%

2

linux環境下,mdadm(multiply devices adminstrator)是一個相當成熟的RAID管理工具,具體mdadm的命令列參

數請參考網上資源。


相關文章