写点什么

mdraid、mdadm 与 Linux 软件 RAID 终极指南

作者:Sergey Platonov
  • 2025-07-28
    俄罗斯
  • 本文字数:6978 字

    阅读完需:约 23 分钟

什么是 mdraid?核心概念

mdraid(有时简称为 MD RAID 或 md)是 Linux 内核内置的软件 RAID 框架。它将多个块设备(硬盘、分区、loop 设备、NVMe 命名空间等)聚合为一个逻辑块设备(如 /dev/mdX),根据所选的 RAID 级别,可实现性能提升、冗余保护、容量聚合,或这些特性的组合。

从本质上讲,mdraid:

  • 主要存在于 Linux 内核中,作为 md(Multiple Device,多设备)驱动

  • 使用设备上的 superblock 元数据来描述阵列的成员关系与布局。

  • 将已组装的 RAID 阵列作为标准块设备暴露出来,可以进行分区、格式化、挂载 LVM、加密,或直接被应用使用。

换句话说:mdraid 是引擎,mdadm 是工具与控制面板。

mdraid 在 Linux 存储架构中的位置

简化的垂直存储架构栈如下(自下而上):

[物理 / 虚拟磁盘]  SATA / SAS / NVMe / iSCSI LUN / VMDK / 云块存储卷[mdraid 内核层]  ← 通过 mdadm 组建  RAID0 | RAID1 | RAID4/5/6 | RAID10 | RAID1E | 线性 | 多路径 | 等[可选层]  LUKS 加密(dm-crypt) | LVM(PV/VG/LV,包括 thin LVM) | 文件系统(ext4, XFS, btrfs, ZFS 等)[应用程序 / 容器 / 虚拟机]
复制代码

由于 md 设备表现为常规块设备,因此你可以构建丰富的存储堆栈:可以先加密再构建 RAID,或者先 RAID 后加密;可以叠加 LVM 来实现灵活的卷管理;也可以将 md 设备直接暴露给虚拟化平台使用。


mdadm 与 mdraid:术语解释


| 术语                  | 所在层级   | 功能说明                      | 常见位置                                   || ------------------- | ------ | -------------------------          | -------------------------------------- || md              | 内核驱动    | 实现软件 RAID 的核心逻辑。             | `/proc/mdstat`, `/sys/block/md*`, 内核日志 || mdraid          | 非正式名称   | 指 Linux 的 md 软件 RAID 子系统。     | 文档、文章中常见:“Linux mdraid”等               || mdadm           | 用户空间工具 | 创建、组建、扩展、监控、移除 RAID 阵列等。| 命令行:`mdadm --create /dev/md0 …`        || /etc/mdadm.conf | 配置文件    | 启动时用于自动组装阵列;定义 ARRAY 信息。 | 保证系统重启后阵列能够正确加载                        |
复制代码


支持的 RAID 级别与模式

mdraid 支持多种 RAID 模式(称为 "personalities")。具体支持情况可能会因内核版本略有不同,但以下为常见选项:

  • linear:将多个设备首尾拼接;无冗余。

  • RAID 0(条带化):提升性能与总容量;无冗余。

  • RAID 1(镜像):冗余保护,通过数据复制实现;支持并行读取。

  • RAID 4:使用专用奇偶校验磁盘;较少使用。

  • RAID 5:分布式奇偶校验;容忍单盘故障。

  • RAID 6:双重分布式奇偶校验;容忍两盘同时故障。

  • RAID 10:条带化镜像(mdraid 使用多镜像组合实现);在速度与冗余之间取得良好平衡。

  • RAID 1E / RAID 10 变种:适用于奇数个磁盘的非对称镜像-条带布局。

  • Multipath:较少使用,可提供多路径故障转移能力。

  • Faulty:用于测试的 RAID 类型,可注入故障行为以验证系统的容错能力。


关键架构组件

  • Superblock 元数据:存储在每个成员磁盘上的小型头信息,描述了阵列的 UUID、RAID 类型、布局方式、块大小(chunk size)、每个设备的角色与当前状态。

  • md 类型(RAID 实现):RAID 的具体实现方式,注册在 Linux 内核的 md 子系统中,例如 RAID0、RAID1、RAID5 等。

  • 位图(bitmap):可选功能。在磁盘上或内存中维护一个位图,用于标记哪些条带(stripe)处于“脏”状态,可显著缩短非正常关机后的重同步时间。

  • 重构引擎(reshape engine):支持在线更改阵列结构,例如增加或移除磁盘、在某些情况下更换 RAID 类型。执行期间性能可能受到较大影响,应规划维护时间。

  • mdmon(外部元数据监控器):用于支持某些外部元数据格式(如 Intel 的 IMSM/Matrix RAID),确保阵列元数据一致性。

  • Sysfs 控制项:位于 /sys/block/mdX/md/ 路径下,包含大量可调参数,如条带缓存大小、同步速度限制、只写设备标志等,可用于运行时优化。

常见使用场景

  • 使用普通磁盘构建的家用 NAS 或 DIY 存储服务器。

  • 用于根文件系统弹性的可引导镜像(RAID1)。

  • 用于需要强随机 I/O 和冗余的数据库或虚拟化工作负载的 RAID10。

  • RAID5/6 提供带有奇偶校验保护的大容量存储(用于备份目标、媒体库 —— 不过请参见下文关于重建窗口和不可恢复错误率的风险讨论)。

  • 当不希望或无法使用硬件 RAID 时,聚合多个 NVMe 驱动器。

  • 在云端或虚拟化环境中,虚拟磁盘需要跨故障域的软件定义冗余。

规划 mdraid 部署

在输入 mdadm --create 之前,请先回答以下问题:

  1. 工作负载类型是随机 I/O 还是顺序 I/O?是读多写少还是写多读少?是混合的数据库 + 虚拟机还是冷归档?

  2. 冗余 vs 容量你需要容忍多少个故障?RAID1/10 与 RAID5/6 的权衡关系。

  3. 介质类型 HDD、SSD、NVMe,还是混合?在 SSD 上使用奇偶校验 RAID 行为不同(写放大、TRIM 行为、队列深度扩展等)。

  4. 增长预期你是否计划未来增加磁盘?可以考虑使用 RAID10,或从更大磁盘数量的 RAID6 起步;了解 reshape 的影响。

  5. 启动要求如果需要从 md 启动,请选择合适的元数据格式(0.90 或 1.0),以便 superblock 放置在固件或引导加载器所期望的位置。

  6. 监控与告警计划邮件告警、systemd 定时器、mdadm --monitor、与 Prometheus/node_exporter 的集成等。

  7. 备份策略 RAID ≠ 备份。始终维护关键数据的阵列外副本


逐步指南:使用 mdadm 创建和管理阵列

以下是高价值、可直接复制使用的示例。请根据你的实际环境调整设备名称和容量。

安装 mdadm

Debian/Ubuntu:

sudo apt update && sudo apt install -y mdadm
复制代码

RHEL/CentOS/Rocky/Alma

sudo dnf install -y mdadm   # 或在旧版本中使用 yum
复制代码

创建一个 RAID1 镜像阵列(适合启动使用的元数据格式)

sudo mdadm --create /dev/md0 \  --level=1 \  --raid-devices=2 \  --metadata=1.0 \  /dev/sda1 /dev/sdb1
复制代码

--metadata=1.0 将 superblock 存储在设备末尾,保留前部扇区供引导加载器使用。


创建一个 RAID5 阵列

sudo mdadm --create /dev/md/data \  --level=5 \  --raid-devices=4 \  --chunk=256K \  /dev/sd[b-e]
复制代码


组装已有阵列(例如重启后)

sudo mdadm --assemble --scan
复制代码

查看状态

cat /proc/mdstatsudo mdadm --detail /dev/md0
复制代码

将设备标记为故障并移除

sudo mdadm /dev/md0 --fail /dev/sdb1sudo mdadm /dev/md0 --remove /dev/sdb1
复制代码

添加替换磁盘

sudo mdadm /dev/md0 --add /dev/sdb1
复制代码


生成 /etc/mdadm.conf

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
复制代码

最佳实践: 如果系统是从 md 设备启动的,在创建或修改阵列后请重新生成 initramfs,以便引导阶段能正确组装阵列

块大小、条带几何与对齐

  • Chunk(有时称为“条带单元”):写入每个成员设备的一段连续数据量,然后再写入下一个成员。

  • Stripe(条带):在阵列中所有数据磁盘上的一次完整写入周期(数学描述中不包括奇偶盘,但物理布局中包含)。

为什么重要:

  • Chunk 太小 → 需要频繁计算奇偶校验,在大规模顺序写入中造成较高 IOPS 开销。

  • Chunk 太大 → 小的随机写入会浪费带宽;引发读‑改‑写惩罚。

  • 将 chunk 大小对齐到文件系统的块大小和工作负载的 I/O 大小,以减少部分条带写入。

经验法则

  • 在 HDD 上的奇偶 RAID 中,常用 chunk 为 64K–256K

  • 对于大规模顺序写入工作流(备份、媒体、虚拟机镜像)或在快速 SSD/NVMe 上,较大的 chunk(256K–1M+)通常更有优势。

  • 对你的工作负载进行基准测试:使用 fio 工具配合真实的 I/O 深度和模式,往往比经验法则更有效。

对齐检查清单

  1. 尽可能使用整块磁盘作为成员(避免旧式分区偏移问题)。

  2. 如果必须分区,确保起始位置为 1MiB 边界partedgdisk 默认支持)。

  3. 文件系统的 mkfs 工具通常提供 -E stride=stripe_unit-d su= 选项 —— 请设置它们!


性能调优技巧

性能受工作负载、存储介质、CPU 和内核版本影响。应先进行测量,再进行调优。

  1. 在创建时设置合适的 Chunk 大小后期更改通常意味着需要重建。应根据工作负载的 I/O 大小组合进行匹配。

  2. 增加条带缓存(适用于 RAID5/6)stripe_cache_size 是 sysfs 可调参数,通过缓存部分条带,可显著提升奇偶 RAID 的写入吞吐量。

echo 4096 | sudo tee /sys/block/md0/md/stripe_cache_size
复制代码

数值单位为页(每页 4K)。值越大占用 RAM 越多;注意内存压力。

  1. 调整同步 / 重同步 / 重构速度用于限制或加速后台操作:

echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_min  # KB/secho 500000 | sudo tee /proc/sys/dev/raid/speed_limit_max # KB/s
复制代码

维护时段内可提高,生产高峰期建议降低。

  1. 启用或指定写多设备(write-mostly)

可将较慢或远程成员标记为 write-mostly,尽量避免读取操作:

sudo mdadm --write-mostly /dev/md0 /dev/sdd
复制代码
  1. 使用位图缩短重同步窗口使用 --bitmap=internal(或 --bitmap=external 指定外部设备)创建。断电后可更快恢复。

  2. SSD 阵列上的 TRIM / Discard 操作确保文件系统支持 discard;建议使用周期性 fstrim 而非持续 discard,以保持性能稳定。

  3. NUMA 与 IRQ 亲和性(Affinity)高吞吐量的 NVMe + mdraid 配置可通过调整 CPU 亲和性获得性能提升——固定中断 IRQ,平衡队列负载。

定期进行基准测试使用 fiodd(用于大致顺序性能)、iostatperf,以及应用层指标(如数据库 TPS、虚拟机启动时间)进行验证。


监控、告警与维护

关键健康指标:降级阵列、故障磁盘、不匹配事件、位图重同步进行中、检查运行后出现高不匹配计数。

启用 mdadm 监控服务

可以创建一个简单的 systemd 单元,或使用发行版提供的相关软件包:

sudo mdadm --monitor --daemonise --scan --syslog --program=/usr/sbin/mdadm-email.sh
复制代码

你的脚本可用于发送邮件、Slack、PagerDuty 等告警。

定期检查 /proc/mdstat

自动化示例:

watch -n 2 cat /proc/mdstat
复制代码

定期一致性检查

许多发行版会每月执行一次:

echo check > /sys/block/mdX/md/sync_action
复制代码


用于扫描条带是否存在不匹配。如果发现不匹配,可接着执行:

/sys/block/mdX/md/sync_action
复制代码

智能+ 预测性故障检测

RAID 会隐藏但不会阻止介质故障。请使用 smartctlnvme-cli 和厂商工具。将 智能 告警集成到 md 状态监控中。


恢复、重建与重构操作

当某个成员设备发生故障时:

  1. 识别问题:使用 mdadm --detail 和系统日志查看状态。

  2. 标记为故障设备

mdadm /dev/mdX --fail /dev/sdY
复制代码

(如果系统未自动标记为故障)

  1. 移除设备

mdadm /dev/mdX --remove /dev/sdY
复制代码
  1. 更换硬件 / 对替代磁盘重新分区

  2. 添加新设备

mdadm /dev/mdX --add /dev/sdZ
复制代码
  1. 监控重建进度

watch /proc/mdstat
复制代码

重建性能注意事项

  • 大容量现代磁盘 = 重建窗口长 → 第二块磁盘故障的风险增加

  • 使用位图可以在非正常关机后减少重同步范围

  • 在维护时段提高 speed_limit_min,以缩短暴露时间

  • 在 SSD/NVMe 奇偶 RAID 中,控制器队列和 CPU 成为关键瓶颈

重构(例如 RAID5 → RAID6,或添加磁盘)

重构过程 I/O 密集且耗时。务必先备份。重构期间性能会下降,应安排在非高峰时段执行。

安全性考量

  • 加密:可在 mdraid 之上使用 LUKS/dm-crypt(常见方式),或在每个成员设备下方加密,具体取决于威胁模型。上层加密更简单;下层加密便于保留每块磁盘的独立保密性。

  • 重用前安全擦除:superblock 会保留;在重新分配磁盘前使用以下命令清除旧元数据:

mdadm --zero-superblock /dev/sdX
复制代码

访问控制:md 设备是块设备,应通过适当的权限和审计日志进行保护。

固件信任:当使用来自不同厂商的磁盘时,需确保无恶意固件篡改;在敏感环境中,供应链安全至关重要。


mdraid 的替代方案

Linux 管理员有多种选择。以下是 mdraid 与一些主流替代方案的对比。

xiRAID:高性能软件 RAID

xiRAID(由 Xinnor 提供)是一款为当今多核 CPU 和高速 SSD/NVMe 存储设计的现代高性能软件 RAID 引擎。在多个公开基准测试和合作伙伴评估中,xiRAID 一贯表现出比传统 mdraid 更高的性能 —— 尤其是在大量写入、混合数据库、虚拟化或降级/重建状态下,优势尤为明显。

报告中的优势(具体取决于版本、平台和工作负载):

  • 在 NVMe 和 SSD 阵列中相比 mdraid 拥有更高的 IOPS 和吞吐量。

  • 降级模式下性能大幅提升(mdraid 的常见弱项)。

  • 重建速度更快,缩短风险窗口。

  • 在某些配置下 CPU 开销更低;多核扩展性更好。

  • 针对大容量 SSD/QLC 媒体的优化,减少写放大现象。

考虑使用 xiRAID 的场景:

  • 在密集型 flash/NVMe 上运行数据库、虚拟化、分析或 AI 工作负载。

  • 重建速度和故障期间性能下降最小对业务至关重要。

  • 需要在不依赖硬件 RAID 控制器的情况下,发挥软件 RAID 的最大性能。

运维说明:

  • 商业授权(免费版本通常有限制磁盘数量 —— 请查阅当前政策)。

  • 内核模块 / 驱动栈与 mdraid 分离;需评估与你的发行版兼容性。

  • 从 mdraid 迁移通常需要清空数据后重建。


硬件 RAID 控制器

优点:电池备份缓存(BBU)加速写入;控制器承担奇偶校验计算;集成管理;厂商支持。

缺点:专有元数据;控制器厂商绑定;重建过程依赖控制卡健康状态;相较于 mdadm 透明性较低;如果没有相同型号的备用控制器,可能成为单点故障。

适用场景:传统数据中心、需要操作系统无关启动的环境,或已有运维工具链依赖于厂商 RAID 控制卡。

LVM RAID(基于 device-mapper 的 RAID)

LVM2(逻辑卷管理器)可使用 device-mapper-raid 目标创建 RAID 卷。其底层逻辑与 md 类似,但与 LVM 卷组紧密集成。

使用场景:你希望在一个堆栈层中同时拥有 LVM 的灵活性(快照、精简配置)和 RAID 保护。现代发行版对此支持日益完善。

注意事项:其工具链与恢复流程不同于纯粹的 mdadm;两者混用可能令初学者感到困惑。

Btrfs 原生 RAID 模式

Btrfs 支持数据和元数据的复制(RAID1/10)与奇偶校验(RAID5/6 —— 仍被标注为具有历史稳定性问题,请查阅当前内核状态)。支持端到端校验、透明压缩、快照、发送/接收功能。

适用场景:需要自愈能力的复制存储,对校验和完整性比纯粹的奇偶校验写入速度更看重。

注意事项:RAID5/6 曾有历史性不稳定问题;生产环境部署前请始终确认当前内核支持状态。

ZFS RAID‑Z 与镜像

ZFS 提供集成的 RAID 支持(镜像、RAID‑Z1/2/3)、校验和、压缩、快照、发送/接收复制机制和强大的数据清理功能(scrubbing)。数据完整性表现优异。

优势:位腐检测、自我修复、可扩展存储池、高级缓存机制(ARC/L2ARC、ZIL/SLOG)。

权衡点:内存消耗大;ZFS 采用与 Linux 内核不兼容的 CDDL 许可证,因此以模块形式存在于内核之外;在内存较小的系统中需要额外


常见问题:mdraid、mdadm 与 Linux RAID 故障排查

问:mdraid 在生产环境中稳定吗?是的 —— mdraid 已为 Linux 服务器提供服务数十年,广泛用于企业、托管服务和云镜像中。其稳定性更多取决于硬件质量、监控措施与管理员操作规范,而非 md 层本身。

问:我可以通过添加磁盘来扩展 RAID5 阵列吗?可以,mdadm 支持扩展 RAID5/6 阵列。但重构过程耗时且 I/O 密集;务必提前做好备份。

问:使用超过 14TB 的大容量磁盘时,是否还应该使用 RAID5?建议使用 RAID6 或 RAID10。重建时间长和 URE(不可恢复错误)风险,使得单奇偶校验阵列在大规模场景下存在较高风险。

问:用于启动的阵列应该使用哪个元数据版本?推荐使用 1.0(或在非常老的系统上使用 0.90),以确保启动加载器能够识别空白起始扇区。

问:如何判断我的阵列是否健康?检查 /proc/mdstat,使用 mdadm --detail,并配置 mdadm --monitor 邮件告警。同时监控 SMART 状态。

问:可以将 SSD 和 HDD 混合使用在同一个 md 阵列中吗?技术上可以,但性能会下降至最慢设备的水平。更好的做法是分层部署,或将较慢的磁盘标记为 write-mostly。

问:如何安全地从旧磁盘中移除 RAID 元数据?在重新分区前执行以下命令:

mdadm --zero-superblock /dev/sdX
复制代码

问:哪个更快:mdraid 还是 xiRAID?在多个公开的 flash/NVMe 负载基准测试中,xiRAID 的性能优于 mdraid —— 尤其是在降级或重建条件下表现尤为明显。请始终结合自身硬件与工作负载进行基准测试。


术语表

  • Array(阵列):多个磁盘的逻辑组合,作为一个块设备呈现。

  • Bitmap(位图):标记脏条带的映射表,能加速非正常关机后的重同步。

  • Chunk(条带单元):在条带中写入一个磁盘的数据段,然后移动到下一个磁盘。

  • Degraded(降级):某些成员故障/缺失的阵列,但仍能提供 I/O 服务。

  • Hot Spare(热备盘):空闲设备,在故障发生时可自动接替重建阵列。

  • mdadm:用于管理 mdraid 阵列的用户空间工具。

  • Metadata / Superblock(元数据 / 超块):磁盘上记录阵列身份与布局的结构。

  • Parity(奇偶校验):通过计算冗余数据用于恢复丢失块。

  • Resync / Rebuild(重同步 / 重建):在发生故障后恢复冗余数据的过程。

  • Reshape(重构):在线更改阵列结构(大小、级别、布局)。

总结

mdraid 依然是 Linux 存储领域的基础技术:强大、灵活、久经考验,且完全免费。对于许多工作负载 —— 特别是基于 HDD 的容量池 —— 它是首选方案。

但存储格局已经发生变化:NVMe 的密度、Flash 的写损耗、重建窗口的极限,以及对性能一致性和重建可靠性的更高要求,使得专用 RAID 引擎能在吞吐量、延迟、降级模式弹性和重建速度方面带来显著优势。

明智的策略是:在合适场景下使用 mdraid,在性能敏感场合评估 xiRAID(或其他替代方案),始终围绕数据保护、可观测性和可恢复性进行系统设计

用户头像

还未添加个人签名 2025-03-18 加入

还未添加个人简介

评论

发布
暂无评论
mdraid、mdadm 与 Linux 软件 RAID 终极指南_raid_Sergey Platonov_InfoQ写作社区