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_type>

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 综合症在最后 2 个磁盘上;从/到 raid4/raid5_n 的接管布局

raid6_la_6

与 “raid_la” 相同,加上专用的最后一个 Q 综合症磁盘

  • 从 raid5_la 到/从 raid6 的接管布局

raid6_ra_6

与 “raid5_ra” 相同,专用的最后一个 Q 综合症磁盘

  • 从 raid5_ra 到/从 raid6 的接管布局

raid6_ls_6

与 “raid5_ls” 相同,专用的最后一个 Q 综合症磁盘

  • 从 raid5_ls 到/从 raid6 的接管布局

raid6_rs_6

与 “raid5_rs” 相同,专用的最后一个 Q 综合症磁盘

  • 从 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_params>:以下参数的数量。

<raid_params> 由以下组成

强制参数
<chunk_size>

扇区中的块大小。此参数通常称为“条带大小”。它是唯一强制的参数,并且放在第一位。

后跟可选参数(顺序不限)
[sync|nosync]

强制或阻止 RAID 初始化。

[rebuild <idx>]

重建驱动器编号 'idx'(第一个驱动器为 0)。

[daemon_sleep <ms>]

清除位的位图守护程序运行之间的间隔。较长的间隔意味着较少的位图 I/O,但故障后的重新同步可能需要更长的时间。

[min_recovery_rate <kB/sec/disk>]

限制 RAID 初始化

[max_recovery_rate <kB/sec/disk>]

限制 RAID 初始化

[write_mostly <idx>]

将驱动器索引 'idx' 标记为主要写入。

[max_write_behind <sectors>]

请参阅 “--write-behind=” (man mdadm)

[stripe_cache <sectors>]

条带缓存大小(仅限 RAID 4/5/6)

[region_size <sectors>]

region_size 乘以区域数量就是阵列的逻辑大小。位图记录每个区域的设备同步状态。

[raid10_copies <# copies>], [raid10_format <near|far|offset>]

这两个选项用于更改 RAID10 配置的默认布局。可以指定副本数,但默认值为 2。副本的放置方式也有三种变体 - 默认值为“near”。近副本是大多数人想到镜像时所想到的。如果这些选项未指定,或者给定了 “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 设备布局等效于 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_disks <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 个设备。

[data_offset <sectors>]

此选项值定义数据在每个数据设备中开始的偏移量。这用于提供异地重塑空间,以避免在更改条带布局时覆盖数据,因此可能随时发生中断/崩溃,而不会丢失数据的风险。例如,在正向重塑期间向现有 raid 集添加设备时,异地空间将分配在每个 raid 设备的开头。支持此类设备添加的内核 raid4/5/6/10 MD 个性将从 data_offset 开始读取现有第一个条带(那些条带数较小的条带)中的数据,以填充具有较大条带数的新条带,计算冗余块(CRC/Q 综合症)并将新条带写入偏移量 0。同样的操作将应用于所有其他 N-1 个新条带。此异地方案也用于更改 RAID 类型(即分配算法),例如,从 raid5_ls 更改为 raid5_n。

[journal_dev <dev>]

此选项将日志设备添加到 raid4/5/6 raid 集,并使用它来关闭由于对组件设备的非原子更新而导致的“写入漏洞”,这可能会在恢复期间导致数据丢失。日志设备用作直写,因此与非日志 raid4/5/6 集相比,会导致写入被限制。日志 raid4/5/6 设备无法进行接管/重塑;必须先取消配置才能请求这些操作。

[journal_mode <mode>]

此选项在日志 raid4/5/6 raid 集上设置缓存模式(请参阅上面的“journal_dev <dev>”),设置为“直写”或“回写”。如果选择了“回写”,则日志设备必须具有弹性,并且本身不能遭受“写入漏洞”问题(例如,使用 raid1 或 raid10)以避免单点故障。

<#raid_devs>:组成阵列的设备数量。

每个设备由两个条目组成。第一个条目是包含元数据的设备(如果有的话);第二个条目是包含数据的设备。目标版本 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 行是 device-mapper 生成的标准输出。

第 2 行和第 3 行由 raid 目标生成,最好用示例解释:

0 1960893648 raid raid4 5 AAAAA 2/490221568 init 0

在这里,我们可以看到 RAID 类型是 raid4,有 5 个设备 - 所有设备都处于 ‘A’(活动)状态,并且该阵列完成了 2/490221568 的初始恢复。以下是对各个字段的更完整描述:

<raid_type>

与用于创建阵列的 <raid_type> 相同。

<health_chars>

每个设备一个字符,表示:

  • ‘A’ = 活动且同步

  • ‘a’ = 活动但不同步

  • ‘D’ = 死亡/失败。

<sync_ratio>

指示阵列中已执行由 ‘sync_action’ 描述的过程的比例。如果 ‘sync_action’ 是 “check” 或 “repair”,则可以认为 “resync” 或 “recover” 的过程已完成。

<sync_action>

以下可能的 状态之一:

idle
  • 未执行同步操作。

frozen
  • 当前操作已停止。

resync
  • 阵列正在进行初始同步或在不干净的关机后重新同步(可能由位图辅助)。

recover
  • 正在重建或更换阵列中的设备。

check
  • 正在执行用户启动的阵列全面检查。将读取所有块并检查一致性。找到的差异数量记录在 <mismatch_cnt> 中。此操作不会对阵列进行任何更改。

repair
  • 与 “check” 相同,但会更正差异。

reshape
  • 阵列正在进行重塑。

<mismatch_cnt>

在 RAID1/10 中的镜像副本之间发现的差异数量,或在 RAID4/5/6 中发现的错误奇偶校验值。此值仅在对阵列执行 “check” 后有效。健康的阵列的 ‘mismatch_cnt’ 为 0。

<data_offset>

RAID 集的每个组件设备上用户数据起始位置的当前数据偏移量(请参阅相应的 raid 参数以支持异地重塑)。

<journal_char>

  • ‘A’ - 活动的写通式日志设备。

  • ‘a’ - 活动的写回式日志设备。

  • ‘D’ - 死亡的日志设备。

  • ‘-’ - 无日志设备。

消息接口

dm-raid 目标将通过 ‘message’ 接口接受某些操作。(有关消息接口的更多信息,请参见 ‘man dmsetup’。)这些操作包括:

“idle”

停止当前的同步操作。

“frozen”

冻结当前的同步操作。

“resync”

启动/继续重新同步。

“recover”

启动/继续恢复过程。

“check”

启动对阵列的检查(即 “scrub”)。

“repair”

启动阵列的修复。

丢弃支持

硬件供应商对丢弃支持的实现方式各不相同。当块被丢弃时,某些存储设备会在读取该块时返回零。这些设备设置 ‘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.