1. 程式人生 > >RAID各級別、軟RAID

RAID各級別、軟RAID

0.目錄

1.RAID

1.1 什麼是RAID

RAID,全稱Redundant Array Inexpensive(Independent) Disks。這個名稱的由來有一定歷史原因,不贅述。現在就直接視為磁碟陣列。

磁碟陣列:將多塊磁碟,按一定的方式組合起來,以提高耐用性和IO能力

需要注意的是,RAID有冗餘能力提高了耐用性,但取代不了資料備份。因RAID冗餘只能保證磁碟壞時資料不受影響,如果資料遭到誤刪,那和磁碟就沒關係了,所以重要資料還是要備份。

1.2 使用場景

1、資料儲存在某磁碟上,若該磁碟損壞,則會導致業務終止。
2、磁碟訪問密集時,其有限的I/O能力將成為業務瓶頸。

1.3 RAID如何提高磁碟耐用性和I/O能力

RAID耐用性的實現,主要通過磁碟冗餘來實現;

RAID使I/O能力的提升,可通過其自帶的“CPU”和“記憶體”(僅供RAID使用),也可理解為是RAID的控制器。

  • 通過其“記憶體”的非同步存取可有效提升I/O能力。如果發生斷電等會導致非同步存取中斷。所以RAID一般配有電池,關機後仍可供電一段時間。
  • 通過其“CPU”,可將需存取的資料切割為多個chunk(即多份相同大小的資料)。按一定策略(即各RAID級別)儲存在各磁碟上,讀取時再合併各chunk的資料。這樣可降低各磁碟的I/O壓力,從而提升整體的I/O能力。

1.4 RAID級別

RAID有不同級別,各級別表示的是其組織各磁碟的方式,並非有級別“高低”之分。

RAID級別的設定在BIOS中,而非作業系統。

2.RAID各級別組織方式

2.1 RAID-0

2.1.1 實現方式

RAID-0,也稱條帶卷。RAID-0實現方式:

這裡寫圖片描述

資料儲存方式:
各chunk平均、依次分配儲存至各磁碟上,即把整個資料條帶化儲存了。

2.1.2 指標及分析

指標 產生結果(提升、下降均相對於單硬碟)
I/O能力 提升
耐用性 下降
使用的最少硬碟數 2
可用空間 N*min(Disk1,Disk2……)

分析:

  • I/O能力
    以上述圖示為例,如果資料的總大小為9G,每個硬碟僅需吞吐(即I/O)3G的資料,相對於單硬碟,RAID-0的每個硬碟I/O壓力明顯降低。
    使用更多的磁碟,就會更多地分攤I/O壓力。不過並不是新增硬碟越多就越好。因為讀取時,控制器需要時間合併各磁碟讀來的資料;寫入時又要費時間來分割資料。
  • 耐用性
    由RAID-0組織方式,可以看出其無冗餘能力。任何一塊硬碟損壞,就會造成整個資料的不完整,而多個硬碟出故障的概率又大於單硬碟。所以RAID-0耐用性相對於單硬碟是降低的。
    所以RAID-0不適合儲存關鍵資料。可用於儲存非關鍵的“中間資料”,比如交換分割槽資料、臨時檔案系統等。
  • 最少硬碟數
    由RAID-0組織方式,可知其最少使用2塊硬碟。
  • 可用空間
    RAID-0可用空間取決於其組成硬碟中最小的那個。因為根據RAID-0寫入資料的方式,任何一塊盤滿,其他硬碟也無法再寫入。

2.2 RAID-1

2.2.1 實現方式

RAID-1,也稱映象卷。RAID-1實現方式:

這裡寫圖片描述

資料儲存方式:
各chunk,每個硬碟都存一份,如同映象。

2.2.2 指標及分析

指標 產生結果(提升、下降均相對於單硬碟)
I/O能力 寫效能略微下降;讀效能提升
耐用性 提升
儲存空間利用率 50%以下
使用的最少硬碟數 最少為2,且一般也只用2塊硬碟
可用空間 1*min(Disk1,Disk2…)

分析:

  • I/O能力
    RAID-1各硬碟儲存的資料相同,在寫入時,資料在所有硬碟上都完整儲存才算寫入完成,所以雖然每個硬碟的寫入壓力相同,但RAID-1整體寫效能取決於最慢的那個硬碟。相對於單硬碟寫效能是略有下降的。
    讀效能提升。讀取各chunk不一定要在一塊硬碟上。比如chunk1在第一塊讀,chunk2在第二塊讀等等。從而降低各硬碟讀取壓力,RAID-1整體讀效能提升。
  • 耐用性
    有冗餘能力,也是其最大優點。每個硬碟都儲存資料,只要不同時損壞,資料即可正常讀寫。耐用性提升。
  • 儲存空間利用率
    有冗餘的RAID級別,儲存空間利用率都不會是100%。
    RAID-1若使用2塊盤,利用率為50%;使用更多則會在50%以下。因各硬碟資料都一樣。
  • 使用最少硬碟數
    由其組織方式決定,最少硬碟數為2,且一般就使用2個。如果使用2個以上,除了儲存空間利用率降低,寫效能也會進一步降低,因為寫入資料時要等所有硬碟都寫入完畢。
  • 可用空間
    各硬碟儲存的資料大小一致,所以只要其中1塊硬碟滿,其他硬碟均無法繼續寫入。且各硬碟儲存的內容相同。所以可用空間為1*min(Disk1,Disk2…)。

2.3 RAID-4

2.3.1 實現方式

RAID-4實現方式:

這裡寫圖片描述

資料儲存方式:
前面硬碟按條帶卷儲存各chunk,最後一塊硬碟作為校驗盤,儲存前面硬碟資料計算得出的校驗碼(比如按位計算出的異或值)。如果儲存資料的某硬碟損壞,校驗盤可和剩下的正常硬碟資料計算,得出損壞盤上的資料1

2.3.2 降級模式

  • 什麼是降級模式
    以RAID-4為例,一塊硬碟壞了之後,讀、寫仍是可以執行的。讀的話,需要邊計算邊讀,速度會比較慢;寫的話,也是邊計算邊寫到沒壞的硬碟和校驗盤上。
    這種存在壞硬碟的情況下繼續工作的狀態稱為降級模式
  • 降級模式的風險及規避
    顯然,降級模式下的讀、寫操作會增大剩餘好硬碟和校驗盤的壓力。對於RAID-4,處於降級模式時如果再壞一塊硬碟(也可以是校驗盤),那麼就徹底壞了。
    所以在出現硬碟故障時,應暫停使用RAID,換一塊新硬碟(一般是熱備一塊空閒盤)並計算出原來硬碟的資料。這樣就和原來狀態一樣了。
    不過,在計算原來硬碟資料的過程中也有可能出現新的壞盤(概率很小),對於RAID-4,這種情況也就意味著徹底壞了,RAID-4最多允許一塊壞盤。

2.3.3 缺陷

RAID-4的一大缺陷:單塊盤作為校驗盤,任何一個存資料的盤寫入資料,校驗盤的資料都要跟著變。這大大增加了校驗盤的壓力,使之成為RAID-4的效能瓶頸。

所以RAID-4不常用。

2.4 RAID-5

2.4.1 實現方式

這裡寫圖片描述

資料儲存方式:
RAID-5儲存原理與RAID-4相同。不過為了避免RAID-4單個校驗盤的壓力,RAID-5採用了各硬碟輪流儲存校驗值的方式

校驗資料從第一塊盤開始儲存,之後各硬碟依次做校驗盤,稱為左對襯。如上圖所示就是左對襯的方式(虛線標出)。相反地,校驗資料若從最後一塊盤開始,依次向前輪流做校驗盤,稱為右對稱。一般採用左對襯。

2.4.2 指標及分析

指標 產生結果(提升、下降均相對於單硬碟)
I/O能力 提升
耐用性 提升
儲存空間利用率 (N-1)/N以下,其中N為硬碟總數
使用的最少硬碟數 最少3個
可用空間 (N-1)*min(Disk1,Disk2…)

分析:

  • I/O能力
    每個硬碟僅儲存資料的一部分,所以I/O壓力減小,RAID總體I/O能力提升。
  • 耐用性
    同RAID-4,最多允許一塊硬碟掛掉,掛掉後即變為降級模式。2塊以上掛掉則徹底掛。
  • 可用空間
    最小的一塊硬碟滿,則RAID-5無法繼續儲存資料。且校驗資料大小相當於其中一塊硬碟。所以可用空間為(N-1)*min(Disk1,Disk2…)。

2.5 RAID-10

2.5.1 實現方式

這裡寫圖片描述

資料儲存方式:
各硬碟先分組做RAID-1,各組再在更高級別上做RAID-0

2.5.2 指標及分析

指標 產生結果(提升、下降均相對於單硬碟)
I/O能力 提升
耐用性 提升
儲存空間利用率 50%以下
使用的最少硬碟數 4個
可用空間 N*min(Disk1,Disk2…)/2

分析:

  • I/O能力
    每個硬碟僅儲存資料的一部分,所以I/O壓力減小,RAID總體I/O能力提升。
  • 耐用性
    除非某組映象卷的硬碟同時壞,否則資料不會損壞。映象捲包含硬碟較少,同時壞的可能性不大。

RAID-10是相對理想的機制。

2.6 RAID-01

2.6.1 實現方式

這裡寫圖片描述

資料儲存方式:
用若干硬碟先做RAID-0,再用同樣數量的硬碟,在更高級別上做RAID-1

兩邊的RAID-0儲存的總資料一樣,但由於兩邊RAID-0控制器對資料的切片方式未必相同,所以兩邊的切片結果未必相同(上圖中使用chunk1、chunk1一撇以示區分),所以兩邊的RAID-0若各有一個硬碟壞,則整個資料就會損壞

雖然這種方式可以在某一邊RAID-0的全部硬碟壞的情況下,仍儲存完整資料,但發生這種情況概率較低。反而是兩邊各壞一塊硬碟的概率較高(兩邊都是一堆裡面壞一個)。

整體來看,RAID-01不如RAID-10。

2.7 RAID-50

2.7.1 實現方式

這裡寫圖片描述

資料儲存方式:

各硬碟先分組做RAID-5,各組再在更高級別上做RAID-0

2.8 JBOD概念

這裡僅作為了解。
Just a Bunch Of Disks,僅是一組硬碟的捆綁。

顧名思義,JBOD邏輯上是把一堆硬碟合起來當做一個磁碟來用(這點同RAID),但它沒有提升I/O能力和耐用性,功能僅是結合各硬碟儲存空間,即其可用空間為sum(Disk1,Disk2…)。儲存資料方式是前一個硬碟滿就繼續儲存在後一個上。

3.軟RAID

3.1 mdadm

3.1.1 使用格式

RAID也可通過軟體實現,但生產環境中肯定都是硬體實現。不過以下使用軟RAID使用舉例,可對RAID有更清晰的理解。

軟體實現RAID是基於核心中的MD(Multi Devices)模組。

centos6上,使用系統命令mdadm來與該模組通訊,它具有不同模式。使用格式為:

mdadm [mode] <raiddevice> [options] <component-devices>
各欄位 意義
mode 指定模式。
raiddevice 指定RAID裝置2
options 選項。對於不同模式,可用的選項不同。
component-devices 組成RAID的成員裝置。

3.1.2 各常用模式

各模式 符號 意義
建立 -C 用於建立(create)
顯示 -D 顯示裝置詳細資訊(detail)
監控 -F
管理 該模式無需指定,使用某些選項預設就是在管理模式下。
停止 -S 停止指定RAID,釋放所有資源。
裝配 -A 裝配(assemble)一個已存在的陣列3

3.1.3 各常用選項

  • 建立模式下

    選項 意義
    -n # 指定多少塊裝置建立RAID(#為數字,下同)
    -l # 指定建立的RAID級別(level)4
    -a {yes|no} 指定是否自動(auto)建立RAID的裝置檔案
    -c 指定RAID的chunk的大小,比如512K
    -x # 指定備用的空閒盤的個數5
  • 管理模式下

    選項 意義
    -a 新增磁碟
    -r 移除磁碟
    -f 標記磁碟為損壞

3.2 使用舉例

3.2.1 建立

比如建立一個10G可用空間,3塊盤組成的RAID-5,另有1塊空閒盤備用。共需4硬碟。

  1. 建立4個分割槽當作硬碟,注意分割槽ID應為fd(Linux raid auto),否則無法裝配為RAID。建立分割槽結果:

    [[email protected] ~]# fdisk -l /dev/sdb
    
    Disk /dev/sdb: 107.4 GB, 107374182400 bytes
    255 heads, 63 sectors/track, 13054 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x6f7a5b9a
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1         654     5253223+  fd  Linux raid autodetect
    /dev/sdb2             655        1308     5253255   fd  Linux raid autodetect
    /dev/sdb3            1309        1962     5253255   fd  Linux raid autodetect
    /dev/sdb4            1963       13054    89096490    5  Extended
    /dev/sdb5            1963        2616     5253223+  fd  Linux raid autodetect
  2. 檢視/proc/mdstat(顯示當前系統所有RAID裝置),或檢視所有/dev/md#檔案,以新增新RAID裝置檔案時,避免和已有的裝置檔名重複。

    [[email protected] ~]# cat /proc/mdstat
    Personalities : 
    unused devices: <none>
    
    # 表示目前系統上沒有RAID裝置
    
  3. 使用mdadm建立RAID-5。chunk大小未指定,表示使用預設大小。

    [[email protected] ~]# mdadm -C /dev/md0 -n 3 -x 1 -l 5 -a yes /dev/sdb{1,2,3,5}
    mdadm: /dev/sdb1 appears to contain an ext2fs file system
           size=3156740K  mtime=Sun Dec  4 15:29:29 2016
    Continue creating array? y
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
  4. 仍在/proc/mdstat檢視是否建立完畢。

    [[email protected] ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4] 
    md0 : active raid5 sdb3[4] sdb5[3](S) sdb2[1] sdb1[0]
          10498048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
    
    unused devices: <none>

    active表示該RAID處於活動(可用)狀態;
    如有recovery正在執行及其執行的百分比6,表示組成RAID的各裝置正在逐位對齊7

    至此,RAID-5建立完成,可把該RAID在邏輯上看做為一個裝置了。

3.2.2 檢視

建立完成後,可使用顯示模式,檢視該軟RAID詳細資訊。

[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Mon Jan 23 22:06:37 2017
     Raid Level : raid5
     Array Size : 10498048 (10.01 GiB 10.75 GB)
  Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Jan 23 22:07:11 2017
          State : clean          # clean表示目前軟RAID狀態正常 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric        # 表示該RAID-5使用左對稱的方式
     Chunk Size : 512K

           Name : local:0  (local to host local)
           UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4
         Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       18        1      active sync   /dev/sdb2
       4       8       19        2      active sync   /dev/sdb3

       3       8       21        -      spare   /dev/sdb5

3.2.3 格式化、掛載

  1. 格式化

    [[email protected] ~]# mke2fs -t ext4 /dev/md0 
    mke2fs 1.41.12 (17-May-2010)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=128 blocks, Stripe width=256 blocks
    657072 inodes, 2624512 blocks
    131225 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2688548864
    81 block groups
    32768 blocks per group, 32768 fragments per group
    8112 inodes per group
    Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
    
    Writing inode tables: done                            
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 30 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
  2. 掛載

    [[email protected] ~]# mount /dev/md0 test_md
    [[email protected] ~]# mount | grep /dev/md0
    /dev/md0 on /root/test_md type ext4 (rw)

注意,如上所提到的,如果想讓其開機自動掛載,最好使用UUID或卷標來指定這個RAID,因為RAID的裝置檔案的數字在重啟後可能會改變。

3.2.4 冗餘測試

  1. 向該軟RAID掛載的目錄下拷貝一個檔案,後續驗證是否損壞。

    [[email protected] ~]# echo hello > test_md/hello
    [[email protected] ~]# cat test_md/hello
    hello
  2. 使用指令,人為標記組成該軟RAID的某裝置損壞。

    [[email protected] ~]# mdadm /dev/md127 -f /dev/sdb1
    mdadm: set /dev/sdb1 faulty in /dev/md127
    
    # 由於重啟過機器,該軟RAID的裝置檔案發生改變了,變為md127了。
    
    
    # 此處是把/dev/sdb1標記為損壞。
    
  3. 此時檢視軟RAID的狀態。

    • 損壞裝置時立即檢視,可以看到資料正在重建(rebuild)及重建的進度百分比。

      [[email protected] ~]# mdadm -D /dev/md127 
      /dev/md127:
              Version : 1.2
        Creation Time : Mon Jan 23 22:06:37 2017
           Raid Level : raid5
           Array Size : 10498048 (10.01 GiB 10.75 GB)
        Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
         Raid Devices : 3
        Total Devices : 4
          Persistence : Superblock is persistent
      
          Update Time : Wed Feb  1 20:21:34 2017
                State : clean, degraded, recovering    # 此時壞了一個裝置,備用的裝置在恢復(recovering)資料,所以只有兩塊可用,是降級(degraded)模式 
       Active Devices : 2
      Working Devices : 3
       Failed Devices : 1
        Spare Devices : 1
      
               Layout : left-symmetric
           Chunk Size : 512K
      
       Rebuild Status : 17% complete
      
                 Name : local:0  (local to host local)
                 UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4
               Events : 28
      
          Number   Major   Minor   RaidDevice State
             3       8       21        0      spare rebuilding   /dev/sdb5
             1       8       18        1      active sync   /dev/sdb2
             4       8       19        2      active sync   /dev/sdb3
      
             0       8       17        -      faulty   /dev/sdb1
    • 備用盤重建資料完成後再次檢視軟RAID資訊,可看到備用的/dev/sdb5完全替代了/dev/sdb1,其他資訊均和損壞前一樣。

      [[email protected] ~]# mdadm -D /dev/md127
      /dev/md127:
              Version : 1.2
        Creation Time : Mon Jan 23 22:06:37 2017
           Raid Level : raid5
           Array Size : 10498048 (10.01 GiB 10.75 GB)
        Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
         Raid Devices : 3
        Total Devices : 4
          Persistence : Superblock is persistent
      
          Update Time : Wed Feb  1 20:22:20 2017
                State : clean 
       Active Devices : 3
      Working Devices : 3
       Failed Devices : 1
        Spare Devices : 0
      
               Layout : left-symmetric
           Chunk Size : 512K
      
                 Name : local:0  (local to host local)
                 UUID : e50fa76a:477feeb3:c23cdc50:8a415bb4
               Events : 43
      
          Number   Major   Minor   RaidDevice State
             3       8       21        0      active sync   /dev/sdb5
             1       8       18        1      active sync   /dev/sdb2
             4       8       19        2      active sync   /dev/sdb3
      
             0       8       17        -      faulty   /dev/sdb1
    • 此時檢視軟RAID掛載點下的檔案,未損壞。

      [[email protected] ~]# cat test_md/hello 
      hello
  4. 再標記一個裝置損壞,使軟RAID變為降級模式,並檢視狀態和掛載點下的檔案。

    [[email protected] ~]# mdadm /dev/md127 -f /dev/sdb2
    mdadm: set /dev/sdb2 faulty in /dev/md127
    
    # 標記損壞
    
    [[email protected] ~]# mdadm -D /dev/md127 | grep "State :"
              State : clean, degraded
    
    # 檢視軟RAID狀態
    
    [[email protected] ~]# mdadm -D /dev/md127 | tail -n 7
    Number   Major   Minor   RaidDevice State
       3       8       21        0      active sync   /dev/sdb5
       2       0        0        2      removed
       4       8       19        2      active sync   /dev/sdb3
    
       0       8       17        -      faulty   /dev/sdb1
       1       8       18        -      faulty   /dev/sdb2
    
    # 組成軟RAID各裝置的狀態
    
    [[email protected] ~]# cat test_md/hello 
    hello
    
    # 降級模式不影響資料
    

3.2.5 移除壞盤,新增好盤

標記為壞盤的裝置,在重啟後會自動被移除出軟RAID;也可通過命令,直接移除。

[[email protected] ~]# mdadm /dev/md127 -r /dev/sdb{1,2}
mdadm: hot removed /dev/sdb1 from /dev/md127
mdadm: hot removed /dev/sdb2 from /dev/md127

然後可再新增好盤,上述的/dev/sdb{1,2}並不是真的故障,所以再新增進去也沒有問題。軟RAID的狀態也恢復為正常。

[[email protected] ~]# mdadm /dev/md127 -a /dev/sdb{1,2}
mdadm: added /dev/sdb1
mdadm: added /dev/sdb2
[[email protected] ~]# mdadm -D /dev/md127 | grep "State :"
          State : clean

3.2.6 停用、啟用、刪除軟RAID

當軟RAID不再使用時,可停用。停用前應先解除安裝,否則會報錯。

[[email protected] ~]# umount /dev/md127
[[email protected] ~]# mdadm -S /dev/md127 
mdadm: stopped /dev/md127
[[email protected] ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
unused devices: <none>

如果軟RAID裝置檔案還在可使用裝配模式重新啟用;
如需刪除軟RAID,把所有組成裝置移除即可。

(完)

  1. 比如chunk1資料為1101,chunk2資料為0110,它們的異或值是1011。如果chunk1壞了,使用它們的異或值,和chunk2再做一次異或即可得出chunk1原來的1101。
  2. RAID裝置檔案一般為/dev/md#,在重啟後數字可能會改變,所以一般通過卷標、UUID來指定RAID裝置。
  3. 一個軟RAID停用後,再想啟用時,需使用裝配模式。此處的裝配可理解為啟用。
  4. mdadm支援的級別:LINEAR(即JBOD)、RAID-0、RAID-1、RAID-4、RAID-5、RAID-6、RAID-10。
  5. 顯然,只有有冗餘能力的RAID級別,指定空閒盤才有意義。
  6. 使用cat檢視的百分比顯然會是一個固定的數字,使用命令watch可動態檢視其完成進度。
  7. RAID的儲存尤其是有冗餘能力的RAID,各硬碟要逐位對齊,否則出現壞盤時無法按位計算壞盤上的資料。