聊聊这个让腾讯云丢数据的“静默损毁”
Posted 大话存储
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊这个让腾讯云丢数据的“静默损毁”相关的知识,希望对你有一定的参考价值。
广告:冬瓜哥新作将于2018年10月份出版,详细内容点击链接。
内容试读(根据留言要求贴出):
今早刚看到一则新闻,说是腾讯云丢了某个客户的数据,原因是硬盘bug导致“写进去的数据读出来并不是之前写入的数据”,当然,不管具体是不是这个原因,详情如何,不做评论。本次冬瓜哥就来聊聊这个数据静默损毁(silent corruption)的一系列底层知识。
在《大话存储 终极版》中,冬瓜哥其实就介绍过几种静默损毁模型,而且还详细介绍了那种损毁可以恢复数据,哪种无法恢复。具体大家可以详细阅读。
本文就是对静默损毁做简要总结性介绍。静默损毁大概有几种方式:
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字节里的应用自定义区域。除了数据库这种对一致性要求非常完备的系统,其他应用一般不会这么严格,所以一旦发生这个问题,只能事后恢复,比如从多个副本中再提起一遍数据做比对。无法做到事前预防。
本次先说这些,大家可以留言补充讨论。
广告:冬瓜哥新作将于2018年10月份出版,详细内容点击链接。
内容试读(根据留言要求贴出):
大话存储
大话计算机
以上是关于聊聊这个让腾讯云丢数据的“静默损毁”的主要内容,如果未能解决你的问题,请参考以下文章