5.4 RAID 技术与存储方案

预计阅读时间:15 分钟

📖 目录

学习目标

  • 理解 RAID 0/1/5/6/10 各等级的原理、容量公式与容错能力
  • 掌握 mdadm 创建、管理、监控软 RAID 的核心命令
  • 区分软件 RAID 与硬件 RAID 的适用场景
  • 了解 ZFS / Btrfs 在数据完整性校验方面的独特优势
  • 明确 RAID ≠ 备份,合理设计存储方案

核心知识

RAID 级别速览

级别最少磁盘可用容量容错读性能写性能
RAID 02100%高(并行)高(并行)
RAID 1250%1 块中(可并行读)中(双写)
RAID 53(N-1)/N1 块中(奇偶校验开销)
RAID 64(N-2)/N2 块低(双奇偶校验)
RAID 10450%每组 1 块

知识关联

  • 前置知识:rhcsa01 磁盘分区与 LVM(LVM、分区、文件系统基础),3.13:备份策略与恢复 备份策略与恢复
  • 后续影响6.15:HA 集群 HA 集群(DRBD 数据同步依赖底层块设备),6.18:内核管理 内核管理(udev 规则管理磁盘设备)
  • 配套技术:LVM 提供灵活卷管理(动态调整大小),RAID 提供冗余;实践中常组合使用。ZFS/Btrfs 通过校验和检测静默数据损坏。RAID ≠ 备份。

原理讲解

RAID 0 — 条带化

数据按条带(stripe)均匀分布到所有磁盘。任意一块故障即丢失全部数据。适合存放可重建的临时数据或缓存。

RAID 1 — 镜像

数据完整写入每块磁盘。读取时可从任意磁盘并行读取以提升性能。写入需等待所有磁盘完成,略有开销。适合系统盘、数据库日志等。

RAID 5 — 单奇偶校验

数据和奇偶校验信息交错分布在各盘。一块盘故障时,剩余盘通过奇偶校验在线重建。重建期间若再坏一块则全损。大容量硬盘的重建时间很长,期间风险高。

RAID 6 — 双奇偶校验

两个独立的奇偶校验块分布在盘阵中,最多容忍两块盘同时故障。适合大容量存储且对可靠性要求高的场景。

RAID 10 — 镜像 + 条带

先镜像(RAID 1)再条带(RAID 0)。兼具 RAID 1 的快速恢复和 RAID 0 的高吞吐。每对镜像中坏一块不影响整体。对写性能要求高的数据库首选。

RAID 级别参数详解

选型前先看一张更细的对比表,重点注意重建代价随机写性能——这两项直接决定生产数据库与冷存储的不同选择:

级别磁盘数容量容错随机读随机写重建
RAID 02+N×盘容量0不可重建
RAID 1250%1中(双盘镜像读)中(双写)秒级(整盘拷贝)
RAID 53+(N-1)/N1低(读改写放大)慢(全盘校验重建)
RAID 64+(N-2)/N2更低(双奇偶校验)很慢
RAID 104+(偶数)50%每镜像对 1快(仅重建镜像对)

两条实用结论:随机写性能 RAID 10 优于 RAID 5——RAID 5 每次小块写入都要先读旧数据再重算奇偶校验,产生"读-改-写"放大,OLTP 负载下差距可达 30%-50%;大盘(8TB+)慎用 RAID 5,全盘重建往往要一两天,重建窗口内第二次故障概率随容量上升,RAID 6 才是大容量存储的底线。

软件 RAID vs 硬件 RAID

维度软件 RAID(mdadm)硬件 RAID(HBA/RAID 卡)
成本免费,使用 CPU 资源需专用硬件,带缓存/电池
性能依赖 CPU,现代多核影响小卸载计算,适合高 IO 场景
灵活性可任意组合不同品牌/大小的盘通常要求同型号同容量
恢复可插到另一台 Linux 直接识别依赖同型号 RAID 卡

存储介质选型:SSD / HDD / NVMe

维度NVMe SSDSATA/SAS SSD企业级 HDD
顺序读写6-7 GB/s约 500 MB/s约 250 MB/s
随机 IOPS> 500K约 100K约 200
每 GB 成本低(约为 SSD 的 1/5)
典型用途数据库热数据、缓存层系统盘、虚拟机存储冷存储、备份、归档
故障模式磨损耗尽(难以预测)磨损耗尽坏道、电机故障(SMART 可预测)
功耗/噪音高(7.2K 转盘常开 8-15W)

混合分层是主流方案:NVMe 组 RAID 1 放数据库热数据,SATA SSD 组 RAID 10 放温数据,HDD 组 RAID 6 放冷数据,再通过 LVM 或文件系统层的迁移机制按访问热度分层。先想清楚"这份数据 7 天后还会不会被频繁读",再决定它落在哪一层。

文件系统级存储:ZFS 与 Btrfs

传统 RAID 只能防磁盘故障,防不了静默数据损坏(位翻转、坏道上的"假成功"写入)。ZFS 与 Btrfs 给每个数据块加校验和,读取时验证,一旦发现损坏立即报错,并可从冗余副本自动修复:

特性ZFSBtrfs
校验和 + 自愈
RAID 级raidz1/2/3 + 镜像raid1/raid10/raid5/raid6
快照/克隆✓(瞬时,可增量发送备份流)✓(subvolume 快照)
压缩/去重✓(lz4/zstd)✓(压缩)
Linux 支持需 DKMS 模块(Ubuntu 默认集成)内核原生
在线扩容zpool add 新 vdev(非等量)btrfs device add 后 balance
# ZFS 快速体验(Ubuntu:sudo apt install zfsutils-linux)
sudo zpool create data /dev/sdb /dev/sdc /dev/sdd /dev/sde   # 默认 raidz1(4 盘 RAID 5 等价)
sudo zpool create mirror0 /dev/sdf /dev/sdg                  # 镜像池
sudo zfs set compression=lz4 data                            # 开启压缩
sudo zfs snapshot data@before_upgrade                        # 升级前打快照
sudo zpool scrub data                                        # 全量校验和巡检
sudo zpool status                                            # 输出: scan: scrub repaired 0B in 0 days 00:00:00

选型判断:已有 XFS/ext4 全家桶且不想引入新概念 → 继续 mdadm + LVM;追求数据完整性 + 快照恢复能力 → ZFS(尤其存虚拟机和容器镜像);Btrfs 适合单机文件服务器,其 RAID 5/6 早期版本存在校验洞(write hole)问题,生产慎用。

示例代码

安装 mdadm

sudo apt install mdadm   # Debian/Ubuntu
sudo yum install mdadm   # RHEL/CentOS

创建 RAID 0

sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc  # 输出: mdadm: array /dev/md0 started.
sudo mkfs.ext4 /dev/md0  # 输出: Creating filesystem with 5232640 4k blocks...
sudo mount /dev/md0 /mnt/raid0

创建 RAID 1

sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde  # 输出: mdadm: array /dev/md1 started.
sudo mkfs.xfs /dev/md1  # 输出: meta-data=/dev/md1 isize=512...
sudo mount /dev/md1 /mnt/raid1

创建 RAID 5(4 块盘)

sudo mdadm --create /dev/md5 --level=5 --raid-devices=4 /dev/sd[b-e]  # 输出: mdadm: array /dev/md5 started.
sudo mdadm --detail /dev/md5  # 输出: (显示 Raid Level, Array Size, Devices 等详情)
cat /proc/mdstat  # 输出: Personalities : [raid6] [raid5] [raid4]

创建 RAID 10(4 块盘)

sudo mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sd[f-i]  # 输出: mdadm: array /dev/md10 started.
sudo mkfs.ext4 /dev/md10  # 输出: Creating filesystem with ...

软 RAID 生产落地全流程(RAID 5 为例)

创建命令只是第一步,生产环境还需要:确认裸盘 → 写 mdadm.conf → 写 fstab → 验证重启后自动组装。以 3 块新盘 /dev/sdb、/dev/sdc、/dev/sdd 为例:

# 1. 确认盘是裸盘(无 FSTYPE 列,注意别把系统盘卷进去)
lsblk -f /dev/sdb /dev/sdc /dev/sdd    # 输出: NAME FSTYPE LABEL UUID(无 FSTYPE 即裸盘)
sudo smartctl -a /dev/sdb | grep -E "Serial|Reallocated"   # 输出: Serial Number: XYZ Reallocated_Sector_Ct: 0

# 2. 创建 RAID 5
sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
# 输出: mdadm: array /dev/md5 started.
# 首次创建会全量同步,观察进度(新阵列首次同步约需数小时)
cat /proc/mdstat   # 输出: [==>.................]  resync = 12.4% (390627/3128768) finish=42.3min speed=1234K/sec

# 3. 固化阵列配置:/etc/mdadm/mdadm.conf
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
# 输出: ARRAY /dev/md5 metadata=1.2 name=host:5 UUID=9f4a:xxxx:xxxx:xxxx
sudo update-initramfs -u   # Debian/Ubuntu 把 mdadm 模块打进 initramfs,否则开机无法识别

# 4. 格式化并写入 fstab(nofail + device-timeout 防止阵列未就绪时开机阻塞)
sudo mkfs.ext4 /dev/md5
sudo mkdir -p /data
echo "/dev/md5 /data ext4 defaults,nofail,x-systemd.device-timeout=30 0 0" | sudo tee -a /etc/fstab

# 5. 验证:挂载 + 重启后自动恢复
sudo mount -a && df -h /data     # 输出: /dev/md5 5.5T 33M 5.5T 1% /data
sudo reboot
lsblk /dev/md5                   # 重启后确认: md5 仍挂载在 /data(输出含 FSTYPE ext4)
cat /proc/mdstat                 # 输出: md5 : active raid5 sdd[2] sdc[1] sdb[0]

关键教训:很多新手"创建成功、格式化成功",但重启后阵列消失——99% 是因为第 3 步没写 mdadm.conf、没更新 initramfs。

管理操作

# 查看阵列状态
cat /proc/mdstat  # 输出: md0 : active raid0 sdc[1] sdb[0]...
sudo mdadm --detail /dev/md5  # 输出: (显示阵列详细信息)

# 模拟故障并更换磁盘
sudo mdadm /dev/md5 --fail /dev/sdc  # 输出: mdadm: set /dev/sdc faulty in /dev/md5
sudo mdadm /dev/md5 --remove /dev/sdc  # 输出: mdadm: hot removed /dev/sdc from /dev/md5
sudo mdadm /dev/md5 --add /dev/sdf  # 输出: mdadm: added /dev/sdf

# 停止阵列
sudo mdadm --stop /dev/md5  # 输出: mdadm: stopped /dev/md5

# 重新组装
sudo mdadm --assemble --scan  # 输出: mdadm: /dev/md/5 has been started with 3 drives.

# 保存配置(下次开机自动组装)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf  # 输出: ARRAY /dev/md5 metadata=1.2 ...

故障恢复:坏盘替换与重建监控

真实故障恢复的顺序是:确认故障盘 → 摘除 → 插新盘 → 观察重建,全程不要慌,按步骤走:

# 1. 发现故障:mdstat 中 [U_U] 表示一块盘掉线,[U_UU] 的下划线位置即坏盘
cat /proc/mdstat      # 输出: md5 : active raid5 sdb[0] sdd[3] sde[2] sdc[1](F)
sudo mdadm --detail /dev/md5   # 输出: State: degraded, Failed Devices: 1

# 2. 核对故障盘序列号(拔盘前必须确认物理位置)
sudo smartctl -a /dev/sdc | grep -E "Serial|Reallocated|Pending"
# 输出: Serial Number: WD-XXXX  Reallocated_Sector_Ct: 128  Current_Pending_Sector: 37

# 3. 标记故障并摘除
sudo mdadm /dev/md5 --fail /dev/sdc     # 输出: mdadm: set /dev/sdc faulty in /dev/md5
sudo mdadm /dev/md5 --remove /dev/sdc   # 输出: mdadm: hot removed /dev/sdc from /dev/md5

# 4. 插新盘并加入阵列(新盘无需先分区/格式化,mdadm 会全盘接管)
sudo mdadm /dev/md5 --add /dev/sdf      # 输出: mdadm: added /dev/sdf

# 5. 观察重建进度(重建期间不重启、不拔盘、不扩容)
watch -n 5 cat /proc/mdstat
# 输出: [>....................]  recovery = 3.2% (124345/3893256) finish=37.6min speed=1723K/sec
sudo mdadm --detail /dev/md5   # 输出: State: clean, Rebuild Status: 100% complete

# 6. 重建完成后做一次全量一致性校验(巡检用)
echo check > /sys/block/md5/md/sync_action
watch -n 10 cat /proc/mdstat   # 输出: [===========>...........]  check = 61.8%

重建速度默认被 /proc/sys/dev/raid/speed_limit_min(1000 KB/s)限制,IO 空闲的机器可以放开:echo 50000 > /proc/sys/dev/raid/speed_limit_min。生产环境应让监控自动发现 degraded 状态:node_exporter 自带 mdadm collector,或写一行 cron 定时跑 mdadm --monitor

RAID + LVM 分层存储方案

推荐组合是 RAID 管冗余、LVM 管容量:mdadm 先组阵列,LVM 在阵列之上建 PV/VG/LV。这样扩盘、做快照、多文件系统共存都不影响阵列本身:

# 1. RAID 1 阵列作为物理卷
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
sudo pvcreate /dev/md1      # 输出: Physical volume "/dev/md1" successfully created

# 2. 建卷组并分配逻辑卷
sudo vgcreate vg_data /dev/md1     # 输出: Volume group "vg_data" successfully created
sudo lvcreate -L 500G -n lv_backup vg_data   # 输出: Logical volume "lv_backup" created.
sudo lvcreate -l 100%FREE -n lv_www vg_data  # 剩余空间全给 lv_www

# 3. 格式化挂载
sudo mkfs.ext4 /dev/vg_data/lv_www
sudo mount /dev/vg_data/lv_www /var/www
sudo vgdisplay vg_data   # 输出: Free PE / Size: 0 / 0(全部空间已分配)

# 4. 未来扩容:先扩底层阵列,再扩上层 LV(顺序不能反!)
sudo mdadm --grow /dev/md1 --raid-devices=3 --add /dev/sdf   # RAID 1 → 三盘镜像
sudo pvresize /dev/md1                                       # 让 LVM 感知新容量
sudo lvextend -l +100%FREE /dev/vg_data/lv_www
sudo resize2fs /dev/vg_data/lv_www   # ext4 在线扩容(xfs 用 xfs_growfs)

注意:xfs 只能扩不能缩,ext4 可缩但需离线。反向组合(LVM 之上做 RAID)也能工作,但 mdadm → LVM 的上下顺序维护更简单,也是 RHEL 系 lvcreate --type raid1 的默认实现方式。

RAID 性能测试:dd 与 fio

阵列建好后必须实测,别信宣传参数。先用 dd 粗测顺序吞吐,再用 fio 测随机 IOPS 与延迟(数据库类负载最关心的指标):

# dd 粗测顺序读(iflag=direct 绕过页缓存)
dd if=/dev/md1 of=/dev/null bs=1M count=2048 iflag=direct
# 输出: 2147483648 bytes (2.1 GB) copied, 6.812 s, 315 MB/s
# dd 粗测顺序写
dd if=/dev/zero of=/mnt/raid1/testfile bs=1M count=2048 oflag=direct
# 输出: 2147483648 bytes (2.1 GB) copied, 7.402 s, 290 MB/s

# fio 随机读写 4KB 队列深度 32(模拟数据库压力)
sudo fio --name=randrw --rw=randrw --bs=4k --size=2G --numjobs=8 \
  --runtime=60 --iodepth=32 --ioengine=libaio --direct=1 \
  --filename=/mnt/raid1/fio_test --group_reporting
# 输出(节选): read: IOPS=4123, BW=16.1MiB/s ; write: IOPS=4123, BW=16.1MiB/s
# 输出(节选): lat (usec): min=5, max=48213, p99=1780.23

rm -f /mnt/raid1/fio_test

对比技巧:同一套 fio 参数分别跑 HDD RAID 5 与 SSD RAID 1,IOPS 通常差 50-100 倍。结果远低于预期时,优先怀疑:①条带大小与负载不匹配(mdadm --detail 看 Chunk Size,4K 随机写为主建议 64K 或更小);②未开写回缓存;③阵列正处重建/巡检状态(看 /proc/mdstat)。

监控与邮件告警

# 配置 mdadm 监控
sudo mdadm --monitor --mail=admin@example.com --delay=300 /dev/md5

# 或配置 /etc/mdadm/mdadm.conf 中的 MAILADDR 并启用 systemd 定时器
sudo systemctl enable mdmonitor.service  # 输出: Created symlink /etc/systemd/system/...

常见错误

错误现象可能原因解决方法
阵列无法组装mdadm.conf 缺失 / 超时mdadm --assemble --scan 手动扫描
重建速度极慢系统 IO 繁忙 / 校验读写放大调整 /proc/sys/dev/raid/speed_limit_min
磁盘标记为 faulty 后自动踢出硬件链路不稳定检查线缆、HBA 卡、SMART 状态
内核日志重复报错磁盘即将故障查看 dmesg | grep raid,立即更换
不同容量盘组 RAIDmdadm 以最小盘容量对齐尽量使用同型号同容量磁盘
写入性能不如预期未对齐条带大小 / 缺少写回缓存硬件 RAID 卡需开启 WB + BBU

最佳实践

场景推荐方案说明
数据库高并发写入RAID 10兼顾写性能与冗余,重建快
大容量文件存储RAID 6大盘重建时间长,双奇偶校验更安全
系统盘 / 双盘位 NASRAID 1简单可靠,恢复无需计算
临时计算缓存RAID 0最大化性能,数据可丢失
软件 RAID + 虚拟化RAID 10 + LVMmdadm 做 RAID,LVM 做灵活分配
超大规模(12+ 盘)RAID 60 / RAID 50多组 RAID 6/5 再条带,降低重建影响面
定期巡检cron + smartctl + mdadm --monitor每周检查磁盘 SMART 状态和阵列一致性

新服务器存储初始化检查清单

  1. 核对硬件lsblk 确认盘符与物理盘位对应,防止把数据盘当系统盘格式化
  2. SMART 基线:新盘先跑 smartctl -t short /dev/sdX 短自检,记录 Reallocated_Sector 基线为 0
  3. 定级别:按本章选型表定 RAID 级别,不盲目跟风"大家都用 RAID 10"
  4. 固化配置:创建后立即写入 mdadm.conf + update-initramfs,再验证 mdadm --assemble --scan
  5. fstab 安全:挂载项带 nofail,防止阵列未就绪导致开机卡死
  6. 部署监控:mdadm --monitor 或 node_exporter mdadm collector,degraded 状态 5 分钟内必须有人知道
  7. 压测基线:上线前跑一轮 fio,记录 IOPS/延迟基线数值,留作日后性能对比
  8. 文档化:在运维文档里记录阵列结构、chunk 大小、容量规划,换人交接不抓瞎
# fstab 安全写法(阵列延迟加载时不阻塞开机)
/dev/md5 /data ext4 defaults,nofail,x-systemd.device-timeout=30 0 0

练习题

  1. RAID 选择:你有 4 块 4TB 磁盘,需要为高并发 OLTP 数据库提供存储,选择哪种 RAID 级别?写出可用容量。
  2. mdadm 创建:用 3 块盘创建一个 RAID 5 阵列(设备名 /dev/md5),并格式化为 ext4。
  3. 故障模拟:在上述 RAID 5 中将 /dev/sdc 标记为故障、移除、添加新盘 /dev/sdf 重建。
  4. 容量计算:6 块 2TB 磁盘,做 RAID 6 可用容量多少?做 RAID 10 呢?
  5. 综合设计:某 NAS 有 8 块 8TB 盘,需要存储媒体文件并容忍至少 2 块盘同时故障,你会选择 RAID 6 还是 RAID 10?为什么?
点击查看答案
  1. 高并发 OLTP 数据库选择 RAID 10。可用容量 = 4×4TB / 2 = 8TB。RAID 10 写性能佳且重建快。
  2. sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd && sudo mkfs.ext4 /dev/md5
  3. sudo mdadm /dev/md5 --fail /dev/sdc && sudo mdadm /dev/md5 --remove /dev/sdc && sudo mdadm /dev/md5 --add /dev/sdf。用 cat /proc/mdstat 观察重建进度。
  4. RAID 6:可用容量 = (6-2) × 2TB = 8TB。RAID 10:可用容量 = (6/2) × 2TB = 6TB。
  5. 推荐 RAID 6。8×8TB 总裸容量大,RAID 6 可用 = 48TB,RAID 10 仅 32TB。媒体文件读写主要是顺序 I/O,RAID 6 写性能可接受,且能容忍任意 2 块盘同时故障(8TB 盘重建时间长,期间再坏一块概率大)。

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能用自己的话解释 RAID 0/1/5/6/10 各级别的原理和容错能力尝试向他人讲解
命令操作能不查文档完成 mdadm 创建软 RAID 阵列、故障盘替换与重建在终端实际执行
原理掌握能说出 RAID 5 的"读-改-写"放大效应及对随机写性能的影响画出流程图
故障排查能独立排查 RAID 阵列重启后无法自动组装的问题模拟故障并修复
最佳实践能说明为什么 RAID 不能取代备份对比不同方案

本章总结

速查表

级别最小盘数容量效率容错数写性能重建速度典型场景
RAID 02100%0⭐⭐⭐缓存/临时数据
RAID 1250%1⭐⭐⭐⭐⭐系统盘/双盘 NAS
RAID 53(N-1)/N1⭐⭐通用存储
RAID 64(N-2)/N2大容量安全存储
RAID 10450%每镜像 1⭐⭐⭐⭐⭐⭐数据库/高 IO

学习路径

  1. 掌握 mdadm 创建/管理/监控软 RAID →
  2. 理解 RAID 级别取舍,能在真实场景中选型 →
  3. 组合 LVM on RAID 构建弹性存储栈 →
  4. 了解 ZFS / Btrfs 的校验和、快照、压缩等高级特性 →
  5. 建立 RAID + 备份的完整数据保护观念

延伸阅读

常见问题

RAID 5 和 RAID 10 怎么选?
RAID 5(条带 + 校验):N 块盘的有效容量 N-1,读性能好,写性能略差(需要计算校验),单盘故障可恢复。RAID 10(镜像 + 条带):有效容量 N/2,读写性能好,多盘故障可恢复(取决于故障盘位置)。性能优先选 RAID 10,容量优先选 RAID 5/6。生产关键业务推荐 RAID 10。
RAID 能替代备份吗?
绝对不能!RAID 只防物理磁盘故障,不防逻辑错误(误删、中毒、勒索软件、软件 bug 批量修改数据)。RAID 控制器故障也可能导致数据不可访问。3-2-1 备份原则:RAID 只是 3 份副本中的 1 份,备份放在不同设备和位置。
ZFS 和 Btrfs 的核心理念分别是什么?
两者都是写时复制(CoW)文件系统。ZFS 强在数据完整性(所有数据都有 checksum,自动修复静默损坏)、存储池管理、快照和克隆、压缩和 dedup。Btrfs 优势是内置于 Linux 内核(不需要额外许可)、子卷概念灵活(/ 分区可独立回滚快照)。ZFS 更适合大规模存储阵列,Btrfs 更适合桌面和普通服务器。
↑ 回到顶部