dm-raid

裝置對映器 RAID (dm-raid) 目標提供了從 DM 到 MD 的橋樑。它允許使用裝置對映器介面訪問 MD RAID 驅動程式。

對映表介面

目標名為“raid”,它接受以下引數:

<raid_type> <#raid_params> <raid_params> \
  <#raid_devs> <metadata_dev0> <dev0> [.. <metadata_devN> <devN>]

<raid_型別>

raid0

RAID0 條帶化(無彈性)

raid1

RAID1 映象

raid4

RAID4,帶專用最後一個奇偶校驗盤

raid5_n

RAID5,帶專用最後一個奇偶校驗盤,支援接管,與 raid4 相同

  • 臨時佈局

raid5_la

RAID5 左不對稱

  • 旋轉奇偶校驗 0,資料連續

raid5_ra

RAID5 右不對稱

  • 旋轉奇偶校驗 N,資料連續

raid5_ls

RAID5 左對稱

  • 旋轉奇偶校驗 0,資料重新開始

raid5_rs

RAID5 右對稱

  • 旋轉奇偶校驗 N,資料重新開始

raid6_zr

RAID6 零重新開始

  • 旋轉奇偶校驗零(從左到右),資料重新開始

raid6_nr

RAID6 N 重新開始

  • 旋轉奇偶校驗 N(從右到左),資料重新開始

raid6_nc

RAID6 N 連續

  • 旋轉奇偶校驗 N(從右到左),資料連續

raid6_n_6

RAID6,帶專用奇偶校驗盤

  • 奇偶校驗和 Q-syndrome 在最後 2 個磁碟上;用於從/到 raid4/raid5_n 接管的佈局

raid6_la_6

與 “raid_la” 相同,外加專用最後一個 Q-syndrome 盤

  • 用於從 raid5_la 接管到/從 raid6 的佈局

raid6_ra_6

與 “raid5_ra” 相同,外加專用最後一個 Q-syndrome 盤

  • 用於從 raid5_ra 接管到/從 raid6 的佈局

raid6_ls_6

與 “raid5_ls” 相同,外加專用最後一個 Q-syndrome 盤

  • 用於從 raid5_ls 接管到/從 raid6 的佈局

raid6_rs_6

與 “raid5_rs” 相同,外加專用最後一個 Q-syndrome 盤

  • 用於從 raid5_rs 接管到/從 raid6 的佈局

raid10

各種受 RAID10 啟發的演算法,透過附加引數選擇(參見下面的 raid10_format 和 raid10_copies)

  • RAID10:條帶化映象(又名“映象上的條帶化”)

  • RAID1E:整合相鄰條帶映象

  • RAID1E:整合偏移條帶映象

  • 和其他類似的 RAID10 變體

參考:https://www.snia.org/sites/default/files/SNIA_DDF_Technical_Position_v2.0.pdf 第 4 章

<#raid_引數>: 後面跟著的引數數量。

<raid_引數> 包括:

強制引數
<塊大小>

以扇區為單位的塊大小。此引數通常稱為“條帶大小”。它是唯一一個強制引數,並且放在首位。

後面是可選引數(順序任意)
[同步|不同步]

強制或阻止 RAID 初始化。

[重建 <idx>]

重建驅動器號‘idx’(第一個驅動器為 0)。

[守護程序休眠 <毫秒>]

點陣圖守護程序清除位的執行間隔。更長的間隔意味著更少的點陣圖 I/O,但故障後重新同步可能需要更長時間。

[最小恢復速率 <KB/秒/盤>]

限制 RAID 初始化

[最大恢復速率 <KB/秒/盤>]

限制 RAID 初始化

[主要寫入 <idx>]

將驅動器索引‘idx’標記為主要寫入。

[最大預寫 <扇區>]

參見 ‘--write-behind=’ (man mdadm)

[條帶快取 <扇區>]

條帶快取大小(僅限 RAID 4/5/6)

[區域大小 <扇區>]

區域大小乘以區域數量就是陣列的邏輯大小。點陣圖記錄了每個區域的裝置同步狀態。

[raid10_副本 <# 副本>], [raid10_格式 <近|遠|偏移>]

這兩個選項用於更改 RAID10 配置的預設佈局。可以指定副本數量,但預設值為 2。副本的放置方式也有三種變體——預設是“近”。近距離副本是大多數人對映象的理解。如果這些選項未指定,或者給定‘raid10_copies 2’和/或‘raid10_format near’,則 2、3 和 4 個裝置的佈局如下:

2 個驅動器

3 個驅動器

4 個驅動器

A1 A1

A1 A1 A2

A1 A1 A2 A2

A2 A2

A2 A3 A3

A3 A3 A4 A4

A3 A3

A4 A4 A5

A5 A5 A6 A6

A4 A4

A5 A6 A6

A7 A7 A8 A8

2 裝置佈局相當於雙向 RAID1。4 裝置佈局是傳統 RAID10 的樣子。3 裝置佈局可以稱為“RAID1E - 整合相鄰條帶映象”。

如果是‘raid10_copies 2’和‘raid10_format far’,那麼 2、3 和 4 個裝置的佈局如下:

2 個驅動器

3 個驅動器

4 個驅動器

A1 A2

A1 A2 A3

A1 A2 A3 A4

A3 A4

A4 A5 A6

A5 A6 A7 A8

A5 A6

A7 A8 A9

A9 A10 A11 A12

A2 A1

A3 A1 A2

A2 A1 A4 A3

A4 A3

A6 A4 A5

A6 A5 A8 A7

A6 A5

A9 A7 A8

A10 A9 A12 A11

如果是‘raid10_copies 2’和‘raid10_format offset’,那麼 2、3 和 4 個裝置的佈局如下:

2 個驅動器

3 個驅動器

4 個驅動器

A1 A2

A1 A2 A3

A1 A2 A3 A4

A2 A1

A3 A1 A2

A2 A1 A4 A3

A3 A4

A4 A5 A6

A5 A6 A7 A8

A4 A3

A6 A4 A5

A6 A5 A8 A7

A5 A6

A7 A8 A9

A9 A10 A11 A12

A6 A5

A9 A7 A8

A10 A9 A12 A11

這裡我們看到與“RAID1E - 整合偏移條帶映象”非常相似的佈局。

[delta_磁碟 <N>]

delta_disks 選項值(-251 < N < +251)觸發裝置移除(負值)或裝置新增(正值),適用於支援重塑的 RAID 級別 4/5/6 和 10。RAID 級別 4/5/6 允許新增裝置(元資料和資料裝置元組),raid10_near 和 raid10_offset 只允許新增裝置。raid10_far 完全不支援任何重塑。必須保留最少數量的裝置以強制執行彈性,即 raid4/5 為 3 個裝置,raid6 為 4 個裝置。

[資料偏移 <扇區>]

此選項值定義了每個資料裝置中資料開始的偏移量。這用於提供異地重塑空間,以避免在更改條帶佈局時覆蓋資料,因此可以在任何時候發生中斷/崩潰而不會丟失資料。例如,在向前重塑期間向現有 RAID 集合新增裝置時,異地空間將分配在每個 RAID 裝置的開頭。支援此類裝置新增的核心 raid4/5/6/10 MD 個性化將從現有第一個條帶(那些具有較少條帶數的條帶)從 data_offset 開始讀取資料,以用較多的條帶數填充新條帶,計算冗餘塊(CRC/Q-syndrome),並將該新條帶寫入偏移量 0。所有 N-1 個其他新條帶也將應用相同的方法。這種異地方案也用於更改 RAID 型別(即分配演算法),例如從 raid5_ls 更改為 raid5_n。

[日誌裝置 <dev>]

此選項為 raid4/5/6 RAID 集合新增一個日誌裝置,並使用它來彌補因元件裝置非原子更新而導致的“寫入漏洞”,該漏洞可能在恢復期間導致資料丟失。日誌裝置以直寫方式使用,因此與非日誌的 raid4/5/6 集合相比,寫入會被限制。使用 raid4/5/6 日誌裝置無法進行接管/重塑;在請求這些操作之前必須將其取消配置。

[日誌模式 <模式>]

此選項將日誌化的 raid4/5/6 RAID 集合(參見上面的‘journal_dev <dev>’)的快取模式設定為‘直寫’或‘回寫’。如果選擇‘回寫’,日誌裝置必須具有彈性,並且本身不能出現‘寫入漏洞’問題(例如使用 raid1 或 raid10),以避免單點故障。

<#raid_裝置數量>: 組成陣列的裝置數量。

每個裝置由兩個條目組成。第一個是包含元資料的裝置(如果有);第二個是包含資料的裝置。目標版本 1.8.0 最多支援 64 個元資料/資料裝置條目。1.9.0 支援最多 253 個,這由所使用的 MD 核心執行時強制執行。

如果在建立時驅動器發生故障或缺失,可以在給定位置的元資料和資料驅動器都用‘-’表示。

示例表

# RAID4 - 4 data drives, 1 parity (no metadata devices)
# No metadata devices specified to hold superblock/bitmap info
# Chunk size of 1MiB
# (Lines separated for easy reading)

0 1960893648 raid \
        raid4 1 2048 \
        5 - 8:17 - 8:33 - 8:49 - 8:65 - 8:81

# RAID4 - 4 data drives, 1 parity (with metadata devices)
# Chunk size of 1MiB, force RAID initialization,
#       min recovery rate at 20 kiB/sec/disk

0 1960893648 raid \
        raid4 4 2048 sync min_recovery_rate 20 \
        5 8:17 8:18 8:33 8:34 8:49 8:50 8:65 8:66 8:81 8:82

狀態輸出

‘dmsetup table’顯示用於構建對映的表。可選引數始終按上面列出的順序列印,其中“sync”或“nosync”始終在其他引數之前輸出,無論最初載入表時使用的順序如何。可以重複的引數按值排序。

‘dmsetup status’提供有關陣列狀態和健康狀況的資訊。輸出如下(通常為單行,但在此處展開以清晰顯示)

1: <s> <l> raid \
2:      <raid_type> <#devices> <health_chars> \
3:      <sync_ratio> <sync_action> <mismatch_cnt>

第 1 行是裝置對映器生成的標準輸出。

第 2 行和第 3 行由 RAID 目標生成,最好透過示例解釋

0 1960893648 raid raid4 5 AAAAA 2/490221568 init 0

這裡我們可以看到 RAID 型別是 raid4,有 5 個裝置——所有裝置都處於“活動”狀態,並且陣列已完成 2/490221568 的初始恢復。以下是各個欄位的更完整描述:

<raid_型別>

與用於建立陣列的 <raid_型別> 相同。

<健康字元>

每個裝置一個字元,表示:

  • ‘A’ = 存活且同步

  • ‘a’ = 存活但未同步

  • ‘D’ = 死亡/失敗。

<同步比率>

表示陣列已完成由‘sync_action’描述的過程的比例。如果‘sync_action’是“check”或“repair”,則“resync”或“recover”過程可以被認為是完整的。

<同步動作>

以下可能狀態之一:

空閒
  • 未執行同步操作。

凍結
  • 當前操作已暫停。

重新同步
  • 陣列正在進行初始同步或在不乾淨關機後重新同步(可能借助點陣圖)。

恢復
  • 陣列中的裝置正在重建或替換。

檢查
  • 正在執行使用者發起的陣列完整檢查。所有塊都被讀取並檢查一致性。發現的差異數量記錄在 <不匹配計數> 中。此操作不會對陣列進行任何更改。

修復
  • 與“check”相同,但會糾正差異。

重塑
  • 陣列正在進行重塑。

<不匹配計數>

在 RAID1/10 映象副本之間發現的差異數量,或在 RAID4/5/6 中發現的錯誤奇偶校驗值。此值僅在對陣列執行“check”操作後才有效。健康的陣列的‘mismatch_cnt’為 0。

<資料偏移>

當前資料偏移量,指向 RAID 集合每個元件裝置上使用者資料開始的位置(參見相應的 RAID 引數以支援異地重塑)。

<日誌字元>

  • ‘A’ - 活動直寫式日誌裝置。

  • ‘a’ - 活動回寫式日誌裝置。

  • ‘D’ - 故障日誌裝置。

  • ‘-’ - 無日誌裝置。

訊息介面

dm-raid 目標將透過“訊息”介面接受某些操作。(有關訊息介面的更多資訊,請參閱‘man dmsetup’。)這些操作包括:

“空閒”

停止當前同步操作。

“凍結”

凍結當前同步操作。

“重新同步”

啟動/繼續重新同步。

“恢復”

啟動/繼續恢復過程。

“檢查”

啟動對陣列的檢查(即“擦洗”)。

“修復”

啟動陣列修復。

丟棄支援

硬體供應商對丟棄支援的實現各不相同。當一個塊被丟棄時,一些儲存裝置在讀取該塊時會返回零。這些裝置設定了‘discard_zeroes_data’屬性。其他裝置將返回隨機資料。令人困惑的是,一些宣傳‘discard_zeroes_data’的裝置在讀取丟棄的塊時並不能可靠地返回零!由於 RAID 4/5/6 使用多個裝置中的塊來計算奇偶校驗塊,並且(出於效能原因)依賴於‘discard_zeroes_data’的可靠性,因此裝置的一致性非常重要。塊可能會在 RAID 4/5/6 條帶的中間被丟棄,如果後續讀取結果不一致,奇偶校驗塊可能隨時被以不同方式計算;這使得奇偶校驗塊對於冗餘而言毫無用處。如果您打算在 RAID 4/5/6 中啟用丟棄,瞭解您的硬體如何處理丟棄非常重要。

鑑於儲存裝置在這方面的行為不可靠,即使報告了‘discard_zeroes_data’,預設情況下 RAID 4/5/6 的丟棄支援也是停用的——這以犧牲部分效能為代價確保了資料完整性。

正確支援‘discard_zeroes_data’的儲存裝置正越來越多地被核心列入白名單,因此可以信任。

對於受信任的裝置,可以設定以下 dm-raid 模組引數以安全地啟用 RAID 4/5/6 的丟棄支援:

‘devices_handle_discards_safely’

版本歷史

1.0.0  Initial version.  Support for RAID 4/5/6
1.1.0  Added support for RAID 1
1.2.0  Handle creation of arrays that contain failed devices.
1.3.0  Added support for RAID 10
1.3.1  Allow device replacement/rebuild for RAID 10
1.3.2  Fix/improve redundancy checking for RAID10
1.4.0  Non-functional change.  Removes arg from mapping function.
1.4.1  RAID10 fix redundancy validation checks (commit 55ebbb5).
1.4.2  Add RAID10 "far" and "offset" algorithm support.
1.5.0  Add message interface to allow manipulation of the sync_action.
       New status (STATUSTYPE_INFO) fields: sync_action and mismatch_cnt.
1.5.1  Add ability to restore transiently failed devices on resume.
1.5.2  'mismatch_cnt' is zero unless [last_]sync_action is "check".
1.6.0  Add discard support (and devices_handle_discard_safely module param).
1.7.0  Add support for MD RAID0 mappings.
1.8.0  Explicitly check for compatible flags in the superblock metadata
       and reject to start the raid set if any are set by a newer
       target version, thus avoiding data corruption on a raid set
       with a reshape in progress.
1.9.0  Add support for RAID level takeover/reshape/region size
       and set size reduction.
1.9.1  Fix activation of existing RAID 4/10 mapped devices
1.9.2  Don't emit '- -' on the status table line in case the constructor
       fails reading a superblock. Correctly emit 'maj:min1 maj:min2' and
       'D' on the status line.  If '- -' is passed into the constructor, emit
       '- -' on the table line and '-' as the status line health character.
1.10.0 Add support for raid4/5/6 journal device
1.10.1 Fix data corruption on reshape request
1.11.0 Fix table line argument order
       (wrong raid10_copies/raid10_format sequence)
1.11.1 Add raid4/5/6 journal write-back support via journal_mode option
1.12.1 Fix for MD deadlock between mddev_suspend() and md_write_start() available
1.13.0 Fix dev_health status at end of "recover" (was 'a', now 'A')
1.13.1 Fix deadlock caused by early md_stop_writes().  Also fix size an
       state races.
1.13.2 Fix raid redundancy validation and avoid keeping raid set frozen
1.14.0 Fix reshape race on small devices.  Fix stripe adding reshape
       deadlock/potential data corruption.  Update superblock when
       specific devices are requested via rebuild.  Fix RAID leg
       rebuild errors.
1.15.0 Fix size extensions not being synchronized in case of new MD bitmap
       pages allocated;  also fix those not occurring after previous reductions
1.15.1 Fix argument count and arguments for rebuild/write_mostly/journal_(dev|mode)
       on the status line.