一种数据存储方法及介质
技术领域
本发明涉及数据存储技术领域,特别涉及一种数据存储方法及介质。
背景技术
现有的文件系统在写入文件时,通常采用随机覆盖写入的方式,即将磁盘预分配成若干段的空间作为存储段,写入之前将待写入数据读到缓存,然后随机选择存储段,擦除存储段中无效的数据,在将有效的数据读到缓存,最后将缓存中的数据写入存储段。上述随机覆盖写的方式在实际使用中,由于随机选择存储段,容易出现未利用的存储段没有被选中的情况,而造成存储空间浪费,并且,由于文件随机写入不同的存储段,导致磁头频繁移动,使得文件写入会有较大的延时,影响整体写入性能。
发明内容
为了解决现有技术的问题,本发明实施例提供了一种数据存储方法及介质。所述技术方案如下:
第一方面,提供了一种数据存储方法,所述方法包括:
接收文件的写入请求,所述文件包括数据块,所述数据块包括数据页,所述数据页中记录数据;
读取存储段信息,根据所述存储段信息查找存储段链表中第一个当前可用的存储段,并将其确定为待写存储段,所述存储段链表由当前不可用的所述存储段以及相邻排列的当前可用的所述存储段组成,当前可用的所述存储段中各所述存储段按照可用存储空间的大小排列;
将所述文件中的各所述数据块以所述数据页为单位追加写入所述待写存储段中。
进一步地,所述方法还包括:
将所述数据页写入的位置添加至所述文件中所述数据块包含的数据块信息中,并将所述数据块信息写入所述待写存储段中;
将所述数据块信息的写入位置添加至所述文件包含的第一元块集中,将所述第一元块集写入所述待写存储段中;
将所述第一元块集的写入位置添加至所述文件包含的文件信息中,将包含所述文件信息的文件信息列表写入所述待写存储段中;
将所述文件信息列表的写入位置添加至所述存储介质包含的检查点中,将所述检查点写入所述待写存储段中;
将所述检查点的写入位置添加至所述存储介质包含的检查点信息中。
进一步地,所述方法还包括:
从所述存储介质中读取所述检查点信息,获取目标文件对应的所述检查点的写入位置;
根据所述检查点的写入位置从所述存储介质中查找所述检查点,获取所述检查点中所述文件信息列表的写入位置;
根据所述文件信息列表的写入位置查找所述文件信息列表;
根据所述文件信息列表查找所述目标文件,获取数据。
进一步地,所述检查点中包括:132个位置信息;
其中,前128个位置信息指向包含所述文件信息的页的位置,所述文件信息中包含所述数据块信息的写入位置,所述数据块信息中包含所述数据页信息,所述数据页信息包含所述数据页的写入位置,
第129个所述位置信息指向所述第二元块集,所述第二元块集包括:指向包含所述文件信息的页的位置信息。
进一步地,所述方法还包括:
扫描所述存储段,获取各所述存储段中的有效数据量;
当某一所述存储段中的所述有效数据量不满足预设数据量阈值时,则将其中的所述有效数据写入所述待写存储段,将该所述存储段标记为当前可用的所述存储段,排列在所述存储段链表中。
进一步地,所述方法还包括:
扫描所述文件,判断其中各所述数据块中的所述数据页是否连续地写入所述存储段,若存在不连续写入的所述数据块,则将所述数据块中的所述数据页连续地写入所述待写存储段,将该所述数据块原存储的所述存储段标记为当前可用的所述存储段,排列在所述存储段链表中。
第二方面,提供了一种数据存储介质,所述介质包括:
一数据区,被划分成至少一个存储段,各所述存储段中,按照可用存储空间的大小相邻排列的当前可用的所述存储段,与当前不可用的所述存储段,组成存储段链表;
至少一个控制信息记录区,用于记录控制信息,包括:分区资源信息;
至少一个检查点信息记录区,用于以循环数组的形式存储检查点的存储位置;
至少一个存储段信息记录区,用于记录存储段信息,所述存储段信息包括:存储段状态信息。
进一步地,所述检查点中包括:132个位置信息;
其中,前128个位置信息指向包含文件信息的页的位置,所述文件信息中包含数据块信息的写入位置,所述数据块信息中包含数据页信息,所述数据页信息包含数据页的写入位置,
第129个所述位置信息指向第二元块集,所述第二元块集包括:指向包含所述文件信息的页的位置信息。
进一步地,所述检查点的后3个位置信息指向第三元块集,所述第三元块集包括:指向所述第二元块集或者其他所述第三元块集的位置。
进一步地,所述数据区的两端分别为头部区和尾部区;
至少一所述控制信息记录区、一所述检查点信息记录区、一所述存储段信息记录区,位于所述头部区;
至少一与所述头部区中相同的所述控制信息记录区、一与所述头部区中相同的所述检查点信息记录区,位于所述尾部区。
本发明实施例提供的技术方案带来的有益效果是:
1、本发明实施例提供的数据存储方法,按照存储段链表将文件中的各数据块以数据页为单位追加写入第一个当前可用的存储段,使得数据页优先写入了当前可用且可用存储空间小的存储段中,从而保证存储段空间能够被充分利用,避免存储空间浪费;
2、本发明实施例提供的数据存储方法,将文件中各数据块以数据页为单位追加写入待写存储段,使得同一个数据块中的数据页能够一并写入同一个或者相邻的存储段,进而使数据存储连续,避免磁头在存储段之间频繁移动;
3、本发明实施例提供的数据存储方法将存储较多无效数据的存储段标记为当前可用的存储段,从存储段的处理角度实现了存储段的回收再利用,有利于充分利用存储空间;
4、本发明实施例提供的数据存储方法将文件中没有成块写入的数据块重新写入存储段中,并将该数据块原占用的存储段标记为当前可用的存储段,一方面提高了数据存储的整体性,另一方面从文件存储的角度实现了存储段的回收再利用,有利于充分利用存储空间;
5、本发明实施例提供的数据存储方法,通过检查点追溯文件各层级的写入位置,能够重现文件的结构,当出现文件损坏时,可以及时恢复文件;
6、本发明实施例提供的数据存储介质,其数据区中的存储段链表结构,实现了数据的有序存储,避免了存储空间的浪费;
7、本发明实施例提供的数据存储介质,其检查点信息记录区中记录的检查点信息能够通过检查点恢复文件原来的数据结构,提高了文件损坏后的数据恢复性能。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的数据存储方法流程图;
图2是本发明实施例提供的文件数据结构示意图;
图3是本发明实施例提供的存储段结构示意图;
图4是本发明实施例提供的文件信息扩展示意图;
图5是本发明实施例提供的数据写入过程示意图;
图6是本发明实施例提供的数据恢复方法流程图;
图7是本发明实施例提供的存储介质结构示意图;
图8是本发明实施例提供的检查点结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如背景技术中所述现有的文件系统对于文件的随机写入,一般都是在磁盘上预分配一段空间,采用随机覆盖写的方式写入。但随机覆盖写入容易造成存储空间浪费、磁头频繁移动影响写入进程的问题。为了解决上述技术问题,本发明实施例提供一种数据存储方法、恢复方法及介质,具体技术方案如下:
如图1所示,一种数据存储方法,包括:
S11、接收文件的写入请求。
上述,如图2所示,文件(extent)包括若干数据块(date block),数据块(dateblock)中包括若干数据页(page),数据页(page)中记录具体的数据。
S12、读取存储段信息,根据存储段信息查找存储段链表中第一个当前可用的存储段,并将其确定待写存储段,存储段链表由当前不可用的所述存储段以及相邻排列的当前可用的所述存储段组成,当前可用的存储段中各存储段按照可用存储空间的大小排列。
上述,存储段为存储介质被划分的存储空间,每个存储段中都保存有自己所在磁盘的物理地址(idx),存储段是文件的在磁盘上的实际存储空间。如图3所示,存储段的结构包括:存储段信息(segment head)、存储段本体(segment body),存储段信息(segmenthead)用于记录存储段的物理地址(idx),存储段本体(segment body)用于存储文件。优选地,存储段信息(segment head)共有两个,分别位于存储段本体(segment body)两侧,起到间隔和校验的作用,确保存储段信息(segment head)的正确性。存储段链表各存储段均有一个指针指向其后一个存储段,指针表示了存储段的排列顺序。存储段链表中,当前可用的存储段相邻排列组成一链表段,当前不可用的存储段相邻排列组成一链表段,两链表段的前后顺序可不做限制。当前可用的存储段中按照可用存储空间的大小,可由小到达排列或由大到小排列,也不做限制。当前可用的存储段为仍有未利用的存储空间的存储段,或者未利用的存储段,或者存储空间中存储有无效数据;当前不可用的存储段为没有未利用的存储空间且存储的全是有效数据的存储段。举例说明,存储段链表可以是:当前可用的存储段组成的链表段位于当前不可用的存储段组成的链表段的后面,当前可用的存储段中,各存储段按照可用空间由小到大排列,当前不可用的存储段中,按照文件写入存储段的顺序排列,新写入数据页的存储段位于后面。上述存储段链表便于查找到当前可用的存储段,按照顺序写入文件,能够充分利用存储段空间。
S13、将文件中的各数据块以数据页为单位追加写入待写存储段中。
上述,以数据页为单位追加写入待写存储段,能够使同一数据块中的数据页连续地写入存储段中,保证数据的整体性和连续性,使所有已写入文件的存储段均是完全被占用的状态。
在一个实施例中,上述数据存储方法,还包括:
S14、将数据页写入的位置添加至文件中数据块包含的数据块信息中,将并将数据块信息写入待写存储段中。
S15、将数据块信息的写入位置添加至文件包含的第一元块集中,将第一元块集写入待写存储段中。
S16、将第一元块集的写入位置添加至文件包含的文件信息中,将包含文件信息的文件信息列表写入待写存储段中。
S17、将文件信息列表的写入位置添加至存储介质包含的检查点中,将检查点写入待写存储段中。
S18、将检查点的写入位置添加至存储介质包含的检查点信息中。
上述,数据块信息(date block head)位于数据块(date block)头部,文件信息(extent head)位于文件(extent)头部。检查点(check point)用于当磁盘中的文件损坏时,用于恢复文件。第一元块集可看作位置集合,其中包含了数据块信息的写入位置。
具体地,如图4所示,文件信息(extent head)包含10个位置信息(Pos),各位置信息分别指向一个第一元块集(meta block),第一元块集(meta block)中包含256个位置信息(Pos),各位置信息分别指向一个数据块信息(date block head),数据块信息(dateblock head)中包含128个数据页信息(page head),各数据页信息(page head)分别指向数据页(page)在存储段中的存储位置。
上述,数块信息中还包括数据页在数据块中的位置信息,将数据块中的数据页写入存储段的过程,具体如图5所示,根据数据块信息确定数据页在数据块中的位置,进而将数据块中相应的数据页写入待写存储段中。
在一个实施例中,上述数据存储方法,还包括:
扫描存储段,获取各存储段中的有效数据量。
当某一有效数据量不满足预设数据量阈值时,则将其中的有效数据写入待写存储段,将存储段标记为当前可用的存储段,排列在存储段链表中。
上述步骤是从存储段角度处理的存储段的回收方法。其中,有效数据可根据业务需要定义,可以是满足某一数据格式的数据,或者符合某一时间段的数据。由于存储段中的有效数据量较少,如果该有效数据继续占用一个存储段,则造成存储空间浪费,如果直接在该存储段追加写入数据,则会出现数据存储分散的问题,因此上述步骤,将存储段链表中所有的有效数据量不满足数据量阈值的存储段中的有效数据统一写入待写存储段中,使得这些存储段变成了可以回收的存储段,将存储空间化零为整,提高了存储空间利用率。
在一个实施例中,上述数据存储方法,还包括:
扫描文件,判断其中各数据块中的数据页是否连续写入存储段,若存在不连续写入的数据块,则将数据块中的数据页连续地写入待写存储段,将该数据块原存储的存储段标记为当前可用的存储段,排列在存储段链表中。
上述步骤是从文件角度处理的存储段的回收方法,同时还能保证数据存储的整体性。其中,判断数据块中的数据页是否连续写入可以根据数据页中的指针判断。
如图6所示,基于上述数据存储步骤,当数据中的部分存储段损坏,导致其中的文件损坏时,本发明实施例提供的数据存储方法,还包括:
S21、从存储介质中读取检查点信息,获取目标文件对应的检查点的写入位置。
上述,检查点信息(check point head)中以循环数组的形式存储有检查点(checkpoint)的在存储段中的写入位置,由游标确定最新的检查点(check point)。每个检查点(check point)可以构造出一个完整的文件信息列表(extent table),其中包括有若干文件信息(extent head)。
S22、根据检查点的写入位置查找从存储介质中检查点,获取检查点中的文件信息列表的写入位置。
上述,具体地,检查点(check point)中包括:132个位置信息,其中前128个位置信息指向包含16个文件信息(extent head)的页的位置。第129个位置信息指向第二元块集,第二元块集包括:指向其他包含所述16个文件信息的页的位置信息。检查点的后3个位置信息可以为空,或者指向第三元块集,第三元块集包括:指向第二元块集或者其他第三元块集的位置。
S23、根据所述文件信息列表的写入位置查找所述文件信息列表。
S24、根据所述文件信息列表查找所述目标文件,获取数据。
如此,基于上述步骤S21~S24可完整构造出一个文件(extent)的数据结构。游标指向不同的检查点(check point)可以构造出不同时间段的文件(extent)。
本发明实施例提供的数据存储方法带来的有益效果是:
1、按照存储段链表将文件中的各数据块以数据页为单位追加写入第一个当前可用的存储段,使得数据页优先写入了当前可用且可用存储空间小的存储段中,从而保证存储段空间能够被充分利用,避免存储空间浪费;
2、将文件中各数据块以数据页为单位追加写入待写存储段,使得同一个数据块中的数据页能够一并写入同一个或者相邻的存储段,进而使数据存储连续,避免磁头在存储段之间频繁移动;
3、将存储较多无效数据的存储段标记为当前可用的存储段,从存储段的处理角度实现了存储段的回收再利用,有利于充分利用存储空间;
4、将文件中没有成块写入的数据块重新写入存储段中,并将该数据块原占用的存储段标记为当前可用的存储段,一方面提高了数据存储的整体性,另一方面从文件存储的角度实现了存储段的回收再利用,有利于充分利用存储空间;
5、通过检查点追溯文件各层级的写入位置,能够重现文件的结构,当出现文件损坏时,可以及时恢复文件。
基于上述存储方法,本发明实施例还提供一种数据存储介质,包括:头部区、数据区、尾部区。
头部区中至少包括:一控制信息记录区、一检查点信息记录区、一存储段信息记录区。
尾部区中至少包括:一控制信息记录区、一检查点信息记录区。
上述,尾部区中的控制信息记录区、检查点信息记录区与头部区中的控制信息记录区、检查点信息记录区相同,这样布置有利于保证信息的正确性,并防止一个记录区损坏造成的信息丢失。具体地,如图7所示,头部区包括两个控制信息记录区、两个检查点信息记录区、两个存储段信息记录区,尾部区包括一个控制信息记录区、一个检查点信息记录区,各区的排列位置如图7。
上述,控制信息记录区(super block),用于记录控制信息,包括:分区资源信息。分区资源信息可包括:介质的状态信息、分区属性等。
检查点信息记录区(check point head),用于以循环数组的形式存储检查点(check point)的存储位置。
存储段信息记录区(segment head table),用于记录存储段信息(segmenthead),其中包括:存储段状态信息,例如:存储段(segment)上的数据是否删除、是否全部失效等。
数据区,被划分成至少一个存储段,各存储段中,按照可用存储空间的大小相邻排列的当前可用的所述存储段,与当前不可用的所述存储段,组成存储段链表。
上述,存储段(segment)的结构包括:存储段信息(segment head)、存储段本体(segment body),存储段信息(segment head)用于存储存储段的物理地址(idx),存储段本体(segment body)用于存储文件。优选地,存储段信息(segment head)共有两个,分别位于存储段本体(segment body)两侧,起到间隔和校验的作用,确保存储段信息(segmenthead)的正确性。存储段链表各存储段均有一个指针指向其后一个存储段,指针表示了存储段的排列顺序。
在一个实施例中,如图8所示,检查点(check point)中包括:132个位置信息(Pos),其中前128个位置信息指向包含16个文件信息(extent head)的页的位置。第129个位置信息指向第二元块集(meta block),第二元块集同样包括:256个指向其他包含所述16个文件信息的页的位置信息(Pos),因此第129个位置信息可以扩展出4096个文件信息(extent head)。检查点的后3个位置信息可以是空,或者可以指向第三元块集,第三元块集包括:指向第二元块集或者其他第三元块集的位置。上述第二元块集和第三元块集均是位置集合。以第130个位置信息为例,第130个位置信息指向第二元块集,最终可以扩展出1048576个文件信息(extent head)。
本发明实施例提供的数据存储介质带来的有益效果是:
1、其数据区中的存储段链表结构,实现了数据的有序存储,避免了存储空间的浪费;
2、其检查点信息记录区中记录的检查点信息能够通过检查点恢复文件原来的数据结构,提高了文件损坏后的数据恢复性能。
上述所有可选技术方案,可以采用任意结合形成本发明的可选实施例,在此不再一一赘述。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。