zoukankan      html  css  js  c++  java
  • 聊聊磁盘数据的损坏

    前言


    在数据存储领域,对于管理员以及用户来说,最怕的无非就一个事情:数据损坏了(这里我们暂不考虑数据被恶意篡改写入的情况)。可能很多人也会假设正常情况下,数据自己损坏的概率应该可以低到忽略不计吧…今天笔者来简单聊聊这个被很少提及的话题,以及相关针对数据损坏,我们现有的一些修复手段和策略。

    数据的损坏的起因


    当磁盘中存储的数据有一天突然坏了,我们大部分时刻第一时间联想到的一般是一个解释起来十分模糊的原因:机器硬件老化故障,坏了。但其实这里面我们可以再进一步探究其原因本质。

    笔者查阅了相关资料,对于数据损坏,很多时候不仅仅说是机器硬件层面的原因,还有可能是系统软件的bug,所以归结起来会有以下节点原因:

    • 硬件故障
    • 位衰减(Bit rot),某个字节位进行了翻转。
    • 系统软件对于实际write写的丢失,但系统还是认为写操作成功,这个可理解是软件层面的bug。

    数据的错误诊断手段


    对应上述3种情况,下面对应的策略手段。

    如果是第一种硬件故障的情况,直接的修复方法就是硬件维修,没有特别的解决办法了,上面的数据只能靠备份冗余的数据进行恢复了。

    对于位衰减手段,其实当前的数据恢复技术(比如磁盘RAID)其实很难检测出来,不过这类型问题可以依靠ECC做检测和修复(大部分情况并不是总是)。

    对于第三类写局部丢失情况,这里面其实是一个局部数据错误的问题了。在系统层面角度而言,数据是没有问题的,所以这类问题在软件容错层面也难以被检测出来。这个只有当用户真正去读的时候,才会发现实际数据是不正确的。一般这种情况,可以依赖额外离线工具的定期checksum的检验。如若发现数据错误现象,然后对其进行修复。

    在错误数据的修复过程里,一定要确保修复行为的正确性。因为修复行为本身也是对实际数据的一种更新操作,此时一定要确保数据是往正确的方式在修复,如若修复失败,反而会造成更大程度的数据损坏。

    总而言之,让系统提前预知数据错误的代价总比直到用户读取到错误数据时的代价成本低。

  • 相关阅读:
    gitlab 拉代码提示:Your Account has been blocked. fatal: Could not read from remote repository. 最佳解决方案
    关于C语言开大数组溢出的问题
    三元组转置稀疏矩阵
    传递二维数组
    vue3下把json放哪才能获得get到
    VM下Ubuntu的nat模式连不上wifi
    C3863 不可指定数组类型“int [510]”
    PAT1005 Spell It Right
    PAT1004 Counting Leaves
    PAT1002 A+B for Polynomials
  • 原文地址:https://www.cnblogs.com/bianqi/p/12183552.html
Copyright © 2011-2022 走看看