軟 RAID 詳解

RAID

這篇文章聊聊軟RAIDhtml

RAID & 軟 RAID

RAID

隨着數據日益增加,單塊硬盤每每由於容量小而不能知足大部分人的需求,因而RAID就應運而生。RAIDRedundant Array of Independent Disks)即獨立磁盤冗餘陣列,簡稱磁盤陣列。簡單地說,RAID是由多個獨立的高性能磁盤驅動器組成的磁盤組,從而提供比單個磁盤更高的存儲性能和數據冗餘的技術。linux

Tips:JBOD

這裏要提一下JBODJust a Bunch of Disks)。JBOD將多個物理磁盤串聯起來,提供一個巨大的邏輯磁盤。JBOD的數據存放機制是由第一塊磁盤開始按順序日後存儲,當前磁盤存儲空間用完後,再依次日後面的磁盤存儲數據。JBOD存儲性能徹底等同於單塊磁盤,並且也不提供數據冗餘。它只是簡單提供一種擴展存儲空間的機制,JBOD可用存儲容量等於全部成員磁盤的存儲空間之和,即擁有容量疊加的做用。目前JBOD常指磁盤櫃,而不論其是否提供RAID功能。算法

關鍵技術

RAID中主要有三個關鍵概念和技術:鏡像(Mirroring)、數據條帶(Data Stripping)和數據校驗(Data parity)。windows

  • 鏡像,將數據複製到多個磁盤,一方面能夠提升可靠性,另外一方面可併發從兩個或多個副本讀取數據來提升讀性能。顯而易見,鏡像的寫性能要稍低,確保數據正確地寫到多個磁盤須要更多的時間消耗。
  • 數據條帶,將數據分片保存在多個不一樣的磁盤,多個數據分片共同組成一個完整數據副本,這與鏡像的多個副本是不一樣的,它一般用於性能考慮。數據條帶具備更高的併發粒度,當訪問數據時,能夠同時對位於不一樣磁盤上數據進行讀寫操做,從而得到很是可觀的I/O性能提高。
  • 數據校驗,利用冗餘數據進行數據錯誤檢測和修復,冗餘數據一般採用海明碼、異或操做等算法來計算得到。利用校驗功能,能夠很大程度上提升磁盤陣列的可靠性、魯棒性和容錯能力。不過,數據校驗須要從多處讀取數據並進行計算和對比,會影響系統性能。

不一樣等級的RAID採用一個或多個以上的三種技術,來得到不一樣的數據可靠性、可用性和I/O性能。至於採用何種模式的RAID,須要在深刻理解系統需求的前提下進行合理選擇,綜合評估可靠性、性能和成原本進行折中的選擇。緩存

<center>raid models</center>併發

優點

隨着處理器、內存、計算機接口等技術的不斷髮展,RAID不斷地發展和革新,在計算機存儲領域獲得了普遍的應用,從高端系統逐漸延伸到普通的中低端系統。RAID技術如此流行,源於其具備顯著的特徵和優點,基本能夠知足大部分的數據存儲需求。整體說來,RAID主要優點有以下幾點運維

  1. 大容量RAID擴大了磁盤的容量,由多個磁盤組成的RAID系統具備海量的存儲空間。如今單個磁盤的容量就能夠到10TB以上,這樣RAID的存儲容量就能夠達到PB級,大多數的存儲需求均可以知足。通常來講,RAID可用容量要小於全部成員磁盤的總容量。不一樣等級的RAID算法須要必定的冗餘開銷,具體容量開銷與採用算法相關。若是已知RAID算法和容量,能夠計算出RAID的可用容量。一般,RAID容量利用率在50% ~ 90%之間。
  2. 高性能RAID的高性能受益於數據條帶化技術。單個磁盤的I/O性能受到接口、帶寬等計算機技術的限制,性能每每頗有 限,容易成爲系統性能的瓶頸。經過數據條帶化,RAID將數據I/O分散到各個成員磁盤上,從而得到比單個磁盤成倍增加的聚合I/O性能。
  3. 可靠性,可用性和可靠性是RAID的另外一個重要特徵。從理論上講,由多個磁盤組成的RAID系統在可靠性方面應該比單個磁盤要差。這裏有個隱含假定:單個磁盤故障將致使整個RAID不可用。RAID採用鏡像和數據校驗等數據冗餘技術,打破了這個假定。鏡像是最爲原始的冗餘技術,把某組磁盤驅動器上的數據徹底複製到另外一組磁盤驅動器上,保證總有數據副本可用。 比起鏡像50%的冗餘開銷,數據校驗要小不少,它利用校驗冗餘信息對數據進行校驗和糾錯。RAID冗餘技術大幅提高數據可用性和可靠性,保證了若干磁盤出錯時,不會致使數據的丟失,不影響系統的連續運行。
  4. 可管理性,實際上,RAID是一種虛擬化技術,它對多個物理磁盤驅動器虛擬成一個大容量的邏輯驅動器。對於外部主機系統來講,RAID是一個單一的、快速可靠的大容量磁盤驅動器。這樣,用戶就能夠在這個虛擬驅動器上來組織和存儲應用系統數據。從用戶應用角度看,可以使存儲系統簡單易用,管理也很便利。因爲RAID內部完成了大量的存儲管理工做,管理員只須要管理單個虛擬驅動器,能夠節省大量的管理工做。RAID能夠動態增減磁盤驅動器,可自動進行數據校驗和數據重建,這些均可以大大簡化管理工做。

<center>raid advantages</center>ide

因爲本篇文章主要講解的是軟RAID,因此就不展開贅述,對RAID想要深刻了解或對RAID各類模式感興趣的,能夠閱讀如下連接:工具

軟 RAID

RAID分爲軟件RAID和硬件RAID佈局

硬 RAID

硬件磁盤陣列(hardwareRAID)是經過磁盤陣列卡RAID卡)來建立磁盤陣列的。在RAID卡上會有一個專門的芯片來處理RAID任務,能夠大大減輕原來系統的計算壓力和I/O壓力,效率也會獲得很好的提高;同時如今大部分的RAID卡都支持熱拔插,因此在更換損壞磁盤時是很是方便的。可是很差的一點是RAID比較貴,特別是那些好一點的RAID卡就會特別貴,並且功能還不能保證特別齊全,因此在這種狀況下就出現了軟件RAID,來模擬硬件RAID

軟 RAID

軟件RAID是一種模擬硬件RAID的產物,運行在操做系統上面,全部任務的處理都由CPU來完成,因此須要佔用必定的系統資源,特別是計算和I/O資源,因此性能不如硬RAID,但軟RAID實現簡單,不須要額外的硬件設備。。雖說如今的機器計算速度都很是快了,可是對於一些要求較高的場景或企業,通常最好仍是儘可能不要選擇軟件RAID的,畢竟在總的使用成本上來講硬件RAID性價比仍是蠻高的(硬RAID經過RAID卡解決了不少管理問題,大大地下降了後期運維成本)。

硬軟 RAID 優劣比較

RAID優點:

  • 性能,全部RAID操做都由RAID控制芯片完成,不佔用任何CPU和內存資源,並且RAID卡上通常還有額外的cache進一步提高性能,同時擁有獨立的電池對緩存進行供電保護,系統重啓/電源恢復的時候能夠把緩存中未寫入硬盤的數據寫入硬盤。
  • 功能強大,硬RAID能夠支持全部與RAID相關的功能和全部RAID級別,而軟RAID只能支持幾種基礎的RAID級別,而且不具備硬RAID的許多高級功能,好比點燈、緩存、熱插拔等等。
  • 兼容性,硬RAID獨立於系統,例如windows/linux均可以用,自己擁有CPU、內存、電池等。軟RAID依賴於操做系統,若是操做系統出問題,軟RAID就掛了。硬RAID的兼容性要好不少,萬一系統出了問題,也能夠很方便地作系統維護和數據恢復。

RAID優點:

  • 免費!
  • 免費!
  • 免費!

重要的事情說三遍,軟RAID最大的優點就是便宜!!!

總的來講,硬RAID功能上是完爆軟RAID的,可是硬RAID比較昂貴,通常的RAID都須要幾千元。企業級的核心應用推薦採用硬RAID的方案,花錢解決一切煩惱。而一些不是特別核心的應用或者我的推薦採用軟RAID,軟RAID目前大部分操做系統都支持,而且對基礎的RAID的功能支持的也不錯,可以知足大部分需求,最關鍵的仍是不要錢!!!

mdadm

mdadmLinux操做系統上開源的軟RAID用戶層管理工具,容許用戶建立和管理軟RAID磁盤陣列。

目前,mdadm支持大部分常見的陣列類型,如JBODRAID0RAID1RAID4RAID5RAID6MULTIPATHRAID10等,建立和管理RAID也十分的方便,同時,mdadm使用很是靈活,磁盤或者分區均可以做爲RAID的成員盤來建立軟RAID。主要有7種使用模式:

模式名字 主要功能
Create 使用空閒的設備建立一個新的陣列,每一個設備具備元數據塊
Assemble 將原來屬於一個陣列的每一個塊設備組裝爲陣列
Build 建立或組裝不須要元數據的陣列,每一個設備沒有元數據塊
Manage 管理已經存儲陣列中的設備,好比增長熱備磁盤或者設置某個磁盤失效,而後從陣列中刪除這個磁盤
Misc 報告或者修改陣列中相關設備的信息,好比查詢陣列或者設備的狀態信息
Grow 改變陣列中每一個設備被使用的容量或陣列中的設備的數目
Monitor 監控一個或多個陣列,上報指定的事件

建立陣列

mdadm使用--create(或其縮寫-C)參數來建立新的陣列,而且將一些重要陣列的標識信息做爲元數據能夠寫在每個底層設備的指定區間。--level(或者其縮寫-l)表示陣列的RAID級別,--chunk(或者其縮寫-c)表示每一個條帶單元的大小,以KB爲單位,默認爲64KB,條帶單元的大小配置對不一樣負載下的陣列讀寫性能有很大影響。--raid-devices(或者其縮寫-n)表示陣列中活躍的設備個數,而--spare-devices(或者其縮寫-x)表示陣列中熱備盤的個數,一旦陣列中的某個磁盤失效,MD內核驅動程序自動用將熱備磁盤加入到陣列,而後重構丟失磁盤上的數據到熱備磁盤上。

建立RAID0:
mdadm --create /dev/md0 --level=0 --chunk=32 --raid-devices=3 /dev/sd[i-k]1
建立RAID1:
mdadm -C /dev/md0 -l1 -c128 -n2 -x1 /dev/sd[i-k]1
建立RAID5:
mdadm -C /dev/md0 -l5 -n5 /dev/sd[c-g] -x1 /dev/sdb 
建立RAID6:
mdadm -C /dev/md0 -l6 -n5 /dev/sd[c-g] -x2 /dev/sdb /dev/sdh
建立RAID10:
mdadm -C /dev/md0 -l10 -n6 /dev/sd[b-g] -x1 /dev/sdh

若是一個塊設備元數據中含有其餘舊陣列信息,這時候會須要交互式命令確認yes/no,若是想自動化,經過管道符的方式便可:

採用missing做爲其中一個設備,至關於建立單盤raid1
yes|mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing

Build模式能夠用來建立沒有元數據(即沒有superblock)的RAID0/1設備,不能建立RAID4/5/6/10等設備。因爲不存在元數據塊,不少區分和檢查工做沒法進行,須要對使用設備特別清楚,這種模式不經常使用,經常使用的仍是Create模式,畢竟元數據塊仍是擁有很大的做用。

[root@test ~]# ./mdadm -BR /dev/md0 -l0 -n6 /dev/sd[b-g]
mdadm: array /dev/md0 built and started. 
[root@test ~]# ./mdadm -BR /dev/md0 -l1 -n2 /dev/sd[b-c]
mdadm: array /dev/md0 built and started.
[root@test ~]# ./mdadm -BR /dev/md0 -l5 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@test ~]# ./mdadm -BR /dev/md0 –l6 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@test ~]# ./mdadm -BR /dev/md0 –l10 -n6 /dev/sd[b-g]
mdadm: Raid level 10 not permitted with --build.

查詢陣列

經過命令查詢陣列信息

經過mdadm命令查看指定陣列的簡要信息(使用--query或者其縮寫-Q)和詳細信息(使用--detail或者其縮寫-D) 詳細信息包括RAID的版本、建立的時間、RAID級別、陣列容量、可用空間、設備數量、超級塊狀態、更新時間、UUID信息、各個設備的狀態、RAID算法級別類型和佈局方式以及塊大小等信息。設備狀態信息分爲activesyncsparefaultyrebuildingremoving等等。

查詢簡要信息
[root@test ~]# mdadm --query /dev/md0
/dev/md0: 2.100GiB raid10 6 devices, 1 spare. Use mdadm --detail for more detail.
查詢詳細信息
[root@test ~]# ./mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 17:49:53 2018
     Raid Level : raid10
     Array Size : 3145536 (3.00 GiB 3.22 GB)
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
 
    Update Time : Sun Aug 22 21:55:02 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
 
         Layout : near=2, far=1
     Chunk Size : 64K
 
           UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a
         Events : 0.122
 
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
 
       6       8      112        -      spare   /dev/sdh

經過命令查詢陣列中設備信息

上面是查詢陣列裏面的詳細信息,咱們也能夠查詢陣列中具體設備的詳細信息,使用命令--examine(或者其縮寫-E)來檢測當前的塊設備上是否有陣列的元數據信息,包括設備RAID級別,設備UUID,陣列UUID等等。

[root@test ~]# mdadm -E /dev/sdb1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : df3ceb66:95a8c503:9c6c41b2:db583c57
           Name : host244:root
  Creation Time : Wed Apr 17 18:33:11 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 167772160 (80.00 GiB 85.90 GB)
     Array Size : 83886080 (80.00 GiB 85.90 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130992 sectors, after=0 sectors
          State : clean
    Device UUID : 8054a66a:962c52e8:be0c8425:db207be4

Internal Bitmap : 8 sectors from superblock
    Update Time : Sat May  4 16:13:56 2019
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : 6af807c8 - correct
         Events : 207


   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

經過文件查詢陣列信息

咱們還能夠經過cat /proc/mdstat查看全部運行的RAID陣列的狀態,在第一行中首先是MD的設備名,activeinactive選項表示陣列是否能讀寫,接着是陣列的RAID級別,後面是屬於陣列的塊設備,方括號[]裏的數字表示設備在陣列中的序號,(S)表示其是熱備盤,(F)表示這個磁盤是faulty狀態。在第二行中首先是陣列的大小,單位是KB,接着是chunk-size的大小,而後是layout類型,不一樣RAID級別的layout類型不一樣,[6/6][UUUUUU]表示陣列有6個磁盤而且6個磁盤都是正常運行的,而[5/6][_UUUUU]表示陣列有6個磁盤中5個都是正常運行的,下劃線對應的那個位置的磁盤是faulty狀態的。

[root@test ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
 
unused devices: <none>
[root@test ~]# mdadm /dev/md0 -f /dev/sdh /dev/sdb
mdadm: set /dev/sdh faulty in /dev/md0
mdadm: set /dev/sdb faulty in /dev/md0
[root@test ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2]
      3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU]
      [=======>........]  recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec
unused devices: <none>

而且還會展現陣列中一些狀態,好比recvoeryresync等等,而且還有詳細包括進度值、速度、完成塊大小等。

經過文件系統查詢

Linux系統目前支持sysfs也能夠訪問/sys/block/md0目錄查詢陣列信息。

[root@test ~]# ls -l /sys/block/md0/
capability  holders  range      size    stat       uevent
dev         md       removable  slaves  subsystem
[root@test ~]# ls /sys/block/md0/md/
array_state      dev-sdg           rd1               suspend_lo
bitmap_set_bits  dev-sdh           rd2               sync_action
chunk_size       layout            rd3               sync_completed
component_size   level             rd4               sync_speed
dev-sdb          metadata_version  rd5               sync_speed_max
dev-sdc          mismatch_cnt      reshape_position  sync_speed_min
dev-sdd          new_dev           resync_start
dev-sde          raid_disks        safe_mode_delay
dev-sdf          rd0               suspend_hi
[root@test ~]# ls /sys/block/md0/slaves/
sdb  sdc  sdd  sde  sdf  sdg  sdh

中止 & 刪除陣列

當陣列沒有文件系統或者其餘存儲應用以及高級設備使用的話,可使用--stop(或者其縮寫-S)中止陣列;若是命令返回設備或者資源忙類型的錯誤,說明/dev/md0正在被上層應用使用,暫時不能中止,必需要首先中止上層的應用,這樣也能保證陣列上數據的一致性。

[root@test ~]# mdadm --stop /dev/md0
mdadm: fail to stop array /dev/md0: Device or resource busy
[root@test ~]# umount /dev/md0
[root@test ~]# mdadm --stop /dev/md0 
mdadm: stopped /dev/md0

上面只是中止陣列,陣列其中的設備還存在着陣列元數據信息,若是須要完全刪除陣列,還須要--zero-superblock將陣列中全部設備的元數據塊刪除。

[root@test ~]# mdadm --zero-superblock /dev/sdb

組裝陣列

模式--assemble或者其縮寫(-A)主要是檢查底層設備的元數據信息,而後再組裝爲活躍的陣列。若是咱們已經知道陣列由那些設備組成,能夠指定使用那些設備來啓動陣列。

[root@test ~]# mdadm -A /dev/md0 /dev/sd[b-h]
mdadm: /dev/md0 has been started with 6 drives and 1 spare.

能夠經過配置文件/etc/mdadm.conf從新組裝,mdadm先檢查mdadm.conf中的DEVICE信息,而後從每一個設備上讀取元數據信息,並檢查是否和ARRAY信息一致,若是信息一致則啓動陣列。

mdadm -As /dev/md0

若是沒有配置/etc/mdadm.conf文件,並且又不知道陣列由那些磁盤組成,則可使用上面提到的查詢命令--examine(或者其縮寫-E)來檢測當前的塊設備上是否有陣列的元數據信息,找到陣列的惟一標識UUID和陣列包含的設備名字,而後再使用上面的命令來組裝陣列,也可使用UUID標識來組裝陣列。沒有一致的元數據的信息設備(例如/dev/sda/dev/sda1等)mdadm程序會自動跳過。

[root@test ~]# ./mdadm -Av --uuid=0cabc5e5:842d4baa:e3f6261b:a17a477a /dev/md0 /dev/sd*
mdadm: looking for devices for /dev/md0
mdadm: no recogniseable superblock on /dev/sda
mdadm: /dev/sda has wrong uuid.
mdadm: no recogniseable superblock on /dev/sda1
mdadm: /dev/sda1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdi
mdadm: /dev/sdi has wrong uuid.
mdadm: /dev/sdi1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdj
mdadm: /dev/sdj has wrong uuid.
mdadm: /dev/sdj1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdk
mdadm: /dev/sdk has wrong uuid.
mdadm: /dev/sdk1 has wrong uuid.
mdadm: /dev/sdb is identified as a member of /dev/md0, slot 0.
mdadm: /dev/sdc is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sdd is identified as a member of /dev/md0, slot 2.
mdadm: /dev/sde is identified as a member of /dev/md0, slot 3.
mdadm: /dev/sdf is identified as a member of /dev/md0, slot 4.
mdadm: /dev/sdg is identified as a member of /dev/md0, slot 5.
mdadm: /dev/sdh is identified as a member of /dev/md0, slot 6.
mdadm: added /dev/sdc to /dev/md0 as 1
mdadm: added /dev/sdd to /dev/md0 as 2
mdadm: added /dev/sde to /dev/md0 as 3
mdadm: added /dev/sdf to /dev/md0 as 4
mdadm: added /dev/sdg to /dev/md0 as 5
mdadm: added /dev/sdh to /dev/md0 as 6
mdadm: added /dev/sdb to /dev/md0 as 0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.

配置文件:

/etc/mdadm.conf做爲默認的配置文件,主要做用是方便跟蹤軟RAID的配置,尤爲是能夠配置監視和事件上報選項。Assemble命令也可使用--config(或者其縮寫-c)來指定配置文件。咱們一般能夠以下命令來創建配置文件。

[root@test ~]# mdadm -Ds > /etc/mdadm.conf
[root@test ~]# cat /etc/mdadm.conf
# mdadm.conf written out by anaconda
MAILADDR root
AUTO +imsm +1.x -all
ARRAY /dev/md/1 level=raid1 num-devices=2 UUID=fe796549:cdbe506c:51e5404e:fa40fee6
ARRAY /dev/md/2 level=raid1 num-devices=2 UUID=60cecdc1:f115d9e5:f9ddfb52:c3c035ab
ARRAY /dev/md/3 level=raid1 num-devices=2 UUID=df3ceb66:95a8c503:9c6c41b2:db583c57
ARRAY /dev/md/4 level=raid0 num-devices=2 UUID=7c5f42c1:9b013ec0:b17b7337:33df22ca
ARRAY /dev/md/5 level=raid1 num-devices=2 UUID=4cbb3226:c5acf9e3:fb156e23:9aa56a48

使用配置文件啓動陣列時,mdadm會查詢配置文件中的設備和陣列內容,而後啓動運行全部能運行RAID陣列。若是指定陣列的設備名字,則只啓動對應的陣列。

[root@test ~]# mdadm -As
mdadm: /dev/md1 has been started with 3 drives.
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
 
md1 : active raid0 sdi1[0] sdk1[2] sdj1[1]
      7337664 blocks 32k chunks
 
unused devices: <none>
[root@test ~]# mdadm -S /dev/md0 /dev/md1
mdadm: stopped /dev/md0
mdadm: stopped /dev/md1
[root@test ~]# mdadm -As /dev/md0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
 
unused devices: <none>

注意:
這個配置文件不是隨着陣列信息隨時變化的,而是能夠手動修改的。因此根據配置文件組裝未必百分百成功,由於以前可能陣列被手動修改過,因此建議在每一次改變陣列信息後,最好同步一下當前的陣列信息到配置文件中。

[root@test ~]# mdadm -Ds > /etc/mdadm.conf

管理陣列

mdadm能夠在Manage模式下,對運行中的陣列進行添加及刪除磁盤。經常使用於標識failed磁盤,增長spare(熱備)磁盤,以及從陣列中移走已經失效的磁盤等等。 使用--fail(或者其縮寫-f)指定磁盤損壞。

[root@test ~]# mdadm /dev/md0 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0

當磁盤已經損壞時,使用--remove(或者其縮寫-f)參數將這個磁盤從磁盤陣列中移走;但若是設備還正在被陣列使用(即不處於失效狀態),則不能從陣列中移走。

[root@test ~]# mdadm /dev/md0 --remove /dev/sdb
mdadm: hot removed /dev/sdb
[root@test ~]# mdadm /dev/md0 --remove /dev/sde
mdadm: hot remove failed for /dev/sde: Device or resource busy

若是陣列帶有spare磁盤,那麼自動將損壞磁盤上的數據重構到新的spare磁盤上

[root@test ~]# mdadm -f /dev/md0 /dev/sdb ; cat /proc/mdstat
mdadm: set /dev/sdb faulty in /dev/md0
Personalities : [raid0] [raid10]
md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2]
      3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU]
      [=======>........]  recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec
 
unused devices: <none>

還可使用--add(或者其縮寫-a)參數增長磁盤:

[root@test ~]# mdadm /dev/md0 --add /dev/sdh
mdadm: added /dev/sdh

擴展陣列

若是在建立陣列時不想使用整個塊設備,能夠指定用於建立RAID陣列每一個塊設備使用的設備大小。

[root@test ~]# mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --size=102400

而後在陣列須要擴展大小時,使用模式--grow(或者其縮寫-G)以及--size參數(或者其縮寫-z)再加上合適的大小數值就能分別擴展陣列所使用每一個塊設備的大小。

[root@test ~]# mdadm -Q /dev/md0
/dev/md0: 500.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. 
[root@test ~]# mdadm --grow /dev/md0 --size=204800
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
      [============>......]  resync = 69.6% (144188/204800) finish=0.0min speed=10447K/sec
 
unused devices: <none>
[root@test ~]# mdadm -Q /dev/md0
/dev/md0: 1000.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail.

若是上面是文件系統,在設備大小擴展後,文件系統也要同時擴展。

mdadm還提供增長或減小陣列中設備個數的功能(reshape),使用模式—grow--raid-disks(或者其縮寫-n)參數再加上合適的設備個數。擴展後陣列中原來的熱備盤變爲活躍磁盤,因此陣列的設備個數增長,陣列的大小也相應增長。

[root@test ~]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 22:16:19 1999
     Raid Level : raid5
     Array Size : 1024000 (1000.17 MiB 1048.58 MB)
  Used Dev Size : 204800 (200.03 MiB 209.72 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
 
    Update Time : Sun Aug 22 22:23:46 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
 
         Layout : left-symmetric
     Chunk Size : 64K
 
           UUID : 53e6395c:1af16258:087cb2a0:b66b087f
         Events : 0.12
 
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
 
       6       8      112        -      spare   /dev/sdh
[root@test ~]# ./mdadm --grow /dev/md0 --raid-disks=7
mdadm: Need to backup 1920K of critical section..
mdadm: ... critical section passed.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks super 0.91 level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU]
      [===>.............]  reshape = 19.4% (40256/204800) finish=0.7min speed=3659K/sec
 
unused devices: <none>

監控陣列

mdadm還能夠對RAID陣列進行監控,監控程序定時查詢指定的事件是否發生,而後根據配置來妥善處理。例如當陣列中的磁盤設備出現問題的時候,能夠發送郵件給管理員;或者當磁盤出現問題的時候由回調程序來進行自動的磁盤替換,全部監控事件均可以記錄到系統日誌中。目前mdadm支持的事件有:

  • RebuildStarted
  • RebuildNN(NN is 20, 40, 60, or 80)
  • RebuildFinished
  • Fail
  • FailSpare
  • SpareActive
  • NewArray
  • DegradedArray
  • MoveSpare
  • SparesMissing
  • TestMessage

若是配置每300mdadm監控進程查詢MD設備一次,當陣列出現錯誤,會發送郵件給指定的用戶,執行事件處理的程序而且記錄上報的事件到系統的日誌文件。使用--daemonise參數(或者其縮寫-f)使程序持續在後臺運行。若是要發送郵件須要sendmail程序運行,當郵件地址被配置爲外網地址應先測試是否能發送出去。

[root@test ~]# mdadm --monitor --mail=root@localhost --program=/root/md.sh --syslog --delay=300 /dev/md0 --daemonise

查看系統日誌信息,能夠看到哪一個陣列或者陣列中的哪一個設備發生過的哪些事件。

[root@test ~]# mdadm -f /dev/md0 /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@test ~]# tail –f /var/log/messages
Aug 22 22:04:12 fc5 mdadm: RebuildStarted event detected on md device /dev/md0
Aug 22 22:04:12 fc5 kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
Aug 22 22:04:12 fc5 kernel: md: using 128k window, over a total of 1048512 blocks.
Aug 22 22:04:14 fc5 mdadm: Fail event detected on md device /dev/md0, component device /dev/sdb
Aug 22 22:04:14 fc5 mdadm: Rebuild80 event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: RebuildFinished event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: SpareActive event detected on md device /dev/md0, component device /dev/sdh
Aug 22 22:04:16 fc5 kernel: md: md0: recovery done.

回調程序從mdadm程序接受兩個或者三個參數:事件名字,監控陣列的名字和特殊事件可能使用到的底層塊設備名字。上面的事件返回的信息以下:

Eventname: RebuildStarted  Device: /dev/md0  next:
Eventname: Fail  Device: /dev/md0  next: /dev/sdb
Eventname: Rebuild80  Device: /dev/md0  next:
Eventname: RebuildFinished  Device: /dev/md0  next:
Eventname:SpareActive  Device: /dev/md0  next: /dev/sdh

總結

本文講述了RAID的特色和優點,而後引入硬RAID和軟RAID,並分析這二者的優劣勢;最後着重對軟RAID的建立,刪除,中止和擴展等操做進行了介紹和實踐。

Refer

  1. RAID 有哪幾種?有什麼區別?
  2. RAID 技術詳解
  3. 磁盤陣列(RAID)的原理與搭建
  4. Linux 中軟件 RAID 的使用
  5. RAID 及 mdadm 命令
  6. RAID 方案總結
  7. 軟件磁盤陣列(Software RAID)介紹
  8. 軟 RAID 和硬 RAID 各有什麼優劣?
  9. 硬RAID、軟RAID的區別詳解
  10. 三種 Linux RAID 簡要說明
  11. XenServer 6.2 with Software RAID
  12. How to fix linux mdadm inactive array
  13. 針對mdadm的RAID1失效測試
  14. mdadm wiki
相關文章
相關標籤/搜索