一种数据库写入ssd的方法和系统的制作方法

文档序号:6486285阅读:453来源:国知局
一种数据库写入ssd 的方法和系统的制作方法
【专利摘要】本发明公开一种数据库写入SSD的方法和系统,所述方法包括:步骤1,如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty?page要写入,SSD分配存储页,同时分配临时地址映射表,记录映射关系;步骤2,当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
【专利说明】一种数据库写入SSD的方法和系统
【技术领域】
[0001]本发明属于计算机固态硬盘(SSD)读写领域,尤其涉及一种数据库写入SSD的方法和系统。
【背景技术】
[0002]数据库中有记录(Row)被更新时,一般先将其在缓冲池(BP, Buffer Pool)中的页(Page)更新,并将这次更新记录到日志(Log file)中,这时候BP中的该Page就是被标记为Dirty。在适当的时候(BP不够、系统闲置等),这些Dirty Page会被写到磁盘上。在某个Dirty Page (例如16K)Flush的过程中,操作系统可能将这个写数据的操作分割成多个写操作,而在执行这多个写操作的过程中发生故障(断电,系统崩溃等),最终16K的数据只有8K被写到磁盘上,这种现象被称为部分写失败(partial page writes、torn pages、fractured writes等)。一旦partial page writes发生,那么在数据库恢复时就很逾尬:Logfile中虽然知道这个数据页被修改了,但是却无法知道这个页被修改到什么程度,数据的完整性遭到破坏。
[0003]InnoDB数据库存储引擎采用doublewrite技术来解决部分写失败问题。
[0004]如图1所示,Double Write的思路如下:
[0005]A.在覆盖磁盘上的数据前,先将Page的内容写入到磁盘上的其他地方(InnoDB存储引擎中的doublewrite buffer,这里的buffer不是内存空间,是磁盘上的空间)。
[0006]B.然后再将Page的内容覆盖到磁盘上原来的数据。
[0007]如果在A步骤时系统故障,数据库知道原来的数据没有被覆盖,还是完整的。
[0008]如果在B步骤时系统故障,原来的数据不完整了,但是新数据已经被完整的写入了 DoubleWrite Buffer。因此系统恢复时就可以用DoubleWrite Buffer中的新Page来覆盖这个不完整的page。
[0009]Double write显然会增加磁盘的1/0,造成性能损失。
[0010]SSD无机械结构,完全半导体化,不存在磁盘寻道时间,数据存取速度快,数据吞吐量能和IOPS能达到传统硬盘的数千倍。优异的随机性能使得SSD在数据库上的应用成为
一种趋势。
[0011]逻辑块地址(LBA)是一种描述电脑存储设备上资料所在区块地址的通用机制,一般用在像硬盘这样的辅助储存装置上。逻辑块寻址模式把硬盘所有的物理扇区的编号(PBA)通过一定的规则转变为一线性编号,在访问硬盘时由硬盘控制器内的地址翻译模块将这种逻辑地址转换为真正的物理地址。因为机械硬盘旧数据可以直接被覆盖,所以逻辑地址到物理地址的映射是固定的。我觉得除了这个原因,机械硬盘需要寻道,然后顺序读取,如果所地址映射是不断改变的,那么逻辑地址连续的空间在物理地址上变成不连续的,对机械式硬盘的性能影响很大。因为闪存(NANDFLASH)具有必须先擦除才能再次写入的工作特性(写入以页(Page),擦除则以块(Block)为单位),固态硬盘的逻辑地址到物理地址的映射是不固定的,需要经过一定规则转换,完成这个工作的转换层就叫做FTL (Flashtranslation layer)。由于FTL表的重要性,SSD 一般都对其做了掉电保护。
[0012]目前数据库应用还没有考虑到SSD独特的技术特点,只是将SSD当做高性能的普通机械式硬盘来使用,本发明提出一种方案,将数据库与SSD的新特性结合起来,提高了数据库写入的性能和安全性。

【发明内容】

[0013]本发明所要解决的是数据库写入过程中数据部分写失败的问题,从而提出一种数据库写入SSD的方法和系统。
[0014]本发明公开一种数据库写入SSD的方法,包括:
[0015]步骤I,如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty page要写入,,SSD分配存储页,同时分配临时地址映射表,记录映射关系;
[0016]步骤2,当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
[0017]所述的数据库写入SSD的方法,所述步骤I包括:
[0018]步骤21,数据库先通知SSD,此次更新的DirtyPage逻辑信息,包括逻辑地址和写入大小等;
[0019]步骤22,SSD根据Dirty Page的逻辑信息,分配临时地址映射表时,标记临时地址映射表为未生效状态;
[0020]步骤23,将dirty page中的数据分多次全部写入所分配的存储页中;
[0021]步骤24,完成所有数据与入后,SSD标记临时地址映射表为已生效。
[0022]所述的数据库写入SSD的方法,所述步骤2还包括:
[0023]步骤31,当发生异常是,查找是否存在临时地址映射表,如所述临时地址映射表的状态为未生效,逻辑地址以及全部物理地址的映射关系完整存在;
[0024]步骤32,根据所述映射关系将全部dirty page中的数据写入存储页;
[0025]所述的数据库写入SSD的方法,还包括:
[0026]步骤41,将临时地址映射表的状态标示为已生效;
[0027]步骤42,根据临时地址映射表更新FTL地址映射表,同时删除临时地址映射表。
[0028]本发明还公开一种数据库写入SSD的系统,包括:
[0029]数据写入模块,用于如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty page要写入,,SSD分配存储页,同时分配临时地址映射表,记录映射关系;
[0030]异常处理模块,用于当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
[0031]所述的数据库写入SSD的系统,所述数据写入模块包括:
[0032]临时地址映射表管理模块,用于分配临时地址映射表,并根据数据的写入状态标记临时地址映射表的生效状态;
[0033]写入模块,用于将dirty page中的数据全部写入所分配的存储页中;
[0034]所述的数据库写入SSD的系统,所述异常处理模块还包括:[0035]查找映射表模块,用于当发生异常是,查找是否存在临时地址映射表,如所述临时地址映射表的状态为未生效,逻辑地址以及全部物理地址的映射关系完整存在;
[0036]数据写入存储页模块,用于根据所述映射关系将全部dirty page中的数据写入存储页;
[0037]所述的数据库写入SSD的系统,还包括:
[0038]标注已生效模块,用于将临时地址映射表的状态标示为已生效;
[0039]删除映射表模块,用于根据临时地址映射表更新FTL地址映射表,同时删除临时地址映射表。
[0040]本发明的有益效果为:
[0041]与Doublewrite方法相比,减少了 B步骤中的拷贝I/O,而是通过更新地址映射表的方法,重新定位了物理地址。地址映射表的操作都在SSD自带的RAM中进行的,远快于Flash的I/O的速度。因此该方法在避免了数据库部分写失败(partial page write)问题的同时,大大提高数据库的性能。
【专利附图】

【附图说明】
[0042]图1为现有技术中double write写方法;
[0043]图2为本发明经过FTL转换后数据页地址示意图;
[0044]图3为本发明经过写入数据后,数据页地址示意图;
[0045]图4为本发明数据库写入流程图;
[0046]图5为本发明临时地址映射表流程图;
[0047]图6为本发明数据库写入SSD的系统流程图。
【具体实施方式】
[0048]下面给出本发明的【具体实施方式】,结合附图对本发明做出了详细描述。
[0049]为了方便区分,我们将数据库中的页(Page)称为数据页(Data Page),SSD中的最小写入单位称为存储页(Storage Page)。当数据页的数据需要写到多个存储页时,就无法保证写操作的原子性,可能产生部分写失败的问题。
[0050]我们假设一个Dirty Page需要N个存储页的存储空间,经过FTL (闪存转换层)的转换后,对应磁盘中的数据页地址如图2。
[0051]
~LBAPBA
I — I,
_2 —2,
~NN,
[0052]表中LBA代表逻辑块寻址,PBA代表(Physical Block Addressing)就是物理块地址,代表了数据存储在SSD中的实际物理位置。
[0053]当Dirty Page需要写入SSD时,数据库先通知SSD,此次更新的DirtyPage逻辑信息,包括逻辑地址和写入大小等,SSD为此DirtyPage分配N个全新的存储页,存储页的逻辑地址是连续的,但并不立刻修改FTL地址映射表,而是分配一个临时地址映射表T,并标记临时地址映射表T的状态为未生效,记录下存储页的逻辑地址,老的物理地址及新的物理地址之间的映射关系。
[0054]所述的老物理地址为这次写入之前,要写入的逻辑地址和物理地址已经有映射关系,所以称为老物理地址。这次写入时,因为分配了新的存储页,既分配了新的物理地址,所以称为新物理地址。临时地址映射表T与FTL位于SSD中拥有掉电保护的RAM空间。DirtyPage需要多个存储页来存储,存储页就是SSD上的存储单元,有物理地址,但数据库看到的只是逻辑地址,当数据库需要读写取一个数据时,只是将逻辑地址发送给SSD,SSD就必须通过保存的逻辑地址到物理地址的映射,找到数据在SSD上的实际物理位置,才能操作数据。SSD保存着存储页的物理地址到逻辑地址的映射关系,映射关系改变时,逻辑地址也变了。
[0055]
LBAPBA1 ~PBA2
1I’ I+
22,_ 2+
NI N,I N+
[0056]PBAl是指目前的物理区块地址,PBA2是指新分配的物理区块地址。
[0057]然后将Dirty Page (已更新页)中的数据分多次全部写到SSD新分配的存储页,此步骤相当于Doublewrite中的A步骤。
[0058]如图3所示,在此过程中如果发生系统异常,例如掉电,老数据与老的映射关系依然是完整的,而新的临时地址映射表状态为未生效,不会出现部分写失败的问题。
[0059]只有当所有的Dirty Page都先写入到新的存储页中后,立刻将映射表T的状态标示为已生效,然后开始利用临时地址映射表T更新真正的FTL地址映射表。
[0060]
LBAPBA
I~~
_2 ~~2+
~NN+
[0061]
[0062]如图4所示,整个过程如下:
[0063]S400,数据库通知SSD要写入的dirty Page的逻辑信息;
[0064]S401,分配临时地址映射表,状态设置为未生效;
[0065]S402,分配新的存储页,并在临时地址映射表中记录逻辑地址,旧物理地址与新物理地址的映射关系;
[0066]S403,将dirty page分多次全部写入新的存储页;
[0067]S404,将临时地址映射表的状态修改为已生效;
[0068]S405,根据临时地址映射表更新FTL地址映射表;
[0069]S406,删除临时地址映射表。
[0070]在此过程中,如果系统发生系统异常,重新上电后,SSD依然可以根据保存的已生效的临时地址映射表T完成对FTL地址映射表的更新,同样不会出现部分写失败。
[0071]如图5所示,临时地址映射表的工作步骤为:[0072]S501,发生异常后重新启动;
[0073]S502,查找是否有临时地址映射表,如果有临时地址映射表执行步骤S503,如果没有则执行S506 ;
[0074]S503,临时地址映射表状态是否已生效,如果已生效则执行S504,如果未生效则执行 S506 ;
[0075]S504,利用临时地址映射表更新FTL地址映射表;
[0076]S505,删除临时地址映射表;
[0077]S506,完成启动。
[0078]如图6所示,本发明还公开一种数据库写入SSD的系统,包括:
[0079]数据写入模块10,用于如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty page要写入,,SSD分配存储页,同时分配临时地址映射表,记录映射关系;
[0080]异常处理模块20,用于当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
[0081]所述的数据库写入SSD的系统,所述数据写入模块包括:
[0082]临时地址映射表管理模块,用于分配临时地址映射表,并根据数据的写入状态标记临时地址映射表的生效状态;
[0083]写入模块,用于将dirty page中的数据全部写入所分配的存储页中;
[0084]所述的数据库写入SSD的系统,所述异常处理模块还包括:
[0085]查找映射表模块,用于当发生异常是,查找是否存在临时地址映射表,如所述临时地址映射表的状态为未生效,逻辑地址以及全部物理地址的映射关系完整存在;
[0086]数据写入存储页模块,用于根据所述映射关系将全部dirty page中的数据写入存储页;
[0087]所述的数据库写入SSD的系统,还包括:
[0088]标注已生效模块,用于将临时地址映射表的状态标示为已生效;
[0089]删除映射表模块,用于根据临时地址映射表更新FTL地址映射表,同时删除临时地址映射表。
[0090]与Doublewrite方法相比,减少了 B步骤中的拷贝I/O,而是通过更新地址映射表的方法,重定向了物理地址。地址映射表的操作都在SSD自带的RAM中进行的,远快于Flash的I/O的速度。因此此方法在避免了数据库部分写失败(partial page write)问题的同时,大大提高数据库的性能。
[0091]UDirty Page写入SSD时,分配新的存储页,同时分配一个临时的映射表,临时地址映射表状态为未生效,将逻辑地址,旧物理地址与新物理地址的映射关系保存,而不立刻更新FTL地址映射表。
[0092]2,Dirty Page的数据全部都写入到新的存储页后,标示临时地址映射表的状态为已生效,再用临时地址映射表更新FTL地址映射表,不用拷贝数据。
[0093]3、整个过程中,任何时间失败,硬盘中的数据都可以回到原始状态或者更新到最新状态。
[0094]本领域的技术人员在不脱离权利要求书确定的本发明的精神和范围的条件下,还可以对以上内容进行各种各样的修改。因此本发明的范围并不仅限于以上的说明,而是由权利要求书的范围来确定的。
【权利要求】
1.一种数据库写入SSD的方法,其特征在于,包括: 步骤1,如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty page要写入,,SSD分配存储页,同时分配临时地址映射表,记录映身寸关系; 步骤2,当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
2.如权利要求1所述的数据库写入SSD的方法,其特征在于,所述步骤I包括: 步骤21,数据库先通知SSD,此次更新的DirtyPage逻辑信息,包括逻辑地址和写入大小等; 步骤22,SSD根据Dirty Page的逻辑信息,分配临时地址映射表时,标记临时地址映射表为未生效状态; 步骤23 Jfdirty page中的数据分多次全部写入所分配的存储页中; 步骤24,完成所有数据写入后,SSD标记临时地址映射表为已生效。
3.如权利要求1所述的数据库写入SSD的方法,其特征在于,所述步骤2还包括: 步骤31,当发生异常是,查找是否存在临时地址映射表,如所述临时地址映射表的状态为未生效,逻辑地址以及全部物理地址的映射关系完整存在; 步骤32,根据所述映射关系将全部dirty page中的数据写入存储页。
4.如权利要求2、3任一`所述的数据库写入SSD的方法,其特征在于,还包括: 步骤41,将临时地址映射表的状态标示为已生效; 步骤42,根据临时地址映射表更新FTL地址映射表,同时删除临时地址映射表。
5.一种数据库写入SSD的系统,其特征在于,包括: 数据写入模块,用于如果dirtyPage的写入无法在一次I/O中完成,即写入操作不具有原子性时,数据库通知SSD有dirty page要写入,,SSD分配存储页,同时分配临时地址映射表,记录映射关系; 异常处理模块,用于当发生异常时,根据临时地址映射表的状态更新FTL地址映射表,完成SSD写入操作。
6.如权利要求5所述的数据库写入SSD的系统,其特征在于,所述数据写入模块包括: 临时地址映射表管理模块,用于分配临时地址映射表,并根据数据的写入状态标记临时地址映射表的生效状态; 写入模块,用于将dirty page中的数据全部写入所分配的存储页中。
7.如权利要求5所述的数据库写入SSD的系统,其特征在于,所述异常处理模块还包括: 查找映射表模块,用于当发生异常是,查找是否存在临时地址映射表,如所述临时地址映射表的状态为未生效,逻辑地址以及全部物理地址的映射关系完整存在; 数据写入存储页模块,用于根据所述映射关系将全部dirty page中的数据写入存储页。
8.如权利要求6、7任一所述的数据库写入SSD的系统,其特征在于,还包括: 标注已生效模块,用于将临时地址映射表的状态标示为已生效; 删除映射表模块,用于根据临时地址映射表更新FTL地址映射表,同时删除临时地址映射 表。
【文档编号】G06F12/02GK103514095SQ201210201535
【公开日】2014年1月15日 申请日期:2012年6月18日 优先权日:2012年6月18日
【发明者】夏君扬 申请人:记忆科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1