Appearance
硬盘可靠性检测
在研究硬盘阵列的时候,我发现网上关于单奇偶校验数据重建可靠性的争论长篇累牍。有根据引经据典,怒斥单奇偶校验是 2009 年就该被消灭的技术,亦有用实际体验证实在百余 TB 的阵列上可以重建成功的
由于这些数据要么是纸上谈兵的理论分析,要么是仅有少数定性案例的简单分析。因此本人决定从实际出发,设计一个定性实验进行验证
为什么单奇偶校验磁盘阵列被认为是不可靠的
什么是 RAID5(单奇偶校验)
RAID 5 是一种储存性能、数据安全和存储成本兼顾的存储解决方案。它使用的是 Disk Striping(硬盘分割)技术。
RAID 5 使用“奇偶校验位”。与 RAID-4 一样,有效大小是 N-1 个磁盘的大小。 然而,由于奇偶校验信息也在 N 个驱动器之间均匀分布,因此避免了每次写入都必须更新奇偶校验磁盘的瓶颈。防止单个磁盘故障,而且访问速度快。
-- 摘自维基百科
奇偶校验阵列的可靠性质疑主要来自两方面
当一块硬盘损坏时,其他硬盘可能在重建中出现故障
第一个问题其实相对好解决,根据 backblaze 的数据(https://www.backblaze.com/blog/backblaze-drive-stats-for-q1-2022/)一个相对质量良好的机械硬盘的年化故障率为1.2%,而相对较差的驱动器故障率也仅为4%不到,低于谷歌所统计的8%故障率。假设阵列的重建速度为50MB/S,单个硬盘的大小为20TB,即重建时间为 20 10^12 / 50 / 2 ^ 20 约等于 4.5 天。那么一个 18 个硬盘的单奇偶校验阵列的普通磁盘重建失败概率为 18 0.08 x 4.5 / 365 约等于 1.7753%
而由于采购相同批次的硬盘或工作环境导致的硬盘先后故障的问题,我并不认为这是 RAID 阵列的问题。选择正确的型号的硬盘理论平均故障率比随机购买要低,且即使是一批硬盘普遍故障,也是在一段较长的时间内随机出现问题,而非立刻连续出现问题。而工作环境不良导致的硬盘故障……,很明显随机采购的硬盘也会出现此问题,且会直接丢失数据
硬盘在读写出现问题时,有概率会因为硬盘本身的读取故障出现数据校验不一致
而第二个问题则是真正直指单奇偶校验方案可靠性问题的根源,不可恢复读取错误(Nonrecoverable Read Errors),也可缩写为 URE。随着硬盘存储密度的增大,磁头不可避免的会读错数据,虽然硬盘内部先天性的预留了奇偶位,但是依旧会有概率出现无法正确的读取数据的问题
那么这个读取失败的概率是多少呢?一般的家用硬盘是 10^-14 位,而大容量硬盘或专门设计的企业级硬盘则是 10^-15 位。看上去这个数据距离 1TB(10^12 字节)有一定的差距,但是考虑到这是字节而不是位(1 字节=8 位)。也就是说家用硬盘理论上每读取 12.5TB 就会出现一次 URE,而企业级硬盘则是每读取 125TB 才会出现一次 URE。而四块 4T 硬盘组成的小阵列重建时就要读取约 10.92TB 的数据。理论上来说,这导致了传统的硬盘 RAID5 阵列的理论失败概率高的不可接受
冷知识:SSD 的 URE 概率仅为 10^-17,即每读取 12.5PB 数据才可能发生一次 URE
当然新型的软 RAID 技术可以自动跳过发生 URE 的这个文件而继续恢复其他的文件,硬阵列卡则理论上做不到这一点
如何检测数据出现 URE 呢?
关于 URE 的数据报告,我暂时找不到任何的可靠研究说明,因此无法确定表现形式。不过其实表现形式也就那几样,所以可以根据假设做出程度的处理
表现形式 | 应对方法 |
---|---|
读取数据出错, 系统提示错误(明显错误) | 软件记录错误情况 |
读取数据出错, 系统返回错误数据(沉默错误) | 读取数据时进行软件校验 |
读取数据出错, 磁盘默默修正错误数据,返回正确数据(硬盘沉默处理) | 定期生成 SMART 报表 |
那么,阐述一下数据校验流程吧
- 确定目标磁盘可用空间大小
- 生成数据
- 根据分块大小生成随机数据,并使用SHA512算法对数据生成一个 HASH 标签
- 以 HASH 标签为文件名将数据写入目标磁盘,并将 HASH 标签保存至本地生成记录
- 校验数据:比对本地生成记录,和目标磁盘留存的文件,验证文件 HASH 结果是否与标签一致
- 循环若干次,每次循环使用 smartctl 生成一次 smart 校验记录
以下是用到的技术复杂简要介绍,均是复制自维基百科
HASH 函数(散列函数)
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或 hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。[1]好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
如今,散列算法也被用来加密存在数据库中的密码(password)字符串,由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码。
使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做冗余校验。
SMART 技术
S.M.A.R.T.,全称为“Self-Monitoring Analysis and Reporting Technology”,即“自我监测、分析及报告技术”,是一种自动的硬盘状态检测与预警系统和规范。通过在硬盘硬件内的检测指令对硬盘的硬件如磁头、盘片、马达、电路的运行情况进行监控、记录并与厂商所设定的预设安全值进行比较,若监控情况将要或已超出预设安全值的安全范围,就可以通过主机的监控硬件或软件自动向用户作出警告并进行轻微的自动修复,以提前保障硬盘数据的安全。除一些出厂时间极早的硬盘外,现在大部分硬盘均配备该项技术。
SMART 信息对照表
测试数据
那么,测试大致需要多少?怎样的样本呢?考虑到本次测试主要针对的是家用领域长期运行的 NAS,因此挑选的测试硬盘(受害者)应为通电一万小时以上,坏道数较少的硬盘。而写入/读取数据则拟定为各 600TB,约为企业级机械 550TB 的年读写量的一倍。这样的通电时间与读写数据量应该能避免读写的数据较少导致的测试结果不具有代表性
不过有个小问题,我目前没有合适的大规模测试平台和硬件。本人的 NAS 在较小的 ITX 机箱中塞下来一个塔式散热器、6 块 3.5 寸机械、三块 2.5 寸的 U2 接口 SSD 并嵌入了一张全长全高的 PCIE 拆分卡以提供 40G 网卡和 SSD 的连接通道,可以说是把扩展性利用到了极致
因此本人只能接入一个装入移动硬盘盒内的 12 年前的老旧三星 250GB 机械进行测试。UPS 的接口连一个 3.5 寸的机械都放不下……。深切感受到了 ITX 扩展性的憋屈,目前这个 ITX 平台的折腾投入都可以组一个 24 盘位、5+2 个 PCIE4.0 插槽的二代霄龙服务器了
因此,测试数据的累积将会是缓慢的。尤其是考虑到一个 230G 的写入读取周期就要消耗一小时多一点,读写完 600TB 的数据将需要 120 天的运行时间。因此测试数据大致会分批进行统计
接下来需要去咸鱼购入二手硬件和二手
参考文章
- 外网关于 URE 的讨论 https://serverfault.com/questions/812891/what-is-exactly-an-ure
- URE 的实际讨论 https://serverfault.com/questions/812891/what-is-exactly-an-ure
- 经典文章:RAID5 在 2009 年就不行了https://www.zdnet.com/article/why-raid-5-stops-working-in-2009/
- 该作者于 2013 年的回顾 https://www.zdnet.com/article/has-raid5-stopped-working/
- 你的数据有多安全?关于 RAID 你了解多少? https://zhuanlan.zhihu.com/p/31944934
- RAID5 并不可怕,不要夸大 URE,亲历降级损毁修复 https://www.chiphell.com/forum.php?mod=viewthread&tid=2171509&ordertype=1&mobile=no
- raid5 磁盘阵列真的不安全么? https://zhihu.com/question/20164654
- Backblaze Drive Stats for Q1 2022 https://www.backblaze.com/blog/backblaze-drive-stats-for-q1-2022/