来源:赵楠的成长日记(微信公众号)| 发布日期:2026-09-04 十年前"RAID 5 坏一块盘不要慌,数据还在,换块新盘重建就行"是对的;今天用 4TB、8TB 的大盘组 RAID 5,坏盘后的重建已经变成一场"撑不过去"的赌博。问题不在 RAID 5 的设计,而在硬盘容量涨得太快。本页讲透 RAID 5 的两个代价——写惩罚、重建时的 URE 二次雪崩——以及大容量时代该怎么选型。
一、先弄懂两块积木:条带化与镜像
所有 RAID 级别都是下面两个动作的排列组合(级别横向对比表见 linux-raid-lvm-basics-guide,这里只讲理解本文必需的机制):
- 条带化(Striping):把一份数据拆成一块一块,分散写到多块硬盘上,多块硬盘同时读写——"追求速度"路线的核心武器
- 镜像(Mirroring):把同一份数据完整复制一份写到另一块硬盘上,两块盘上的内容永远一模一样——"追求安全"路线的核心武器
- 直白对比:条带化相当于几个人分头干活,谁都不留一份完整记录,效率高但没有备份;镜像像准备了两份一模一样的笔记,丢了一份,另一份原封不动
组合结果速览:RAID 0 = 纯条带化(读写速度随盘数增加而提升、零冗余,任意一块盘坏即全盘数据报废);RAID 1 = 纯镜像(只要还有一块盘数据就在,但容量利用率只有 50%——两块 2TB 组 RAID 1 可用容量只有 2TB);RAID 5/6 = 条带 + 校验;RAID 10 = 镜像组再条带。各级别横向对比表与命令详见 linux-raid-lvm-basics-guide。
二、RAID 5 的原理:只花约一块盘容量,换"任意坏一块都不怕"
RAID 1 用镜像换安全,代价是浪费整整一半容量。RAID 5 想解决的问题是:能不能只花"一块盘"的容量,就换来"任何一块盘坏了都不怕"的保护? 答案是靠校验值(Parity)。以 4 块盘为例:
硬盘 A:数据块 1
硬盘 B:数据块 2
硬盘 C:数据块 3
硬盘 D:数据块 1 ⊕ 数据块 2 ⊕ 数据块 3(校验值)
- 校验值 = 把同一行上所有数据块做一次异或运算(⊕)算出来
- 异或的神奇性质:只要知道校验值、以及除丢失块之外的所有数据,就能反推算出丢失的那一块
- 具体到例子:如果硬盘 C 坏了,只要 A、B、D 还在,靠 A ⊕ B ⊕ D 就能把 C 上的数据完整重新计算出来
这就是 RAID 5 的精髓:4 块盘只占用相当于 1 块盘的容量,就换来"随便哪一块盘挂掉,数据都能被算回来"——比 RAID 1 省一半空间,这也是它长期被广泛使用的原因。
三、代价一:写惩罚——每次小写入背后是"读两次、写两次"
RAID 5 的第一个代价是写惩罚(Write Penalty)。想象只想修改硬盘上的一小块数据,RAID 5 实际要做的事:
① 读出硬盘 A 上的旧数据
② 读出硬盘 D 上的旧校验值
③ 计算出新的校验值
④ 把新数据写入硬盘 A
⑤ 把新的校验值写入硬盘 D
改一块数据,实际要经历"读两次、写两次",即读-改-写(Read-Modify-Write)。
这就是 RAID 5 在写密集型场景(比如密集写入的数据库)下性能表现往往不尽如人意的原因——每一次看似简单的写操作,背后都藏着这套额外的读写开销。这也是很多数据库场景的存储选型指南明确不建议用 RAID 5 的直接原因。
四、代价二:重建时的 URE"二次雪崩"(最致命的坑)
4.1 重建 = 把剩下的盘从头到尾完整读一遍
RAID 5 坏一块盘,换上新盘后开始"重建"——重建的过程需要把剩下所有硬盘上的数据完整读一遍,才能重新计算出丢失那块盘上的内容。
4.2 URE 平时为什么感知不到
硬盘即使本身完好、没有明显故障,也存在一个极小概率的风险:某个扇区在读的时候正好读不出来——专业说法叫 URE(Unrecoverable Read Error,不可恢复的读取错误)。平时正常使用,这个概率小到几乎可以忽略——因为你不会没事把整块硬盘从头到尾读一遍。
4.3 容量变大后,概率不再可忽略
但重建的过程必须把剩下的每一块硬盘从头到尾完整读一遍:
- 十年前,硬盘容量小(几百 GB 级),重建需要读取的数据量小,撞上 URE 的概率低到几乎不用担心
- 今天,硬盘动辄 4TB、8TB,重建时完整读取的数据量暴涨几十倍,撞上 URE 的概率水涨船高——已经不再是可以放心忽略的小概率事件
4.4 最讽刺的"二次雪崩"场景
① RAID 5 阵列坏了一块盘(这本该是"有惊无险"的场景)
│
▼
② 换上新盘,开始重建
│
▼
③ 重建过程中,读取剩下某一块硬盘时,恰好撞上一个 URE(扇区读不出来)
│
▼
④ 重建失败!因为少了这一块的数据,连本该正常的那部分数据也无法恢复
│
▼
⑤ 结果:本来只坏了一块盘,最后演变成整个阵列数据全部丢失
4.5 根因:是统计学风险,不是运气差
"只坏一块盘"最终变成"全部数据报销",根源不是运气差,而是大容量硬盘时代,RAID 5 的设计从一开始就没有充分考虑到这个统计学风险。
五、怎么破:RAID 6 和 RAID 10
RAID 6:多留一块盘做"双重校验"
- 在 RAID 5 基础上,用两种独立的校验算法同时计算两份独立的校验值,分布在不同盘上
- 代价:牺牲两块盘的容量
- 换来:同时损坏两块盘,也能完整恢复数据
- 直接解决"二次雪崩":重建过程中就算不巧撞上一次 URE,还有第二重校验兜底,依然能把数据完整救回来
- 这也是硬盘普遍进入大容量时代后,很多存储厂商和方案把默认推荐从 RAID 5 转向 RAID 6 的原因
RAID 10:镜像 + 条带化,双保险但更贵
硬盘 A + 硬盘 B(互为镜像)──┐
├─ 条带化拼接
硬盘 C + 硬盘 D(互为镜像)──┘
- 先把盘两两做成镜像(RAID 1),再把镜像组做条带化(RAID 0)拼接
- 完全没有写惩罚:写入只是简单地把数据同时写两份,没有校验值计算,性能远比 RAID 5/6 好,尤其是写密集型场景
- 代价:容量利用率只有 50%,跟 RAID 5/6 比成本明显更高
六、一张选型表:把逻辑焊死在脑子里
| RAID 级别 | 冗余方式 | 容量利用率 | 写性能 | 典型场景 |
|---|---|---|---|---|
| RAID 0 | 无冗余 | 100% | 最快 | 可丢失的临时/缓存数据 |
| RAID 1 | 完整镜像 | 50% | 一般 | 系统盘、小规模关键数据 |
| RAID 5 | 单校验 | (n-1)/n | 有写惩罚 | 读多写少、容量优先的场景 |
| RAID 6 | 双校验 | (n-2)/n | 写惩罚更重 | 大容量硬盘时代,替代 RAID 5 的更安全选项 |
| RAID 10 | 镜像+条带 | 50% | 最好 | 数据库等写密集型关键业务 |
今天的选型红线:
- 如果还在用 1TB 级及以下(几百 GB 到 1TB)的硬盘做 RAID 5,风险可以接受
- 只要硬盘容量进入 2TB、4TB 甚至更大,继续用 RAID 5——尤其对不能丢失的重要数据——真的要认真换成 RAID 6 或 RAID 10
七、写在最后:被忽视的隐含假设
"RAID 5 坏一块盘数据还在"这句话本身并没有说错——它错在,很多人都没意识到这句话背后藏着一个假设:"重建过程本身,一定能顺利完成"。而这个假设,在硬盘还小的年代几乎总是成立;在今天硬盘越做越大的时代,正在变得越来越不牢靠。
真正的风险,不在于"坏一块盘"这件事本身,而在坏盘之后重建的几小时到几十小时里,剩下的盘必须承受一次完整的、不允许任何差错的全盘读取。如果家里的、公司的存储还在裸奔用大容量 RAID 5,且数据丢不起,就该把 RAID 6 / RAID 10 提上日程了。
关联页面
| 页面 | 关联点 |
|---|---|
| linux-raid-lvm-basics-guide | RAID/LVM 基础总纲:RAID 0/1/5/6/10 级别对比表、mdadm 与 LVM 命令、常见陷阱 |
| linux-smart-disk-failure-prediction | SMART 磁盘健康监测实战:坏盘前 1-3 周预警、主动换盘,避免"重建还没跑完第二块又掉了"的雪崩场景 |
| linux-disk-io-tuning | 磁盘 IO 性能调优(存储介质/调度器/文件系统视角) |