一种数据写入方法与流程

文档序号:19064294发布日期:2019-11-06 02:08阅读:192来源:国知局
一种数据写入方法与流程

本发明属于数据存储技术领域,更具体地,涉及一种数据写入方法。



背景技术:

在如今的存储系统中,存储设备的性能逐渐成为系统性能的瓶颈,难以满足日益增长的数据量对存储性能的需求。独立硬盘冗余阵列(redundantarrayofindependentdisks,raid)作为后端存储被广泛应用于大量企业中。raid将多个存储设备合并为一个,可以在提供高并行性的同时,也可以提供不错的数据冗余功能。以5盘位的raid5为例,一个条带的数据存放在4个盘中,校验值存放在1个盘中。当发生单个数据盘故障时,可以通过其它盘的数据与校验值通过异或操作将故障盘的数据恢复出来。

然而,校验值在提供容错功能的同时,也为系统性能带来了一些不利的影响。校验值是根据同一条带中的其它数据进行异或操作生成的,当更新数据时,需要同时更改校验值以保证容错性,这样就带来了额外的写放大,降低了系统性能。

现有技术中,大部分方案选择在块层降低校验值更新带来的写放大。然而,块层无法获取上层的文件布局,无法知道某个块属于哪个特定的文件,即这些方案不区分校验块和数据块,按照同样的方式处理,没有将校验值更新的情况考虑进来。添加缓存来降低校验值更新带来的写放大也是一种常用的方案,然而其效果却和添加的缓存大小不匹配。因此,我们需要一种方案来显式地处理校验值更新,同时充分利用缓存。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种数据写入方法,其目的在于解决现有的raid中校验值频繁更新,严重影响系统性能的问题。

为实现上述目的,本发明提供一种数据写入方法,包括如下步骤:

文件系统层将预设时间段内收到的多个写请求进行缓存;所述写请求为对小文件或大文件进行写操作的请求,若所述写请求所属的文件的长度小于预设长度,则该写请求对应的文件为小文件,否则该写请求对应的文件为大文件;

文件系统层将所述多个写请求中相同文件的写请求聚集,并将所述多个写请求中所有小文件的写请求聚集;

文件系统层将聚集的所有小文件的写请求分配到小文件组地址空间,所述小文件组地址空间为连续的地址空间;所述小文件组地址空间采用异地更新策略;小文件的写请求聚集后写入地址连续的小文件组地址空间所带来的raid校验值更新次数小于累加raid校验值更新次数,所述累加raid校验值更新次数为聚集的小文件的写请求中所有单次单个小文件的写请求写入地址空间所带来的raid校验值更新次数之和。

具体地,写请求的聚集指的是将相同文件的写请求数据放在一起以增加局部性。例如:如果同一个文件的两个写请求的地址是连续衔接的,则将这两个写请求聚集指的是将这两个写请求合并,如果同一个文件的两个写请求的地址是不连续的,则将这两个写请求聚集指的是将这两个写请求放在一起下发地址空间。

可选地,该方法还包括如下步骤:

文件系统层将所述多个写请求中所有大文件的写请求聚集,将聚集的所有大文件的写请求分配到大文件组地址空间,所述小文件组地址空间为连续的地址空间;所述大文件组地址空间采用原地更新策略。

可选地,所述小文件组地址空间采用异地更新策略,具体包括:

将写请求对应的小文件分配到小文件组地址空间的空闲空间,优先分配到空闲的小文件条带,其次分配到连续空闲页多的小文件条带;小文件组地址空间包括多个小文件条带。

可选地,所述大文件组地址空间采用原地更新策略,具体包括:

当写请求对应的大文件不是新创建的大文件时,将该写请求写入大文件之前存放的位置;

当写请求对应的大文件是新创建的大文件时,将该写请求写入大文件组地址空间的空闲空间,优先分配到空闲的大文件条带,其次分配到连续空闲页多的大文件条带;大文件组地址空间包括多个大文件条带。

具体地,将地址空间分大文件组和小文件组,是为了将访问特性相近的文件放在一起,提升文件访问的局部性。

可选地,文件系统层将预设时间段内收到的多个写请求进行缓存,其中,当缓存空间的剩余空间低于预设阈值时,则将缓存的写请求写入地址空间。

可选地,文件系统层将写请求写入地址空间,具体包括如下步骤:

将地址空间划分成多个条带,基于划分的条带将文件系统层的逻辑空间划分为多个文件组,每个文件组中包含数量相同的条带;其中,将划分的多个文件组分为大文件组和小文件组;

如果当前待写入的文件是大文件时,若该文件是一个新文件,则将该文件分配到一个大文件组中,查看当前大文件组的空间是否已用完,若是,则从空闲的文件组中选取一个文件组作为新的大文件组;若否,则将该文件分配到当前大文件组;若该文件不是一个新文件,将该大文件分配到原有的大文件组;

如果当前待写入的文件是小文件时,将该文件分配到一个小文件组中,查看当前小文件组的空间是否已用完,若是,则从空闲的文件组中选取一个文件组作为新的小文件组;若否,则将该文件分配到当前小文件组。

可选地,如果当前待写入的文件是小文件时,若有足够的空闲条带,则直接分配新的条带;若所有的空闲条带被用尽,则选取一个包含最多连续空闲页的条带分配,按照连续空闲页的长度由长至短的顺序利用各个条带中的空闲空间。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:

(1)本发明提供的数据写入方法,将文件系统层的逻辑空间按照条带为单位进行划分;根据大文件和小文件更新特点的不同划分了大文件组和小文件组;由此使得在文件系统层能够感知底层raid的结构,更新数据的粒度更符合raid的特点,从而降低了raid中的写放大。在文件系统层将对文件的操作缓存,将对同一个文件的写操作聚合在一起。对于大文件,可以将对属于同一个文件的同一个条带的多个更新一起下刷,减少对同一个条带校验值的多次更新;对于小文件,可以将多个文件写入到同一个条带中,降低因多个文件更新而带来的多次校验值更新;利用文件系统中延迟分配的特性,只有在下刷数据到持久化存储设备时,才为待下刷的数据分配空间,使得属于同一个文件数据聚合在一起,同时能以条带为单位下刷,从而降低校验值更新带来的写放大。

(2)本发明提供的数据写入方法,利用文件系统延迟分配特性来降低raid校验值更新带来的写放大的方法,利用的是文件系统中延迟分配的特性将数据缓存在内存中,其中延迟分配指的是只有在需要写入数据时才分配空间;而已经有很多现代文件系统支持延迟分配特性,因此本发明具有较好的应用空间;传统文件系统,如:ext4使用的伙伴算法以2n为单位分配页,对于小请求会浪费一定的空间,如:对于一个18个页大小的请求分配32个页大小的空间(24<18<25)。本发明中的缓存算法将请求拆分为多个2n的子请求,相比较而言能节省一定的空间。

附图说明

图1为本发明提供的数据写入方法流程图;

图2为本发明实施例中的所基于的存储系统的结构示意图;

图3为本发明实施例中的利用文件系统延迟分配特性来降低raid校验值更新带来的写放大的方法的流程图;

图4为本发明实施例中文件系统的数据布局结构图;

图5为本发明实施例中步骤(2)的细化流程图;

图6为本发明实施例中步骤(3)的细化流程图;

图7为本发明实施例中步骤(4)的细化流程图;

图8为本发明实施例中步骤(5)的细化流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

图1为本发明提供的数据写入方法,如图1所示,包括如下步骤:

s101,文件系统层将预设时间段内收到的多个写请求进行缓存;所述写请求为对小文件或大文件进行写操作的请求,若所述写请求所属的文件的长度小于预设长度,则该写请求对应的文件为小文件,否则该写请求对应的文件为大文件;

s102,文件系统层将所述多个写请求中相同文件的写请求聚集,并将所述多个写请求中所有小文件的写请求聚集;

s103,文件系统层将聚集的所有小文件的写请求分配到小文件组地址空间,所述小文件组地址空间为连续的地址空间;所述小文件组地址空间采用异地更新策略;小文件的写请求聚集后写入地址连续的小文件组地址空间所带来的raid校验值更新次数小于累加raid校验值更新次数,所述累加raid校验值更新次数为聚集的小文件的写请求中所有单次单个小文件的写请求写入地址空间所带来的raid校验值更新次数之和。

具体地,在文件层将地址空间划分为多个文件组,每个文件组中包含数量相同的条带,每个条带包含多个页;文件组有三种类型:大文件组、小文件组和空闲文件组,其中大文件组仅存放大文件,小文件组仅存放小文件,空闲文件组中未存放文件。当前文件组的空间用完时,可以选择一个空闲文件组作为大文件组或者小文件组。若待写入文件的长度大于或等于预设长度阈值,所述待写入文件为大文件,否则,所述待写入文件为小文件;在一个示例中,该预设长度阈值可以为4kb。

当待写入文件为大文件时,若该大文件为一个新创建的文件,查看当前大文件组的空间是否已用完,若是,则从空闲的文件组中选取一个文件组作为大文件组,为该文件分配空间;若否,则从当前正在使用的大文件组中为该文件分配空间;

当待写入文件为大文件时,若该大文件不是一个新创建的文件,则采用就地更新策略,对该文件在它之前存放的位置进行修改;

当待写入文件为小文件时,将该小文件为一个新创建的文件,则将该小文件分配到一个小文件组中,查看当前小文件组的空间是否已用完,若是,则从空闲的文件组中选取一个文件组作为新的小文件组;若否,则从正在使用的小文件组中为该文件分配空间;

当待写入文件为小文件时,若该小文件不是一个新创建的文件,则采用异地更新策略,将从当前正在使用的小文件组选择一个空闲的条带用于存放该文件;

在文件系统层将对文件的操作缓存,将对同一个文件的写操作聚合在一起。对于大文件,可以将对属于同一个文件的同一个条带的多个更新一起下刷,减少对同一个条带校验值的多次更新;对于小文件,可以将多个文件写入到同一个条带中,降低因多个文件更新而带来的多次校验值更新。

本发明利用文件系统中延迟分配的特性,只有在下刷数据到持久化存储设备时,才为待下刷的数据分配空间,使得属于同一个文件数据聚合在一起,同时能以条带为单位下刷,从而降低校验值更新带来的写放大。

本发明提供给的上述利用文件系统延迟分配特性来降低raid校验值更新带来的写放大的方法,利用延迟分配的特性将写入的数据缓存在内存中,从而降低raid中更新校验值带来的写放大,达到提升性能的目的。本发明提供的利用文件系统延迟分配特性来降低raid校验值更新带来的写放大的方法,利用延迟分配的特性,将数据缓存在内存中,同时在文件系统层使用raid友好型的布局,使下发请求的粒度与底层raid更新的粒度保持一致,从而降低raid中更新校验值带来的写放大。

下面将结合实施例及附图,具体说明本发明利用文件系统延迟分配特性来降低raid校验值更新带来的写放大的方法。

本发明实施例基于图2中所示的存储系统;上层应用下发向底层系统发送写请求,在文件系统层利用延迟分配的特性将数据缓存在内存中;当达到特定的阈值时,以条带为粒度向底层raid写入数据,从而降低raid更新校验值带来的写放大,提升系统性能,其流程如图3所示,具体包括一下步骤:

(1)将地址空间划分为以条带为单位,使更新数据的粒度与raid条带对齐;

(2)根据文件大小将地址空间划分为大文件组和小文件组,分别采用就地更新和异地更新的策略更新数据;

(3)利用延迟分配的特性,将写请求缓存在内存中,尽可能地使同一文件的数据缓存在一起;

(4)当达到预定的条件时(如:缓存时间过长等),以条带为单位将数据组织起来准备写入到存储设备中;

(5)以条带为粒度为写操作分配写入的位置,对于大文件组,直接返回原条带号,原地更新数据;对于小文件组,若有足够的空闲空间,则直接分配新的条带;若没有足够的空闲空间,则分配最长的空闲连续空间。

具体地,优先分配空闲的条带,即条带中所有的页均是空闲的。当空闲条带用尽时,那么就需要找到包含尽可能多的空闲页的条带,从而保证更新一次校验值能更新更多的数据,把写放大尽可能降到最低。在一个实例中:写空闲条带是更新4个页的数据加1个页的校验值,当空闲页用完时,更新3个页的数据加1个页的校验值相比于更新1个页的数据加1个页的校验值带来的写放大更低,即从比例上来看更新无用数据的比例更低。

实施例中,步骤(1)中的逻辑空间划分如图4所示。文件系统中将逻辑空间划分为多个等大小的条带。而由于操作系统中层与层之间是透明的,在文件系统层的条带只有raid中条带的数据部分,两层之间条带概念的区别如图中所示。

实施例中,步骤(2)的流程如图5所示,具体如下:

(2-1)根据(1)中划分的条带,文件系统层的逻辑空间被划分为多个文件组,每个文件组中包含数量相同的条带;

(2-2)判断当前待写入的文件是否是大文件,若是,则进入步骤(2-3),若否,则进入步骤(2-6);

(2-3)判断该文件是否是一个新文件,若是,则进入步骤(2-4),若否,则进入步骤(2-5);

(2-4)将该文件分配到一个大文件组中,查看当前大文件组的空间是否已用完,若是,则从可用的文件组中选取一个文件组作为新的大文件组;若否,则将该文件分配到当前大文件组;

(2-5)由于大文件采用就地更新的策略,将该大文件分配到原有的大文件组;

(2-6)判断该文件是否是一个小文件,若是,将该文件分配到一个小文件组中。查看当前小文件组的空间是否已用完,若是,则从空闲的文件组中选取一个文件组作为新的小文件组;若否,则将该文件分配到当前小文件组;

(2-7)由于小文件采用异地更新的策略,将该小文件分配到一个新的位置。若有足够的空闲条带,则直接分配新的条带;若所有的空闲条带被用尽,则选取一个包含最长空闲空间的条带分配,用于存放新的数据,从而使更新一次校验值的同时能更新尽可能多的数据。

实施例中,步骤(3)的流程如图6所示,具体如下:

(3-1)建立粒度为2n(n=0,1,2……)的链表,链表中的项分别指向大小为2n个page的数据;

(3-2)写入的数据以2n(n=0,1,2……)为粒度分割,存放在不同的链表中;

(3-3)为每个文件建立一个b+树,其根节点存放在vfs层的inode中,叶子节点指向(3-1)链表中的项。

实施例中,步骤(4)的流程如图7所示,具体如下:

(4-1)判断缓存中的空闲空间是否低于一个特定的阈值,若是,则调用一个后台线程开始将缓存中的数据刷回存储设备中;

(4-2)判断缓存中的脏数据缓存的时间是否超过一个阈值,若是,则调用后台线程将脏数据写回到存储设备中;

(4-3)当上层应用程序调用fsync等命令强制刷回缓存中的数据时,调用后台线程将缓存中的数据写回到存储设备中。

实施例中,步骤(5)的流程如图8所示,具体如下:

(5-1)根据步骤(1)中划分的条带建立链表,链表中的每一级中的项指向包含n个空闲页的条带(n为一个条带的页数量);

(5-2)判断当前写操作是否是对大文件的写,若是,进入步骤(5-3);若否,进入步骤(5-4);

(5-3)对大文件的写操作,只需要返回原条带号,进行原地更新即可;

(5-4)对小文件的写操作,判断空闲空间是否足够,若是,则分配一个空闲的条带;若否,则分配一个连续空闲页最多的条带;

(5-5)更新多级链表中条带的状态,保证一致性。

本实施例中,每次写操作在文件系统层利用延迟分配的特性缓存在内存中,尽可能地使同一个文件中的数据聚集,降低了raid中校验值更新带来的写放大,提升了系统的性能。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1