十年前,这句话是对的:

“RAID 5硬盘坏了一块盘不要慌,数据还在,换块新盘重建就行。”

同样,今天可能正在把你的数据带来一场几乎无法挽回的灾难。

问题出在 RAID 5 本身的设计引发了 bug,但硬盘容量涨得太快了——十年前用几百 GB 的硬盘组 RAID 5,重建过程平安无事;今天动用 4TB、8TB 的硬盘组 RAID 5,重建这件事,已经变成了一场“撑不了过去”的赌博。

这篇把 RAID 的基本原理,和这个越来越多的人吃过亏、却很少被讲透的坑,一次性讲清楚。

一、RAID的两块积木:条带化和镜像

了解所有RAID级别之前,先搞清楚两个最基础的技术动作,后面的所有花样,都是这两块积木的排列组合。

条带化(Striping):把一份数据,拆成一块一块,分散写到多块硬盘上,多块硬盘同时读写——这是“追求速度”路线的核心武器。

镜像(Mirroring):把同一份数据,完整地复制一份,写到另一块硬盘上——两块盘上的内容永远一模一样,这是“追求安全”路线的核心武器

一个直白的对比:条带化相当于几个人分头干活,谁都不留一份完整的记录,效率高但没有备份;镜像像立即准备着一模一样的两份笔记,其中丢了一份,另一份原封不动。

二、RAID 0:纯条带化,只服务“快”这一个字

RAID 0,纯用条带化搭出来,完全不做任何音响:

数据块1 → 硬盘A
数据块2 → 硬盘B
数据块3 → 硬盘A
数据块4 → 硬盘B

优点:读写速度,随着盘数增加而线性提升,是所有RAID级别里最快的。

代价是只要任意一块盘挂了,整个分区的数据,全部报废,没有任何恢复的可能——因为每一份完整的数据,都被拆散、分配在了所有盘上,少了任何分区,都是一份“缺胳膊少腿”的残缺数据。

一句话定位:RAID 0追求极限性能,代价是把风险也放大到了极限——盘越多,出问题的概率生成反而增益,因为任何一块盘坏了都是团灭。几乎用不到在需要保护真实业务数据的场景,只适合“数据随时可以重新、丢了也无所谓”的场景,比如某些临时计算的存储盘。

三、RAID 1:纯镜像,用一半钱换绝对养老金

RAID 1,纯用镜像互连出来:

硬盘A:完整数据
硬盘B:完整数据(跟A一模一样)

优点:只要还有一块存在的盘,数据就在——这是所有 RAID 级别里,恢复逻辑最简单、最让人放心的一种。

成本你花费买的容量,在真正干活中只有一半——两块2TB的硬盘,组成RAID 1,可用容量足够只有2TB,另外那2TB,全部用来存那份一模一样的备份了。

四、RAID 5:用“解密”这个聪明想法,只占用一块磁盘的容量

这就是今天的重点。

RAID 5想解决一个问题:RAID 1用镜像换安全,代价是浪费了整整一半的容量——能不能只花“磁盘”的容量,就换来“任何磁盘坏了都不怕”的保护?

答案是:靠“校验值”(Parity)。

硬盘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 悄悄拖慢了你的每一次写入

RAID 5的第一个代价,很多人都知道,但无意中它到底有挂钩——写惩罚(Write Penalty)。

想象一下你只是想修改硬盘上的一小块数据,RAID 5 实际做的事情,比你想象的要复杂:

① 先读出 硬盘A 上的旧数据
② 先读出 硬盘D 上的旧校验值
③ 计算出新的校验值
④ 把 硬盘A 上写入新数据
⑤ 把 硬盘D 上写入新的校验值

改一块数据,实际上要经历“读两次、写两次”,业务管这个叫“读-改-写”(Read-Modify-Write)。

这就是为什么,RAID 5 在“写密集型”场景下(比如密集写入的数据库),性能表现往往不尽如人意——每一次也是看起来简单的写操作,背后这整套额外的读写头藏着。这也是很多数据库场景的存储选型指南里,显然不建议用 RAID 5 的直接原因。

六、代价二:真正致命的坑——重建时的“二次雪崩”

这是这篇文章最想讲清楚、也是最容易被忽视的部分。

RAID 5损坏一块盘,换上新盘之后,做“重建”——重建的过程,需要把剩下的所有硬盘上的数据,完整地读一遍,才能重新计算出丢失那块盘上的内容。

问题出在这里:硬盘这个东西,包含完好的、没有明显故障,也有一个极小概率的风险——某个扇区,读的时候,正好读不出来(现象专业说法叫URE,不可恢复的读取错误,不可恢复的读取错误)。平时正常使用,这种存在的概率小到几乎可以忽略不计——你不敢把整块硬盘头读到尾部一遍。

但重建的过程,必须要把剩下的每一块硬盘,完整、从头到尾地读一遍。

十年前,硬盘容量小(几GB),重建时需要读取的数据概览也小,遇到URE的概率低到几乎不用担心。今天,硬盘动容量几乎4TB、8TB,重建时完整读取的数据概览,暴涨了几十倍——遇到URE的,跟着水涨船高的概率,已经不再是一个可以放心忽略的小概率事件了。

最讽刺、也最让人心碎的场景是这样的

① RAID 5 阵列,坏了一块盘(这本该是"有惊无险"的场景)


② 换上新盘,开始重建


③ 重建过程中,读取剩下某一块硬盘时,
恰好撞上一个 URE(读不出来这个扇区)


④ 重建失败!
因为少了这一块的数据,
连本该正常的那部分数据,也一起无法恢复


⑤ 结果:本来只坏了一块盘,
最后演变成了整个阵列数据全部丢失

“只坏硬盘”最终变成“全部数据报销”,问题的根源,不是运气差,而是大容量硬盘时代,RAID 5 套件设计从一开始就缺乏充分考虑到一个统计学风险。

七、怎么破:RAID 6 和 RAID 10

RAID 6:多留一块盘做“双重校验”。

RAID 6 在 RAID 5 的基础上,采用两种不同的校验算法,同时计算两份独立的校验值,分配在两块盘上——代价是牺牲大量盘的容量,换来的是“同时损坏两块盘,同样能够完整恢复数据”。

这直接解决了前面那个“二次雪崩”的问题:重建过程中,就算不巧撞上一次URE,因为还有“第二重”校验兜底,依然能够把数据完整救回来——这也是为什么,在硬盘普遍进入大容量时代之后,很多存储厂商和方案,已经把默认推荐,从RAID 5逐渐转向了RAID 6。

RAID 10:镜像+条带化,双保险但更贵。

RAID 10,是先把盘两组做镜像(RAID 1),再把这几组镜像,做条带化(RAID 0)拼起来:

硬盘A + 硬盘B(互为镜像)──┐
├─ 条带化拼接
硬盘C + 硬盘D(互为镜像)──┘

RAID 10 完全没有“写惩罚”这个问题——写入的时候,只是简单地把数据同时写两份,没有校验值计算这还有额外的处理,性能远比 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%最好数据库等写密集型关键业务

今天的选型:如果还在用数千GB到1TB级别的经验硬盘做RAID 5,风险可以接受;但只要硬盘容量进2TB、4TB甚至更大,继续用RAID 5,尤其是对不能丢失的重要数据,真的要认真换成RAID 6或RAID 10了。

“RAID 5能坏物理盘,数据还在”这句话,本身并没有说错——**它错在,很多人都没有意识到,这句话背后藏着一个假设:“重建过程本身,一定能顺利完成”**。而这个假设,在硬盘还小的年代,几乎总是成立的;在今天硬盘越做越大的时代,正在变得越来越不牢靠。

真正的风险,不在于“坏块盘”这件事本身,而在“坏块盘之后,重建这几个小时到几十个小时里,剩下的盘,无法承受一次完整的、无法任何差错的全盘读取”。

这个道理讲清楚了,你现在应该比大多数还停留在“RAID 5天下无敌”的人,更明确的应该选型了——如果家里、公司的仓库还在裸奔用大容量RAID 5,这一转发给负责的同事,让他心里也有数。

打开网易新闻 查看精彩图片