固态硬盘掉电怎么恢复数据

冬瓜哥 高效运维 2018-06-08


掉电分两种,一种是正常掉电,一种是异常掉电。不管是哪种原因导致的掉电,重新上电后,SSD 都需要能从掉电中恢复过来,继续正常的工作。

先说正常掉电。在掉电前,主机会通过命令通知SSD,比如SATA中的IdleImmediately,SSD收到该命令后,主要会做以下事情:

  • 把buffer中缓存的用户数据刷入到闪存;

  • 把映射表刷入到闪存;

  • 把闪存的块信息写入到闪存(比如当前写的是哪个闪存块,以及写到该闪存块的哪个位置,哪些闪存块已经写过,哪些闪存块又是无效的,等等);

  • 把SSD其它信息写入到闪存。

主机等SSD处理完以上事情后,才会真正停止对SSD的供电。正常掉电不会导致数据的丢失,重新上电后,SSD只需把掉电前保存的相关信息(比如映射数据,闪存块信息等等)重新加载,又能接着掉电前的状态继续工作。

如果SSD世界只存在正常掉电,那么SSD的实现就会简单很多。可是,正如歌里唱的那样:

没有一点点防备

也没有一丝顾虑

你就这样出现在我的世界里

带给我惊喜

情不自已

突如其来的掉电,对SSD来说,没有“喜”,只有“惊”。

所谓的异常掉电,就是SSD在没有收到主机的掉电通知,就被断电;或者收到主机的掉电通知,但还没有来得及处理上面提到的那些事情,就被断电了。异常掉电可能会导致数据的丢失,比如缓存在主机中的数据来不及写到闪存,掉电导致这部分数据丢失;还有,根据闪存特性,如果掉电发生在写MLC的Upper page,会导致其对应的Lower Page数据遭到破坏,也就是意味着之前写入闪存的数据也可能由于异常掉电导致丢失。异常掉电恢复的目的一方面是尽可能恢复用户数据,把损失减到最低;另一方面是让SSD经历异常掉电后还能正常工作。

SSD为什么怕异常掉电?它不是用闪存做存储介质吗?它不是数据掉电不丢失吗?没错。不过,一个SSD,除了数据掉电不丢失的闪存,还需要有掉电数据丢失的RAM,SRAM或者DRAM。闪存的作用是存储数据,而RAM主要是SSD工作时用以缓存用户数据和存放映射表 (Map Table,逻辑地址映射闪存物理地址)。所以一旦掉电,RAM的数据就会丢失。

为防止异常掉电数据丢失,一个简单的设计就是在SSD上面放电容,SSD一旦检测到掉电,就让电容开始放电,然后把RAM中的数据刷到闪存上面去,从而避免数据丢失。企业级的SSD一般都带有电容。带电容的SSD,还是需要设计异常掉电处理模块,因为电容不能100%保证SSD在掉电前把所有的信息刷入闪存。

还有一个比较前卫的想法,就是把RAM这种Volatile(掉电数据丢失)的东西,用Non-Volatile(掉电数据不丢失)的东西来替代,但要求这种Non-volatile的东西性能上接近RAM。

这样,整个SSD都是Non-volatile的了,妈妈再也不用担心我的SSD异常掉电了。Intel和Micron合作开发的3D XPoint,可能作为一个选择。3D XPoint兼有闪存掉电数据不丢失性和内存快速访问的特点。

RAM中缓存的用户数据,主机自认为把它们写到SSD了(非FUA命令,数据写到缓存,SSD就返回状态给主机),但SSD只是把它们缓存在RAM中,并没有写到闪存。异常掉电时,如果SSD上没有使用电容,也没有使用其它黑科技,这部分数据是损失无疑。重上电时,主机是再也读不到这些数据了。

掉电还会导致RAM中映射表丢失。映射表数据很重要,对一个逻辑地址,如果SSD查找不到对应的物理地址,它就无法从闪存上读取数据返回给主机;如果映射表中的数据不是最新的,旧的物理地址对应着老的数据,SSD就会错误的把老数据返回给主机。这个问题就严重了。

假设冬瓜哥原账户上有10块钱,最近存入100万,但由于异常掉电导致银行没有把100万写入到数据库,下次冬瓜哥到ATM上一看,怎么还是10块钱,冬瓜哥当场就晕了!异常掉电害死人啊。

但是,和RAM中用户数据丢失不同,RAM中映射表数据是可以有办法恢复过来的。SSD的异常掉电恢复主要就是映射表的恢复重建。

那么,怎么重建映射表呢?下面介绍一种重构策略(不同的SSD重构策略略有不同,但大同小异)。 SSD在写用户数据到闪存的时候,会额外的打包一些数据,我们叫它元数据(Meta Data),它记录着该笔用户数据的相关信息,比如该笔数据对应的逻辑地址,数据写入时间(时间戳)等等。


图1-1 元数据内容示例

因此,用户数据在闪存中是像下面一样子存储的:

图1-2 元数据和用户数据存储示例

以上图为例,如果我们读取物理地址Pa x,就能读取到元数据 x和用户数据 x,而元数据是有逻辑地址La x的,因此,我们就能获得映射: La -→Pa x。 映射表的恢复原理其实很简单,只要全盘扫描整个闪存空间,就能获得所有的映射关系,最终完成整个映射表的重构。

原理简单,但实现起来还有一些问题需要考虑,比如如何解决数据新旧问题,重构速度问题等等。

同一逻辑地址,用户可能写过若干次,在闪存空间,该逻辑地址对应的数据有很多是旧数据,只有一笔是新数据,那么如何甄别哪些数据是旧的,哪个数据是最新的呢?如何让逻辑地址映射到最新数据所在的物理地址呢?以上图为例,SSD起初把逻辑地址La 2的数据写在物理地址Pa 2上;后面,用户又改写了那笔数据,SSD把它写到了物理地址Pa 8上。我们知道,用户最后写入的数据总是最新的。在这里,时间戳(TS,Timestamp)帮上大忙了,哪个值大,就表示哪个是最后写入的。SSD可以依赖Meta data中的时间戳来区分新旧数据的。图4-42中,在全盘扫描时,假设扫描顺序是从物理地址Pa 1到物理地址Pa x,对逻辑地址La 2来说,开始会产生映射La →Pa 2, 但扫描到Pa 8时,发现时间戳比之前的更新,于是新的映射取代旧的映射,最后得到映射关系:La →Pa 8。

全盘扫描有一个问题,就是映射表恢复很慢,所耗的时间与SSD容量成正比。现在SSD容量都到TB级别,全盘扫描映射方式,重构映射表需要花费几分钟甚至几十分钟,这在实际使用中,用户是不能接受的。那SSD内部怎么快速恢复映射表呢?

一种办法就是SSD定期的把SSD中RAM的数据(包括映射表和缓存的用户数据)和SSD相关的状态信息(诸如闪存块擦写次数,闪存块读次数,闪存块其它信息等等)写入到闪存中去,与正常掉电前SSD要做的事情类似,这个操作我们称之为做Checkpoint(检查点,但我觉得翻译成“快照”更合适点)。如下图所示。


图1-3 定期给SSD拍照

假设上图中,在做完快照C后,做下一个快照D之前,SSD在X处发生了异常掉电:

图1-4 异常掉电发生在快照C后

重上电,SSD可以从闪存中读取到最新的快照信息,即快照C。由于异常掉电,从快照C处到X处新产生的映射关系丢失。由于之前绝大多数的映射关系都被快照C保存,因此需要重建的映射关系仅仅是快照C之后产生的映射关系,这部分关系的恢复,仅需扫描一些局部的物理空间,因此,相对全盘扫描,映射表重建速度大大加快。

长按下面二维码进入链接抢鲜预订纸质书作者签名版+电子版,一次付款得两样冬瓜哥也会在本公众号陆续以各种方式赠送10本书,相关活动请持续关注本公众号后期推送。 

6月运维人什么地最值得去?

当然是6月30日的AIOps 企业峰会了!

AIES 是国内外首个 AIOps 技术峰会,同时也是 AIOps 标准的指定官方平台,还有腾讯的 AIOps 企业级深度培训。

AIES 共邀国内外技术专家与您畅谈AIOps 体系与方法、过程与实践、工具与技术,为您呈现国内外顶级企业的 AIOps 实践经验与工具技术。

大会海报▽

腾讯 AIOps 深度培训▽

点击大会二维码,速速关注


更多详情,请点击阅读原文⬇️

    本站仅按申请收录文章,版权归原作者所有
    如若侵权,请联系本站删除
    觉得不错,分享给更多人看到