一台服务器插了 4 块 4TB 的企业盘,老板问:"能用多少容量?"最直觉的回答是 16TB,但做完 RAID 之后可能是 16TB、8TB 或 12TB——差别取决于你选哪种 RAID 级别,而这个选择同时决定了三件事:可用容量、能承受几块盘损坏、以及写入性能会下降多少。更麻烦的是,很多运维凭"RAID 5 性价比高"的印象做决定,直到一块盘坏了、重建跑了 18 小时还没完成、第二块盘也跟着报错时才发现选错了。本文把 RAID 0/1/5/10 的原理、容量公式、写惩罚算清楚,再给出 Linux 下 mdadm 的实操命令。
一、RAID 到底解决什么问题
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)本质上是把多块物理盘组合成一个逻辑设备,目标无非三个,而这三个目标往往互相打架:
- 提升性能:把 I/O 分散到多块盘并行处理,主要提升吞吐与 IOPS。
- 提供冗余:允许部分成员盘损坏后数据仍可用、仍可恢复。
- 扩大容量:把多块盘的容量聚合成一个大逻辑卷。
没有任何一种 RAID 能同时把这三项做到最优,所谓选型就是在三者之间做取舍。另外要先把一句最重要的话放在前面:RAID 不是备份。它防的是硬件故障,防不住误删除、勒索加密、文件系统损坏、机房火灾。任何 RAID 之上都还要有独立备份。
二、四种 RAID 级别的原理
2.1 RAID 0:条带化,只要性能不要安全
数据被切成固定大小的条带(chunk,常见 64KB/128KB/256KB),交替写入各块盘。读写都可以并行,理论吞吐是单盘的 N 倍,容量利用率 100%。
致命缺点:没有任何冗余。N 块盘中任意一块损坏,整个阵列的数据全部不可读——而且因为数据是交错存放的,恢复难度远高于单盘损坏。RAID 0 只适合放可以重建的数据:缓存、临时计算中间结果、可重新拉取的副本。
2.2 RAID 1:镜像,最简单也最可靠
两块(或多块)盘写完全相同的数据。读可以并行(部分实现支持从两块盘分摊读请求),写性能约等于单盘。容量利用率是 1/N,两块 4TB 做 RAID 1 只有 4TB 可用。
优点:结构简单、重建快(直接整盘拷贝,不涉及校验计算)、可以容忍 N-1 块盘损坏(理论上,实际取决于实现)。两块盘的 RAID 1 是系统盘的经典选择。
2.3 RAID 5:分布式奇偶校验,性价比的代价
数据和校验信息分散在所有盘上,任意一块盘的容量用于存放校验(但不是固定在某块盘,而是轮转分布)。允许坏 1 块盘。容量利用率 (N-1)/N。
RAID 5 的问题是写惩罚最重且重建风险高。每次写一小块数据,控制器要:读旧数据 → 读旧校验 → 计算新校验 → 写新数据 → 写新校验,共 4 次 I/O(大块连续写可以整条带写入从而避免,但随机小写必然触发)。这就是为什么同样 4 块盘,RAID 5 的随机写 IOPS 常常还不如 RAID 10 的三分之一。
重建风险指的是:当一块盘损坏后,阵列处于"降级"状态,此时要读取剩余 N-1 块盘的全部数据来计算丢失的数据。以 4 块 4TB 盘为例,重建要读约 12TB 数据。机械盘标称的不可恢复读错误率(URE)通常在 10^-14 量级(企业级盘为 10^-15~10^-16 量级),读到这么多数据时,遇到一个读不出来就位的概率并不低——一旦发生,重建失败,数据丢失。盘越大、重建越慢,这个风险越高。这也是"大容量机械盘不建议做 RAID 5"的根本原因。
2.4 RAID 10:先镜像再条带,性能与安全兼顾
RAID 10(也叫 RAID 1+0)是先做多个 RAID 1 镜像对,再把这些镜像对条带化。它同时获得了 RAID 0 的并行读性能和 RAID 1 的冗余能力。
容错能力:允许每个镜像对中坏一块盘。理论上 4 盘 RAID 10 可以坏 2 块,但前提是这两块不在同一个镜像对里——如果不巧坏了同一个镜像对的两块,数据就没了。所以保守说法是"通常能承受 1 块,运气好能承受 2 块"。
重建速度是 RAID 10 的另一大优势:只需要从一个完好的镜像盘整盘拷贝,不涉及校验计算,一块 4TB 盘的重建时间以小时计,而 RAID 5 降级重建可能要跑十几甚至几十小时,期间性能大幅下降。
三、可用容量与写惩罚:两个必须会算的公式
设成员盘数量为 N,单盘容量为 D。
| 级别 | 可用容量公式 | 4×4TB 示例 | 容错能力 | 写惩罚 | 随机写性能 |
|---|---|---|---|---|---|
| RAID 0 | N × D | 16TB | 0 块(坏 1 块全丢) | 1 | 最优 |
| RAID 1 | D(利用率 1/N) | 4TB | N-1 块 | 2 | ≈ 单盘 |
| RAID 5 | (N-1) × D | 12TB | 1 块 | 4 | 较差 |
| RAID 6 | (N-2) × D | 8TB | 2 块 | 6 | 最差 |
| RAID 10 | (N/2) × D | 8TB | 每个镜像对各 1 块 | 2 | 好 |
写惩罚(Write Penalty)的含义是:应用程序发出 1 次逻辑写,阵列后端实际要执行多少次物理 I/O。计算方法举例——RAID 5 一次随机小写:读旧数据(1) + 读旧校验(1) + 写新数据(1) + 写新校验(1) = 4 次。所以如果 4 块盘的理论总写 IOPS 是 400,RAID 5 能给到应用的随机写 IOPS 大约只有 400/4 = 100;RAID 10 写惩罚为 2,同样硬件能给到 200。这就是为什么数据库普遍选 RAID 10 而不是 RAID 5。
读性能方面:RAID 0 和 RAID 10 的读可以并行到所有成员盘;RAID 5 的读在正常状态下也能并行到 N-1 块盘(校验盘那块空闲),但降级状态下每块盘都要参与 XOR 计算,读性能会明显下降。
四、mdadm 实操:Linux 软 RAID 的创建与运维
4.1 创建阵列
# 安装 mdadm
yum install -y mdadm # RHEL/CentOS/Rocky
apt-get install -y mdadm # Debian/Ubuntu
# 确认成员盘(务必确认是空盘!)
lsblk -d -o NAME,SIZE,TYPE,MODEL
# 创建 RAID 1(2 块盘,用于系统盘/重要小容量数据)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
# 创建 RAID 5(3 块数据盘 + 1 块热备盘)
mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 \
--chunk=256 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 创建 RAID 10(4 块盘,数据库推荐)
mdadm --create /dev/md10 --level=10 --raid-devices=4 \
--chunk=256 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 查看创建进度与阵列状态
cat /proc/mdstat
mdadm --detail /dev/md10
--chunk 是条带大小。顺序大文件为主的业务(视频、备份)适合较大的 chunk(256KB~512KB);随机小 I/O 为主的业务(数据库、虚拟机)适合较小的 chunk,但要注意过小会导致单个 I/O 跨多块盘。如果不确定,用默认值或 256KB 是稳妥的。
创建后阵列会进入同步(resync)状态,/proc/mdstat 显示进度百分比。此时可以格式化使用,但性能会受同步影响,建议等同步完成再上线业务。
4.2 格式化、挂载与持久化配置
# 格式化 mkfs.ext4 -F /dev/md10 # 或 XFS(大文件、高并发场景) mkfs.xfs -f /dev/md10 # 获取 UUID 并写入 /etc/fstab 实现开机自动挂载 blkid /dev/md10 mkdir -p /data echo 'UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults,noatime,nofail 0 2' >> /etc/fstab mount -a df -h /data # 保存阵列配置,保证重启后能自动组装(RHEL 系路径) mdadm --detail --scan >> /etc/mdadm.conf # Debian/Ubuntu 通常为 /etc/mdadm/mdadm.conf mdadm --detail --scan >> /etc/mdadm/mdadm.conf
4.3 故障盘替换(必会)
# 1. 查看阵列状态,确认哪块盘 Faulty mdadm --detail /dev/md10 cat /proc/mdstat # 2. 标记为故障并移除 mdadm /dev/md10 --fail /dev/sdb mdadm /dev/md10 --remove /dev/sdb # 3. 关机换盘(或热插拔),新盘上线下加回阵列 mdadm /dev/md10 --add /dev/sdb # 4. 观察重建进度 watch -n 5 cat /proc/mdstat
如果阵列里配了热备盘(--spare-devices),第 2、3 步会自动触发,热备盘顶上后立即开始重建,这是缩短降级窗口的有效手段。
4.4 监控
# 一次性检查所有阵列(常用作监控项) mdadm --monitor --scan --test --oneshot # 配置邮件告警(在 mdadm.conf 或 mdadm 服务配置中设置 MAILADDR) # 也可以用 cron 定时检查降级状态 mdadm --detail --scan | grep -i degraded cat /proc/mdstat | grep -Ei '\[.*_.*\]|degraded'
/proc/mdstat 中 [UUUU] 表示 4 块盘全部正常,出现 _(如 [U_UU])表示对应位置盘异常。这个字符串应该被纳入监控系统,出现下划线立即告警——很多数据丢失事故的第一现场,就是"盘坏了三个月没人发现"。
五、选型决策清单
- 先回答"这份数据丢了能不能重建"。能重建的(缓存、临时文件、可重新拉取的副本)才考虑 RAID 0;不能重建的一律要有冗余。
- 计算可用容量是否满足 24 个月需求。按 (N-1)×D 或 (N/2)×D 算,再减去 20% 水位线(文件系统在接近满时性能会明显下降)。
- 判断写的比例。写占比超过 30% 的 OLTP 数据库、虚拟化平台,直接排除 RAID 5;以读为主的归档、静态资源服务可以考虑 RAID 5/6。
- 判断单盘容量。机械盘单盘超过 2TB~4TB 时,RAID 5 的重建风险显著上升,优先 RAID 10 或 RAID 6。
- 确认用的是固态还是机械。SSD 做 RAID 5 时校验计算会加剧写放大,缩短寿命;且 SSD 重建速度快,RAID 10 的容量损失更容易接受。
- 确认是否有硬件 RAID 卡。硬 RAID 卡带缓存(BBU/超级电容保护)能显著缓解写惩罚,软 RAID(mdadm)则依赖内存与内核。有卡时优先用卡,并在卡上开启写缓存;没有卡时 mdadm 是可靠选择。
- 无论如何配热备盘,并配置降级告警。
- 上线前做一次真实的故障演练:拔一块盘,看重建耗时与业务影响,把结果写进运维手册。
小结与避坑建议
一句话总结选型:系统盘用 RAID 1,数据库和虚拟机用 RAID 10,以读为主的大容量归档可以考虑 RAID 5/6,只有可重建的临时数据才用 RAID 0。
需要特别警惕的几个坑:
- "RAID 5 性价比最高"是过时的经验。它诞生于单盘容量只有几十 GB 的年代,那时重建很快。在 4TB、8TB 盘普及的今天,RAID 5 的重建窗口太长,降级期间再坏一块盘的概率不可忽略。
- 降级状态无人知晓。没有告警的 RAID 等于没有 RAID。务必监控
/proc/mdstat的_标记。 - 重建前不检查剩余盘的健康状态。重建是高负载操作,很可能把一块已有潜在坏道的盘压垮。重建前先对剩余盘做 SMART 检查(
smartctl -t long /dev/sdX)。 - 以为 RAID 能替代备份。误删一条 SQL、被勒索软件加密、阵列卡故障导致元数据损坏——这些 RAID 全都救不了你。
- 混合不同容量、不同批次的盘。阵列可用容量受最小盘限制(每块盘只按最小容量参与),且同批次盘更容易同时进入损耗期。建议同型号、同容量、不同批次采购。
- 忘记保存 mdadm 配置。不写
/etc/mdadm.conf,重启后阵列可能组装失败或以只读方式组装。
最后提醒:无论选哪种 RAID,都要把"重建耗时"作为选型时的硬指标。用一块盘的实际重建时间乘以 2,就是你的风险窗口长度。如果这个长度你无法接受,就换更高冗余的方案。
本文为存储与硬盘管理系列,mdadm 参数请以实际系统版本为准。
企业QQ咨询




