关于硬盘 RAID 配置的科普与疑问

2021-08-07 09:33:04 +08:00
 LeeReamond

NAS 相关姊妹贴,前情提要

原贴回复过长,单独开一贴询问 RAID 问题。

首先科普部分,如果有老哥完全不清楚 raid 的话,简单描述常见 raid 是什么:

    假设有 n 块硬盘的话,在其中 n-1 块上写入实际数据,在剩下一块上写入对应的 xor 校验数据,
    因此任意一块硬盘的数据即使完全丢失,可通过 xor 结果反向计算出丢失的数据是什么,进行重建。
    技术细节上校验块并不集中于同一物理硬盘,而是平均分布于各盘。
    损失 1/n 的容量。假设有 10 块 10T 机械硬盘,最多可储存 90T 实际数据。
    因为 raid5 只能应对一处错误,如果两处错误同时发生,则会导致所有数据全部丢失的窘境。
    为了修正这个弱点,raid6 在 raid5 基础上将校验块又备份了一份,所以同时两处出错也能完全恢复数据。
    损失 2/n 的容量。另外缺陷是由于每次写入至少有三块硬盘在动,通常速度会比 raid5 更慢。

前贴中老哥回复的总结

有不止一位老哥提到 raid5 容易发生重建失败的问题。因为单个盘掉盘以后插入新盘的重建过程,由于硬盘容量通常很大,重建通常会持续若干天,在这期间发生再次掉盘则全部数据 GG 。

操作上的疑问

很多东西需要问一下,因为我只配过 raid 而确实没发生过数据损毁的情况,可能还是用得少。

个人感想

上文只是作为知识上的好奇,看了各位的回复以后,我觉得我应该会使用两张盘搞 raid1,剩下的都是裸数据的方案。因为即使是 nas 当中,大多数数据也是没有什么保护需求的,只有少部分个人文件、家庭照片、稀缺资源等等需要备份,搞一个专用保护分区应该足够,剩下的数据完全可以随便存放,丢了也就丢了,这应该是一套比较合适的方案。

另外问一下关于硬盘断电,win 有自带的判断硬盘一段时间无活动就会自动断电的功能,通常来说断电可以最大程度上保护硬盘使用寿命,同时还能省电,我想知道有无老哥遇到过频繁断电通电导致磁头损坏之类的问题。

4461 次点击
所在节点    问与答
50 条回复
yazoox
2021-08-08 06:44:02 +08:00
@FlyingShark 群晖的 shr 好用么?听说是变形的 raid5 ?要是坏了一块盘,怎么重建?
ryd994
2021-08-08 07:33:54 +08:00
@singerll 你如果真的把我的话看懂。用你的比喻:
你:汽车有天窗,要透气的时候可以打开,所以汽车比自行车通风更好
我:你不开汽车要个毛的天窗
你:你就说有没有通风吧

人家自行车透气比汽车好多了好吧。是因为汽车开得快,才需要做车厢罩起来,然后才有的通风问题。

你说汽车(一般情况下)比自行车跑得快,没问题。但是你要说汽车比自行车更透气,那就有问题。

你不能把“创造一个本不存在的问题,然后用其他办法解决它”,截掉前一半,变成“解决了 xx 问题”吧。
PolarBears
2021-08-08 07:42:19 +08:00
个人观点是 Raid 是为了保证高可用其次才是冗余修复数据的功能。无法保证数据遭到误操作或恶意删除。
生产环境的话应是 raid+定期备份,个人用的话我觉得每天同步下做备份即可。
SgtPepper
2021-08-08 12:49:34 +08:00
之前搭 r630 试验机的时候查过,后来决定用 raid10 。。。参考过这篇文章: https://zhuanlan.zhihu.com/p/31944934
我也给个计算 raid 可靠性的网站 https://wintelguy.com/raidmttdl.pl
justaname
2021-11-24 18:32:47 +08:00
@neteroster 这个理论很明显是错误的,哪怕是没有自动坏区映射的老式硬卡,出现 URE 也只会导致重建失败而不是数据全损。RAID 条带的分布算法全部是公开的,有配置文件或者尝试出条带顺序手动也能把没有在坏区上的数据拷贝出来,最差的情况也不会比做 JBOD 或者单盘差,除非真的是两块盘全损。另外主流的软 RAID 以及硬 RAID 都不会因为出现 URE 就直接挂掉
justaname
2021-11-24 19:04:46 +08:00
@msg7086 我了解了一下,你说的第一点大部分情况下并不成立,除非有磁盘离线的情况下往里面写数据,不然如果数据损坏单盘本身自带有 CRC 校验可以指出是阵列中的哪一块硬盘出错。单盘出错但是 CRC 校验完全正常的可能性微乎其微,所以绝大部分情况下 RAID 可以 recover 出正确的数据。此外如果不依赖硬盘本身校验,理论上两个冗余位并不能恢复出错误的那个 bit ,按照矫错码理论至少需要( 2n+1 )个额外 bit 才能确保恢复 n 个 bit 的错误信息
msg7086
2021-11-25 02:55:49 +08:00
@justaname 你说反了。
「单盘出错但是 CRC 校验完全正常的可能性」极高。

首先单盘上的 ECC 是包容性的,所以 ECC 校验失败并不会上报到上层,你是感知不到的。
而且 ECC 校验失败也不会导致数据损坏,只有在错误过多导致 ECC 无法包容性修复的时候才会产生坏块。
4K 高级格式里 ECC 是每个 4K 扇区 100 字节,所以并不是只能恢复 2 bits 信息。
所以这部分是完全触碰不到 RAID 的。你不做 RAID 照样可以享受相同的待遇。

其次,RAID 要处理的通常不是单盘底层的 bitflip ,因为那些 bitflip 会被 ECC 处理掉。
RAID 要处理的是上层 bitflip ,比如数据线、PCB 、芯片部分产生的 bitflip 。
比如写入数据的时候,硬盘上的内存芯片报道出现了偏差,写盘的时候写错一个 bit 。
这种情况下 ECC 也是根据错误的数据生成的,所以这种错误就只能由 RAID 6 ,或者其他带有 Checksum 的文件系统来纠正(比如 zfs )。

然后你说的「有磁盘离线的情况下往里面写数据」这个也是经常发生的时间。
一块硬盘读到坏块然后反复尝试读取,导致超时然后被阵列踢掉,这种事情每天都在发生。

另外,奇偶+里索完全可以恢复单个 bitflip 。这方面的论文实在太多了我就不多啰嗦了。
justaname
2021-11-25 04:47:45 +08:00
@msg7086 学习了,有机会进一步了解一下这其中的运行机制
geniussoft
2021-12-28 09:46:17 +08:00
针对:"如果使用 win 磁盘阵列组了个 raid1 ,它在使用数据的时候发现两块硬盘上数据不一样,一块是 1010 ,一块是 1000 ,raid 要怎么知道哪个才是正确数据呢?"

很不幸,你发现了这个问题。

曾经大家都告诉我,RAID1 最安全,但是亲身的测试告诉我,并不是。
绝大多数系统巡检都不会确认两个盘中的数据是否一致。
因为如果出现不一致,没人知道哪个是对的...

幸运的是,群晖 + RAID1/5/6 + btrfs + 数据完整性 可以解决这个问题。
当读取文件时,会自动确认块的 CRC 是否正确。
如果不正确,会用冗余信息生成块,找到正确的块。
Felldeadbird
2022-09-14 13:39:01 +08:00
啊,学习了。我刚搞了台黑裙。我特意买了 2 个硬盘组 raid1 . 看来我陷入了误区- -。 真糟糕。还好刚弄了 100G 照片上去。切换成本不会特别高。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/794221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX