64

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

 5 years ago
source link: http://www.10tiao.com/html/148/201806/2651671869/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.


掉电分两种,一种是正常掉电,一种是异常掉电。不管是哪种原因导致的掉电,重新上电后,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 深度培训▽

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


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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK