存储器的读写控制方法及对应的存储器与流程

文档序号:11806984阅读:500来源:国知局
存储器的读写控制方法及对应的存储器与流程
本发明涉及数据存储技术领域,尤其涉及一种存储器的读写控制方法及对应的存储器和服务器。

背景技术:
目前的数据存储技术中,通常在存储器中以块(Block)为单位对存储资源进行划分。也就是说:将存储器按固定大小区分为多个区域,每一个区域,称为一个块。在现有存储器中分为两种块:一种块叫做基本块,用来进行哈希(Hash)计算定位使用,以方便数据的定位;另一种块叫做溢出块,用于在基本块不够用时,存储溢出部分的数据。现有技术中,数据在存储器中存储,是以数据的关键字(Key)进行Hash计算后再取模,得到一个存储器的块偏移量,在存储器的该偏移量处的块直接写入数据;如果发现该偏移量处的块已经有了数据,则需要读取出来,把新数据和老数据打包在一起再次写入该块。如果指定偏移量处的块已经存储满了,则把还未写入的数据添加到溢出块,并在该偏移量处的块的尾部保存溢出块地址。图1为现有技术的一种存储器读写控制的示意图。参见图1,如果一个数据的Key经过Hash计算并取模后的值为3,则把该数据存储在存储器的基本块中的第3块中,并没有任何索引信息;读取该数据时,也是相同的定位流程,即对该数据的Key经过Hash计算并取模后的值为3,则到存储器的基本块的第3个块把所有数据读取出来,然后解码,得到该Key对应的数据。如果该第3块原来就有数据,那么在写入此Key对应数据的时候,先把原来的数据读出来,将新旧数据合并(编码)后,再一起写入该第3块。图2为现有技术的一种存储器读写控制时使用溢出块的示意图。参见图2,当向存储器的基础块的所述第3块写数据后,该第3块被写满、但当前数据还没有写完的时候,则找到一个空闲的溢出块,将剩余的数据写入该空闲的溢出块中,并在所述基础块的第3块的尾部保存所写的溢出块的地址。在读取数据时,先读取所述基础快中第3块的数据,然后判断读取出的数据是否完整,如果不完整则根据块尾部的溢出块地址去对应的溢出块读取出数据。现有技术的缺点如下:写数据时,每写一个数据都需要对存储器进行至少一次输入/输出(I/O)操作,在原块中有数据时还需要读一次,以便合并老数据写入,这样会造成更多的I/O操作。因此,现有技术对存储器进行写数据时的I/O操作次数比较多,存储器的写操作效率很差。现有技术尤其是对于固态硬盘(SSD,solidstatedisk)这种寿命受限于擦除数、随机写对性能和寿命都有影响的存储器,支持得不好,导致写数据时过多的I/O操作不但导致SSD写操作效率很差,而且严重影响了SSD的寿命。

技术实现要素:
有鉴于此,本发明的主要目的在于提供一种存储器的读写控制方法及对应的存储器和服务器,在对存储器实现读写控制的同时,降低写数据时对存储器的I/O操作次数,提高对存储器的写操作效率。本发明的技术方案是这样实现的:一种存储器的读写控制方法,包括:将存储器的存储资源以块为单位进行划分;写入数据时:将要写入的数据合并成数据块,将所述数据块写入存储器的空闲块中,记录所写数据的标识及其对应的索引信息,每条所写数据的索引信息为该数据在存储器中的偏移量信息;读取数据时:按照欲读数据的标识和索引信息从存储器的相应偏移量处读取数据;其中,所述该数据在存储器中的偏移量信息包括:该数据在所述数据块中的偏移量信息和所述数据块在存储器中的偏移量信息,或者所述数据块中该数据所在的页在存储器中的偏移量信息、且所述页中记录该数据在该页中的偏移量。一种存储器,该存储器的存储资源以块为单位进行了划分;并包括:写入控制模块,用于将要写入的数据合并成数据块,将所述数据块写入存储器的空闲块中,记录所写数据的标识及其对应的索引信息,每条所写数据的索引信息为该数据在存储器中的偏移量信息;读取控制模块,用于按照欲读数据的标识和索引信息从存储器的相应偏移量处读取数据;其中,所述该数据在存储器中的偏移量信息包括:该数据在所述数据块中的偏移量信息和所述合并后数据块在存储器中的偏移量信息,或者所述数据块中该数据所在的页在存储器中的偏移量信息、且所述页中记录该数据在该页中的偏移量。一种服务器,其包括至少一个上述的存储器。在所述存储器的数量为两个以上时,所述将数据块写入存储器的空闲块中具体为:从第一个存储器的第一个块起,遍历所有存储器的第一个块,如果没有找到空闲块则遍历所有存储器的下一个块,直到出现空闲块为止,将所属合并后的数据库写入该空闲块中。本发明在写入数据时,先将一个以上的数据合并成数据块,再将合并的数据块写入存储器的空闲块,将所写数据所在的块及在该块中的偏移量信息作为该数据的索引信息进行记录,在读取数据时根据欲读数据的索引信息从存储器中对应的块和块中的偏移量处读取数据。因此本发明首先可以实现对存储器进行读写控制;同时与现有技术相比,本发明在写数据时不必每个数据都要对存储器进行一次I/O操作,而是将多个数据合并后统一进行一次I/O操作写入存储器,因此本发明降低了写数据时对存储器的I/O操作次数,提升了对存储器的写操作效率。所述对存储器的I/O操作次数可以用每秒进行读写(I/O)操作的次数(I/OPS,Input/OutputOperatI/OnsPerSecond)衡量,本发明可以大大降低写数据时的I/OPS,提高了存储器的写数据效率。本发明尤其适用于SSD这种寿命受限于擦除数、随机写对性能和寿命都有影响的存储器,由于写数据时I/O操作次数大大减少,不但提高了SSD写操作的效率,而且延长了SSD的寿命。附图说明图1为现有技术的一种存储器读写控制的示意图;图2为现有技术的一种存储器读写控制时使用溢出块的示意图;图3为本发明所述存储器读写控制方法的一种示意图;图4为本发明所述的存储器的一种组成示意图;图5为本发明的以块和页为单位划分存储器存储资源的一种示意图;图6为本发明所述将要写入的数据依次合并写入内存块的各个页中的具体流程图;图7为经过图6所述流程处理后的一种内存块内各页数据分布图;图8为一种索引信息的示意图;图9为存储器的数量为一个以上时查询空闲块并写入合并数据块的一种示意图;图10为一种对空洞进行数据紧凑处理的示意图。具体实施方式下面结合附图及具体实施例对本发明再作进一步详细的说明。图3为本发明所述存储器读写控制方法的一种示意图。参见图3,本发明的方法将存储器的存储资源以块(如图中的blk)为单位进行划分,以方便索引数据;写入数据时:将要写入的数据合并成数据块,将所述合并后的数据块写入存储器的空闲块中,记录所写数据的标识及其对应的索引信息,每条所写数据的索引信息为该数据在存储器中的偏移量信息;读取数据时:按照欲读数据的标识和索引信息从存储器的相应偏移量处读取数据。数据的标识通常为数据的key,即该数据在存储中的唯一标识信息,例如数据的标识对应为某个人在某个时刻发表的一条信息,查找这条信息时,通过这个数据的标识就可以找到数据在存储器中的索引信息(偏移信息),进而通过索引信息找到该条信息。图4为本发明所述的存储器的一种组成示意图,该存储器可以执行本发明所述的方法。参见图4,该存储器的存储资源以块为单位进行了划分;并包括:写入控制模块,用于将要写入的数据合并成数据块,将所述合并后的数据块写入存储器的空闲块中,记录所写数据的标识及其对应的索引信息,每条所写数据的索引信息为该数据在存储器中的偏移量信息;读取控制模块,用于按照欲读数据的标识和索引信息从存储器的相应偏移量处读取数据。本发明所述的方法和存储器中,各条数据的索引信息可以为:该数据所属块在存储器中的偏移量信息(如第几个块)。在读取数据时,可以按照数据的标识从索引信息中查询到该数据所属块在存储器中的偏移量,从该偏移量处读取出该块的所有内容,再根据所述数据的标识从该块的内容中读取出对应的数据。本发明也可以在写数据时进一步确定所写数据在所述合并后的数据块中的偏移量信息。各条数据的索引信息也可以是:该数据所属块在存储器中的偏移量、以及该数据在该块中的偏移量。在读取数据时,可以按照数据的标识和索引信息,根据该数据所属块在存储器中的偏移量信息、以及该数据在该块中的偏移量就可以确定出该数据在存储器中的绝对偏移量,从该绝对偏移量即从该数据所属块的相应偏移量处读取出对应的数据。这样在读取数据时就可以不必读取出整块的数据,只需要读取出所要读的数据即可。本发明所述的方法和存储器中,所述存储器中的块可以用细粒度更小的页为单位进行进一步的划分。并且,在写数据时,所述写入控制模块进一步在合并所述数据块时以页为单位对所述数据块进行划分;所述块及数据块的大小为所述页的大小的整数倍。在写入数据时在该数据所属页中记录该数据在该页中的偏移量;该数据的索引信息可以为:该数据所属页在存储器中的偏移量信息。在一种实施例中,该数据所属页在存储器中的偏移量信息可以直接由在存储器中的绝对偏移量来表示,即该页的页号在本存储器中是唯一的,从第一个块的第一个页开始依次排列下来,直到所有块的所有页都有一个唯一的页号;在另一种实施例中,该数据所属页在存储器中的偏移量信息也可以由该数据所属块在存储器中的偏移量和所属页在该所属块内的相对偏移量共同来表示。在读数据时,具体为:根据欲读数据的标识和索引信息从存储器中读取该数据所属页的内容,从该页中读取该数据在该页的偏移量信息,根据该偏移量信息从该页中读取数据。同上,一种实施例中可以直接按照该所属页在存储器内的绝对偏移量来读取该数据所属页的内容;另一种实施例中可以按照该数据所属块在存储器中的偏移量和所属页在该所属块内的相对偏移量,来读取该数据所属页的内容。在一种具体实施方案中,所述存储器中所划分的各个块的大小相同,所述合并的数据块大小和存储器中所划分的块的大小相同。这样可以是处理操作更为简洁。由于本发明进一步用比块更小细粒度的“页”对块进行划分,写数据时将所写数据所在的块及在该块中的页的偏移量信息作为索引信息,在读数据时,根据索引信息读取对应块的对应页的数据,从页中读取中所要的数据。因此本实施例在读数据时,不必读取整块的数据,而只读取一页的数据即可,实现了小粒度读取,减少不必要的数据读取,降低读数据时的数据吞吐量,进一步提升了存储器的读数据的效率。本发明所划分的块的大小在不同的实施例中可以不同。图5为本发明的以块和页为单位划分存储器存储资源的一种示意图。该图5是一种适用于SSD的实施例,在该实施例中,根据SSD以512K为擦除单元,4K为读取单元的特性,将SSD划分为512K为一个块存储,整个磁盘的块数=磁盘大小/512K。在块内以4K为一个页,将一个块划分为128个页。需要说明的是,本发明并不限定在SSD存储器,其它存储器也适用。本发明所述在写入数据时,将要写入的数据合并成数据块的一种具体实施方式可以为:在内存中分配内存块,以页为单位对该内存块进行划分,将要写入的数据依次合并写入该内存块的各个页中,从而合并成数据块。图6为本发明所述将要写入的数据依次合并写入内存块的各个页中的具体流程图。假如存储器中一个块的大小为512K,内存块的大小也是512K,一个页的大小为4K。假设当前有一部分数据源(小于512K,每个数据都由key来区分)需要写入存储器,则将欲写入的数据组织成一个块,写入存储器,块内以页组织。具体是从内存块的第一页开始,依次遍历所述内存块中的各个页,对于每一个当前页,执行图6所示的流程,具体包括:步骤601、判断当前是否有要写入数据的当前残留数据,该当前残留数据的定义请见步骤603和步骤608,如果是,则执行步骤602,否则执行步骤604;步骤602、判断当前残留数据能否全部写入当前页,如果能则执行步骤604;否则执行步骤603;步骤603、将当前残留数据写入当前页,直至写满当前页,将未写入的数据作为新的当前残留数据,之后执行步骤609;步骤604、判断数据源中是否还有未写入的数据,如果是则执行步骤605,否则执行步骤608;步骤605、从数据源中读取下一个未写入的数据;步骤606、判断该下一数据能否全部写入当前页,如果能则返回步骤604,否则执行步骤607;步骤607、确定从数据源中所读的数据的key、大小、所读数据在当前页中的偏移量、以及所读数据的数量,将这些确定出的信息记录在当前页的头部,并确定各数据所属页在该内存块中的偏移量(即该内存块中的第几个页),供从存储器中读取数据时对数据进行定位;步骤608、将所述当前残留数据和从数据源读取的数据依次写入当前页,直到当前页满,未写入的数据作为新的当前的残留数据;步骤609、判断当前页是否为最后一页,如果是则结束本流程,否则将下一页作为当前页,返回步骤601。通过上述图6的处理,本发明可以把批量的数据存入一个块中,每一页都保存了本页数据的Key。同一个数据是在相邻的页存储,这样做的好处是,一个数据跨页时,操作系统有预读功能,可以把后面的页一起读到并缓存,可大大提升读数据的性能。图7为经过图6所述流程处理后的一种内存块内各页数据分布图。参见图7,同一块数据,有可能在一个页中;同一个页,有可能存有多个数据;也有可能一个数据横跨多个页,但是同一数据在块内是连接的,分配连续页。如果要写入存储器的数据源大于512K,则将剩余的数据重新组织成一个块,写入存储器,块内以页组织。每一页的执行流程如图6所述。要写入的数据经过上述处理,在内存中组织合并成了数据块,之后需要从存储器中查找出一个空闲块,将合并后的数据块写入该空闲块中。本发明中,需要标识存储器中的每个块的使用状态,用于识别是空闲块还是已使用的块(简称已用块)。存储器在划分块后的初始状态时,每个块的使用状态都设置为空闲块,当向一个块中写入数据后,则该块的使用状态被设置为已用块。在一种具体实施例中,本发明可以开辟一块内存,专门用来保存每个块的使用状态信息,其中包括每个块在存储器中的偏移量(例如是第几个块)以及标识位,如该块已使用,则其标识位为1,否则为0(即为空闲块)。通常对于一块1T空间的存储器,如果每个块为512K,则大约可以划分200W个块,即2M*512K=1T。这2M个块,仅需2M*1bit=250K的内存即可。在向存储器写入所述在内存中合并后的数据块之前,需要在内存中查询所述块的使用状态信息。具体的查询方式可以依次查询,也可以以其它策略查询。当查询到一个空闲块时,则将所述在内存中合并的数据块写入该空闲块,之后将该空闲块的使用状态信息中的标识位设置为1,表示该块为已用块。在向存储器的空闲块写入所述合并后的数据块后,则将所写数据(即所述合并后的数据块中的各个数据,每个数据都通过key区分)所在的块的偏移量(即该数据块所写入的空闲块在存储器中为第几个块)、以及该数据在该块中的偏移量信息作为所写数据的索引信息进行记录。所述该数据在该块中的偏移量信息具体为:该数据所属的页在该块中的偏移量信息(如步骤607所述)。每个数据的索引信息可以保存在内存中,用于指示该数据在存储器中的位置。在一种具体实施例中,所述索引信息为一个整数(Int类型,4字节),用于指示当前数据所在的页号。如图8所示为一种索引信息的示意图。参见图8,一个数据的索引信息与该数据的key具有对应关系,可以通过数据的key查找到该数据的索引信息、所述索引信息可以是该数据所属页在存储器中的绝对页号,即该页的页号在本存储器中是唯一的,从第一个块的第一个页开始依次排列下来,直到所有块的所有页都有一个唯一的页号;所述索引信息也可以是该数据所属块的号码(即偏移量)以及该数据所属页在该所属块中的相对页号(即块中的相对偏移量)。在读取某个数据时,根据该数据的key查询对应的索引信息,查找索引信息即可知道该数据所属页在存储器中的偏移量(如页号),然后根据该数据所属页的页号从存储器中读取出该页的内容,如步骤607所述,该页的头部记录了本页中所记录的数据的key、大小、该数据在当前页中的偏移量、以及所读数据的数量,根据该数据的key找到该数据在该页的偏移量,从偏移量处开始按照该数据的大小读取相应大小的数据。如果根据该数据的大小判断出当前页没有完全记载该数据,则自动从下一页读取出剩余的数据。上述记录在内存中的信息,如索引信息以及上述存储器每个块的使用状态信息,都可以使用目前的binlog技术定期、以及关闭数据处理系统前保存到存储器中,当数据处理系统重启后,从存储器的对应位置重新读取这些索引信息和每个块的使用状态信息到内存中,以供存储器的读写控制使用。本发明中所述存储器的数量有可能为两个以上,例如有些存储器的存储资源中可以划分出一个以上的逻辑磁盘,每个逻辑磁盘都可以看成一个存储器,其内部的存储资源都以所述块和所述页为单位进行划分。图9为存储器的数量为一个以上时查询空闲块并写入合并数据块的一种示意图。参见图9,在存储器的数量为一个以上时(例如图中有多个磁盘,每个磁盘可以看成一个存储器),所述将合并后的数据块写入存储器的空闲块中的具体方式可以为:从第一个存储器的第一个块起,遍历所有存储器的第一个块,如果没有找到空闲块则遍历所有存储器的下一个块,直到出现空闲块为止,将所述合并后的数据块写入该空闲块中。即所有存储器的空闲块的写入是顺序均衡的。下次向存储器中写入数据块时从上一次返回空闲块的位置开始遍历查找新的空闲块;当然如果进行过数据紧凑处理的话,由于有可能空出新的空闲块,因此下一次向存储器中写入数据块时从头开始遍历查找新的空闲块。由于在写入时在存储器中顺序均衡地选择空闲块写入,从而不存在一块存储器一直忙,或者一直闲的状态,可以均衡分配存储器的写入资源。在现有技术中,还存在一种覆盖写入的问题,也就是说,中途发生掉电,有可能只覆盖了部分数据,不能保证数据完整性。这时这个区域,以及对应的溢出块,全不能正确访问。针对这个问题,本发明如果在写数据时只是对原有数据的更新修改,而不是新增数据时,可以将新数据与其他待写入数据合并成数据块,将数据块写入存储器的新的空闲块中,并更新该数据的索引信息。在读取该数据时,按照该数据的key查询所述更新后的索引信息,找到新数据的存储位置,从该位置读取该最新的数据。比如原来的标识为key1的数据在Blk1中,此时要更新该key1的数据,本发明会把这个数据组装到512K写到Blk2中,与原来数据无关,此时也不用关心数据原来的位置,直接把key1的索引信息更新,指示此块数据现在的位置是在Blk2中。这样就解决了现有技术中数据覆盖写带来的问题。因为本发明在更新数据时,将新数据与其他待写入数据合并成数据块,将数据块写入存储器的新的空闲块中,并更新该数据的索引。这样操作的优点在于:如果此数据是热点数据,一直不停地更新,现有技术会将存储器的同一位置一直读取写入,有可能将存储器写坏,导致存储器中的一整块数据都不可用,而本发明则每次更新数据时都会变更该数据在存储器中的位置,避免在同一位置的频繁读写操作对存储器的损坏;同时,如果在更新数据时写到一半断电的话,现有技术是在同一位置覆盖写入,覆盖到一半断电则将原数据也销毁了,而本发明在更新数据是将新数据写到其它位置,即使发生断电事故,原数据也不会被销毁,还可以继续使用原数据,保证了中途发生掉电时的数据完整性以及数据的正确访问。由于本发明在更新数据时,将新数据写入新的空闲块中,因此原数据实质上已经失效,这些原数据实际是可以删除的,但是还占用着原有块中的空间,这部分可以被删除的空间,被称为空洞。由于本发明上述的数据更新方式,会导致空洞的产生和增多。因此本发明还提出了一种数据紧凑处理方式,来减少甚至消除所述空洞。具体方式是:设置存储器中每个块的有效长度;在更新存储器中的已有数据时,将该数据对应的原数据所在的块的有效长度减去该原数据的长度;定时、实时或者人工触发判断存储器中各个块的有效长度,将有效长度小于预定长度(如小于该块总长度的50%)的块中的有效数据进行合并,将合并后的有效数据写入新的空闲块中,并更新所述有效数据的索引;将合并前的所述各个有效长度小于预定长度的块设置为空闲块。假设数据K原来在Blk1中,当数据K有更新在Blk2时,Blk1的对应数据K相当于垃圾数据,这个空间就是空洞,是需要回收的,不然会有比较多的数据空洞,引起存储器满。因此,需要定期对一些垃圾数据进行回收。本发明中在内存中设置有一块块信息内存,用于保存每个块的有效长度。数据K在写到Blk2后,会查到原来的索引在Blk1中,把Blk1的有效长度减小N个字节(数据K的大小)。之后定期扫描所属块信息内存,发现当前块的有效长度小于配置值(如小于该块总长度的50%),即进行回收。回收时,直接把几个需要回收的块的有效数据取到,合并为一个块,写入存储器,并重新更新这个块内所有有效数据的索引信息。把回收过的块置为空闲块,供下次使用。图10为一种对空洞进行数据紧凑处理的示意图。如图10所示,其中有灰度填充的方框为空洞部分,当两个块中空洞比较多时,合并为一个块,写入到第三个块,把原来两个块标识为空闲块。本发明还公开了一种服务器,包括至少一个本发明上述的存储器。在所述存储器的数量为两个以上时,所述将所述合并后的数据块写入存储器的空闲块中具体为:从第一个存储器的第一个块起,遍历所有存储器的第一个块,如果没有找到空闲块则遍历所有存储器的下一个块,直到出现空闲块为止,将所属合并后的数据库写入该空闲块中。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1