聊聊这个让腾讯云丢数据的“静默损毁”

存储 存储软件
刚看到一则新闻,说是腾讯云丢了某个客户的数据,原因是硬盘bug导致“写进去的数据读出来并不是之前写入的数据”,当然,不管具体是不是这个原因,详情如何,不做评论。本次冬瓜哥就来聊聊这个数据静默损毁(silent corruption)的一系列底层知识。

刚看到一则新闻,说是腾讯云丢了某个客户的数据,原因是硬盘bug导致“写进去的数据读出来并不是之前写入的数据”,当然,不管具体是不是这个原因,详情如何,不做评论。本次冬瓜哥就来聊聊这个数据静默损毁(silent corruption)的一系列底层知识。

[[241571]]

本文就是对静默损毁做简要总结性介绍。静默损毁大概有几种方式:

parity error  每个扇区都会有ecc校验区,硬盘写入数据之前会计算ecc,并在读出数据之后自行校验。按理说这样应该不会静默损毁?不是的。如果host端发给硬盘的数据已经是错的了,那么硬盘就不会知道。所以,人们使用DIF(Data Integrity Field)来实现上层的校验,也就是说,硬盘上位角色(比如HBA,或者应用)主动校验数据并将校验码写入另外的8字节中,随着512字节的扇区数据一起下发给硬盘。

DIF中可以完全自定义,也可以按照T10标准,DIF中放置扇区号、校验码和应用自定义信息。为何要放扇区号?这个下面再说。但是即便是有DIF,也无法保证从应用生成数据,到数据写入硬盘一整条路径上都不出错,有些厂商也在致力于从数据一生成的时候就时刻跟着校验,这个可以在应用层来透明的做。

2. paritial write。这个现象是由于硬盘在写入数据时,只写了一部分扇区数据,而另一部分没有写入。硬盘一般会保证扇区粒度的原子写,但是由于种种不可知因素,这种partial write也会发生,最终读出数据时多半会发现校验出错,从而报告。

此时上层程序可以从副本中读出正确的数据,多个副本同时出错的概率非常低。这个不属于静默损毁。在Raid系统里,一个条带没有完整被写完前就掉电了,也称为partial write,这个可以通过日志或者标记条带完整性来解决,不是什么大问题。

3. write lose。这个现象是说硬盘本该写入某个扇区,但是最终根本没有写入,目标扇区数据依然是老数据。这个现象会导致静默损毁,导致应用读出了旧数据,或者其它应用之前保存的完全不相关的数据,直接现象肯能是乱码之类。

这个问题可以通过在应用层做标记的方式解决,比如应用给每个数据块记录一个时间戳,如果发生了lose,则时间戳一定对不上,于是就可以判断出来。这些应用层标记可以记录在DIF 8字节里的应用自定义区域。除了数据库这种对一致性要求非常完备的系统,其他应用一般不会这么严格,所以一旦发生这个问题,只能事后恢复,比如从多个副本中再提起一遍数据做比对。无法做到事前预防。

4. mis-redirect write。这个现象是硬盘本应写入A扇区,却由于不可知原因写错了地方,写到其他扇区去了。这个问题的原因可能是host端传的扇区地址指针中某个或者某几个bit发生了畸变(比如SRAM中的互锁晶体管受到各种电离辐射粒子流轰击,直接导致状态改变)。

这种静默损毁的后果更严重,不但本次I/O对应的扇区没被更新,而且还破坏了其他扇区。这种损毁,也需要靠DIF中的应用自定义区段才能解决,但是这个代价太高昂,因为应用每读出一个数据块就要做DIF判断。

责任编辑:武晓燕 来源: 大话存储
相关推荐

2023-03-28 10:25:59

静默GlobalFlag进程

2020-09-12 20:59:49

腾讯云大数据

2017-04-13 16:44:15

腾讯云

2023-01-26 00:18:53

云原生数据库云资源

2022-03-04 13:44:49

CIO首席执行官首席运营官

2015-08-03 13:42:06

腾讯云游戏ChinaJoy

2018-08-14 13:47:25

华为云

2017-04-17 10:48:05

腾讯云

2015-06-05 13:09:21

2018-12-10 23:01:44

2022-08-31 08:46:55

云计算数据中心ESG

2022-08-02 20:21:00

SaaS驱动PLG

2020-09-16 12:10:17

腾讯云数据库

2023-02-10 09:34:42

人工智能驾驶

2017-06-02 08:32:01

调度服务数据

2024-03-19 08:15:09

云原生云计算容器

2016-08-25 13:47:16

腾讯云云数据库云产品

2021-04-19 16:15:35

开源开源工具
点赞
收藏

51CTO技术栈公众号