一种存储数据的备份方法和装置制造方法

文档序号:6623535阅读:133来源:国知局
一种存储数据的备份方法和装置制造方法
【专利摘要】本发明提出一种存储数据的备份方法,应用于RAID阵列,所述方法包括:为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用;当所述目标RAID阵列失效时,在执行写IO命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读IO命令时从所述写缓存中读取数据;当所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。通过本发明能降低硬件成本以及对业务的性能影响。
【专利说明】一种存储数据的备份方法和装置

【技术领域】
[0001]本发明涉及存储领域,尤其涉及一种存储数据的备份方法和装置。

【背景技术】
[0002]当RAID阵列失效时,该阵列上的所有逻辑资源都不能读写,将导致业务中断。例如,在RAID5阵列中有2块盘不能读写,或者在RAIDO阵列中有I块盘不能读写,就会导致RAID阵列失效。然而,在大多数情况下,不能读写的硬盘,很可能只是硬盘转接板出现问题,或者DEU框SAS连线松动,而磁盘本身并没有问题。维护人员通过更换转接板、或者固定SAS连线对RAID阵列进行恢复时,通常会造成RAID阵列暂时失效,在RAID阵列暂时失效的情况下,失效期间的业务无法提供、数据无法保存,从而会造成严重的数据丢失。比如在监控应用中,RAID阵列失效期间的所有监控录像都会丢失。
[0003]为解决上述问题,当前一般使用镜像技术来应对RAID阵列的失效。具体地,可首先对RAID阵列创建镜像RAID阵列,也可以对逻辑资源创建镜像逻辑资源。在向RAID阵列写入数据时,将数据同时写入两份独立的RAID阵列(或者逻辑资源)上。若主RAID阵列失效,则将业务流转到镜像RAID阵列上。
[0004]然而上述方案中,由于必须使用相同大小的RAID阵列或逻辑资源创建镜像,硬盘空间成本翻倍;在业务写数据时,需要同时写两份,在系统业务繁忙的情况下,会影响业务写性能,而且会造成CPU等系统资源负载翻倍,从而影响其他读写业务的性能。


【发明内容】

[0005]有鉴于此,本发明提出一种存储数据的备份方法,应用于RAID阵列,所述方法包括:
[0006]为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用;
[0007]当所述目标RAID阵列失效时,在执行写1命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读1命令时从所述写缓存中读取数据;
[0008]当所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
[0009]优选地,所述方法还包括:
[0010]在所述回写过程中,如果需要执行写1命令,则将该写1命令对应的数据写入所述目标RAID阵列;
[0011]在所述回写过程中,如果需要执行读1命令,则根据待读取的数据信息从所述写缓存中或者从所述目标RAID阵列中读取数据。
[0012]优选地,所述写缓存的存储空间被划分为全局头、RAID头、Block头以及Block数据区;
[0013]所述全局头,记录写缓存存储空间的大小以及各RAID头是否已被分配的第一bitmap 位图;
[0014]所述RAID头,根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列,并记录该目标RAID阵列信息;所述目标RAID阵列信息包括所述目标RAID阵列的阵列编号、Block大小以及可用Block个数;
[0015]所述Block头,每个Block头分别对应一个Block数据块,并分别记录所述Block数据块所属RAID头编号、该Block数据块在目标RAID阵列中的Iba地址以及记录该Block数据块是否已写入数据的第二 bitmap位图;
[0016]所述Block数据区,包括若干个Block数据块,所述Block数据块的大小为所述RAID头中记录的所述Block大小。
[0017]优选地,所述为目标RAID阵列创建写缓存包括:
[0018]根据所述第一 bitmap位图,为所述目标RAID阵列分配一个未使用的RAID头;
[0019]将所述目标RAID阵列信息以及为所述目标RAID阵列分配的可用Block个数记录到对应的RAID头中。
[0020]优选地,所述将写入所述目标RAID阵列的存储数据写入所述写缓存包括:
[0021]根据收到的写10请求中的目标RAID阵列编号查找对应的RAID头;
[0022]根据所述写10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0023]如果查找到了对应的Block头,将数据写入该Block头对应的Block数据块中;
[0024]如果未查找到对应的Block头,则获取一个空Block数据块,将数据写入该空Block数据块中,同时在该空Block数据块对应的Block头中记录所属RAID头的编号,在所述第二 bitmap位图中记录该Block头对应的Block数据块已写入数据,并将该数据在目标RAID阵列中的Iba地址记录到该Block头中;
[0025]其中当获取到一个空数据块时,更新对应的RAID头中记录的所述可用Block个数。
[0026]优选地,所述从所述写缓存中读取数据包括:
[0027]根据收到的读10请求中的目标RAID阵列编号查找对应的RAID头;
[0028]根据所述读10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0029]如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块已写入了数据,则读取该数据;
[0030]如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块未写入数据,从所述目标RAID阵列中读取数据,并返回读取结果O
[0031]本发明还提出一种存储数据的备份装置,应用于RAID阵列,所述装置包括:
[0032]创建模块,用于为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用;
[0033]读写模块,用于在所述目标RAID阵列失效时,在执行写10命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读10命令时从所述写缓存中读取数据;
[0034]回写模块,用于在所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
[0035]优选地,所述回写模块进一步用于:
[0036]在所述回写过程中,如果需要执行写1命令,则将该写1命令对应的数据写入所述目标RAID阵列;
[0037]所述读写模块进一步用于:
[0038]在所述回写过程中,如果需要执行读1命令,则根据待读取的数据信息从所述写缓存中或者从所述目标RAID阵列中读取数据。
[0039]优选地,所述写缓存的存储空间被划分为全局头、RAID头、Block头以及Block数据区;
[0040]所述全局头,包括写缓存存储空间的大小以及记录各RAID头是否已被分配的第一 bitmap 位图;
[0041]所述RAID头,根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列,并记录该目标RAID阵列信息;所述目标RAID阵列信息包括所述目标RAID阵列的阵列编号、Block大小以及可用Block个数;
[0042]所述Block头,每个Block头分别对应一个Block数据块,并分别记录所述Block数据块所属RAID头编号、该Block数据块在目标RAID阵列中的Iba地址以及记录该Block数据块是否已写入数据的第二 bitmap位图;
[0043]所述Block数据区,包括若干个Block数据块,所述Block数据块的大小为所述RAID头中记录的所述Block大小。
[0044]优选地,所述创建模块进一步用于:
[0045]根据所述第一 bitmap位图,为所述目标RAID阵列分配一个未使用的RAID头;
[0046]将所述目标RAID阵列信息以及为所述目标RAID阵列分配的可用Block个数记录到对应的RAID头中。
[0047]优选地,所述读写模块进一步用于:
[0048]根据收到的写10请求中的目标RAID阵列编号查找对应的RAID头;
[0049]根据所述写10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0050]如果查找到了对应的Block头,将数据写入该Block头对应的Block数据块中;
[0051]如果未查找到对应的Block头,则获取一个空Block数据块,将数据写入该空Block数据块中,同时在该空Block数据块对应的Block头中记录所属RAID头的编号,在所述第二 bitmap位图中记录该Block头对应的Block数据块已写入数据,并将该数据在目标RAID阵列中的Iba地址记录到该Block头中;
[0052]其中,当获取到一个空数据块时,更新对应的RAID头中记录的所述可用Block个数。
[0053]优选地,所述读写模块进一步用于:
[0054]根据收到的读10请求中的目标RAID阵列编号查找对应的RAID头;
[0055]根据所述读10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0056]如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块已写入了数据,则读取该数据;
[0057]如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块未写入数据,从所述目标RAID阵列中读取数据,并返回读取结果O
[0058]本发明通过创建写缓存,使用少量的存储空间可同时为多个RAID阵列提供失效备份,降低了硬件成本;而且,由于所述写缓存在RAID阵列失效时才启用,并且在RAID阵列失效再恢复时,只回写失效期间写入的数据,从而显著降低了对业务的性能影响。

【专利附图】

【附图说明】
[0059]图1是现有技术中RAID存储阵列对外部读写1的处理示意图;
[0060]图2是本发明一种示例性实施例示出的一种RAID阵列对外部读写1的处理示意图;
[0061]图3是本发明一种示例性实施方式示出的一种存储数据的备份方法流程图;
[0062]图4是本发明一种示例性实施方式示出的一种写缓存存储介质的存储空间组织形式;
[0063]图5是本发明一种示例性实施方式示出的一种RAID阵列通过写缓存进行数据失效备份以及数据恢复的处理流程;
[0064]图6是本发明一种示例性实施方式示出的一种存储数据的备份装置框图。

【具体实施方式】
[0065]请参见图1,图1为现有技术中RAID阵列对外部读写1的处理示意图。如图所示,RAID阵列在进行数据读写时,读写1请求通过上层模块下发到RAID模块,Raid request子模块判断该1请求所属RAID阵列的状态,如果状态正常,则将该1请求发给RAID 1子模块处理,将数据写入后端硬盘,或者从后端硬盘读取数据;如果阵列失效,则向上层模块返回读取或者写入数据失败。
[0066]在发明中,可以为RAID阵列创建独立的写缓存,并将所述写缓存作为RAID阵列的RAID模块中的一个子模块,参与RAID阵列对外部读写1的处理。
[0067]具体地,请参见图2,图2为本实施例示出的一种RAID阵列对外部读写1的处理示意图。如图所示,引入了写缓存子模块后,读写1请求通过上层模块下发到RAID模块,Raid request子模块判断该1请求所属RAID阵列的状态,如果状态正常,仍然将该1请求发给RAID 1子模块处理,将数据写入后端硬盘,或者从后端硬盘读取数据;如果阵列失效,读写1请求不再发给RAID 1子模块处理,而是由写缓存子模块进行处理,数据的读写都在写缓存中进行。当阵列恢复时,自动触发写缓存将已写入数据回写。
[0068]为了使本发明的技术方案更加清楚明白,以下结合附图并举实施例对本发明进行详细描述。
[0069]请参见图3,本发明示例性的一种实施方式中,提出一种存储数据的备份方法,应用于RAID阵列,所述方法执行如下步骤:
[0070]步骤301、为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用;
[0071]步骤302、当所述目标RAID阵列失效时,在执行写1命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读1命令时从所述写缓存中读取数据;
[0072]步骤303、当所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
[0073]在本实施例中,所述写缓存的存储介质可以是一块或多块独立的内存,一块或多块独立的硬盘,或者一个或多个独立的RAID阵列。其中,无论写缓存采用哪种存储介质,均按照如图4所示的结构组织存储空间。
[0074]如图4所示,在本实施例中,写缓存的存储介质被划分为4个区域,各区域分别记载以下信息:一个全局头、一个或多个RAID头、多个Block头以及多个Block数据区,每个区域只记录断电必须保存的参数。
[0075]以下对以上4个区域的功能以记录的参数作详细的说明。
[0076]全局头区域,该区域记录写缓存存储空间的大小(Size)、用于记录各RAID头是否已被分配的第一 bitmap位图(raid_bitmap)、所属控制器ID (contol_id)以及该区域的数据校验值(checksum)。其中,所述写缓存存储空间的大小,可以在创建写缓存时根据实际的业务以及失效备份的时间进行设置;例如,假设RAID阵列上有50路IMbps的录像,需要提供24h的失效备份,因此需要创建约528G大小的RAID写缓存。那么一个4TB大小的硬盘作为写缓存,可以同时给7个这种业务的RAID阵列同时提供24h失效备份。
[0077]所述第一 bitmap位图,用于记录各RAID头是否已被分配,一个RAID头在该bitmap位图中对应位置取值为I时,表示该RAID头已经分配;为O时,表示该RAID头尚未分配。
[0078]所述所属控制器ID,用于区分控制所述写缓存的控制器。例如,在具体应用时,为了提高可靠性,目标RAID阵列多通过两台控制器进行控制(俗称双控),通过所述控制器ID可以区分出控制所述目标RAID阵列的控制器。当然在非双控的环境下,该参数就不一定需要了。
[0079]所述数据校验值,用于在本区域中记录的某些参数意外丢失时,通过校验计算对丢失的参数进行恢复。
[0080]RAID头区域,该区域根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列;例如,假设写缓存需要为两个目标RAID阵列进行失效备份,那么RAID头区域可以等同的划分为两个子区域,每个子区域对应一个目标RAID区域。RAID头区域中每个子区域分别记录对应目标RAID阵列信息以及该区域的数据校验值;所述目标RAID阵列信息通常包括所述目标RAID阵列的阵列编号(uuid)、扇区大小(sector_size)、条带大小(strip_size)、Block 大小(block_size)以及可用Block个数(block_number);其中,所述扇区大小和条带大小取决于目标RAID阵列的具体配置;所述可用Block个数为创建写缓存时由管理员进行分配。
[0081]Block头区域,根据写缓存的Block总个数被划分为若干个Block头,每个Block头分别对应一个Block数据块;每个Block头分别记录该Block头在Block头区域中的Block头编号(index,即表示该Block头为Block头区域的第几个Block)、该Block头所属Raid头编号(raid_index,即表示该Block头属于RAID头区域中的第几个RAID)、该Block数据块所记录的数据在目标RAID阵列中的Iba地址(logical block address,逻辑区块地址)以及记录该Block数据块是否已写入数据的第二 bitmap位图(block_bitmap)。
[0082]Block数据区域,该区域根据写缓存的Block总个数被划分为若干个Block数据块,Block数据块的大小为所述RAID头中记录的所述Block大小。其中,写缓存的Block总个数可以通过写缓存Block数据区域的实际空间大小除以单个Block数据块的Block大小计算得到。
[0083]请参见图5,图5为本实施例示出的RAID阵列通过写缓存进行数据失效备份以及数据恢复的处理流程,以下结合图4对RAID阵列通过写缓存进行数据失效备份以及数据恢复的处理流程进行详细描述。
[0084]在本实施例中,写缓存在初始状态下不对任何RAID阵列进行失效备份,在RAID阵列创建后,如果要对该RAID阵列进行失效备份,则继续创建与该RAID阵列对应的写缓存。
[0085]具体地,在为该RAID阵列创建写缓存时,可以根据全局头中的RAID头使用bitmap位图,为该RAID阵列分配一个空的RAID头,然后在分配到的RAID头中记录该RAID阵列的阵列编号、扇区大小、条带大小、Block大小等信息,同时为该RAID阵列分配可用Block个数,并将分配的可用Block个数也记录到RAID头中。其中,所述可用Block个数在具体分配时,可以是根据写缓存的总Block个数为各目标RAID阵列进行平均分配;当然,在具体实现时,也可以根据目标RAID阵列的实际业务,为不同的目标RAID阵列分配数量不等的可用Block个数,本实施例不进行特别限定。
[0086]在本实施例中,创建完成的写缓存,在RAID阵列正常运行时,默认为禁用状态,在RAID阵列失效时自动启用。当写缓存启用后,对于针对失效RAID阵列的外部读写10请求,都由写缓存进行处理。
[0087]写缓存首先根据收到的写10请求中的目标RAID阵列编号以及Iba地址,查找对应的Block头;具体地,当写缓存收到写10请求后,首先根据该写10请求中的目标RAID阵列编号查找对应的RAID头,查到RAID头后再根据该写10请求中的Iba地址,在与该RAID头对应的Block头中查找Block头。如果是首次写入,Block头中记录的内容均为空,无法查找到对应的Block头,因此可以直接获取一个空Block数据块,将本次写入的数据写入该空Block数据块中,并在该空Block数据块对应的Block头中记录所属RAID头的编号(即为根据读10请求中目标RAID阵列编号查找到的那个RAID头的编号),并将所述第二 bitmap位图中对应bit位置位为I ;同时,将该数据在目标RAID阵列中的Iba地址(即该写10请求中的Iba地址)也记录到该空Block数据块对应的Block头中,以方便目标RAID阵列由失效状态恢复为正常状态时,可根据Block头中记录的Iba地址将已写入数据回写至目标RAID阵列。
[0088]当根据该写10请求中的目标RAID阵列编号以及扇区地址查找Block头时,如果查找到了对应的Block头,表明该Block头对应的Block数据块之前已经写入了数据,于是直接将本次写入的数据写入该Block头对应的Block数据块中。
[0089]值得说明的是,在向写缓存写入数据时,当获取到一个空Block数据块时,需要更新对应的RAID头中记录的所述可用Block个数,将所述可用Block个数减I。
[0090]进一步地,当写缓存收到读10请求后,首先根据收到的读10请求中的目标RAID阵列编号以及Iba地址,在所述写缓存中查找Block头;具体地,当写缓存收到读10请求后,首先根据该读10请求中的目标RAID阵列编号查找对应的RAID头,查到RAID头后再根据该读10请求中的Iba地址,在与该RAID头对应的Block头中查找Block头;
[0091]如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图中对应bit位已置位为1,表明该block头对应的block数据块之前已写入了数据,则直接读取该数据;
[0092]当然,如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图中对应bit位置位为0,表明写缓存中未记录本次需要读取的数据,于是从所述目标RAID阵列中读取数据,并返回读取结果。由于此时所述目标RAID阵列仍然处于失效状态,因此直接返回读取失败。
[0093]在本实施例中,还可以在写缓存中预留部分存储空间作为各目标RAID阵列的竞争使用空间。对于竞争使用空间,任一 RAID头即使将可用Block全部用完(即RAID头中记录的可用Block个数为O),如果竞争使用空间还存在空Block数据块,那么该RAID头仍然可以使用竞争使用空间中的空Block数据块。对于竞争使用空间的大小,用户可以根据业务具体配置。在写缓存中预留竞争使用空间,可以使得在只有一个目标RAID阵列失效时,使用更多的备份空间,从而最大化延长失效备份的备份时间,为维护人员提供更长的故障排查时间。
[0094]在本实施例中,在目标RAID阵列失效启用写缓存的同时,此时维护人员可尽快去现场排查问题,重新恢复阵列。例如,对于硬盘转接板故障,或者DEU框SAS连线松动等磁盘本身并没有问题的故障,维护人员可以通过转接板或者SAS连线的更换恢复阵列。
[0095]当失效的目标RAID阵列恢复后,自动触发写缓存将已写入数据向该目标RAID阵列进行回写,并在写缓存中的已写入数据全部回写完成后,自动禁用写缓存。
[0096]在本实施例中,写缓存在进行回写时,由于Block头中已记录了对应的Block数据块在所述目标RAID阵列中的Iba地址,因此可以根据该Iba地址,将已写入数据按写入顺序回写至目标RAID阵列。比如说,可以将该Iba地址换算成pba地址(physics blockaddress,物理区块地址),然后根据换算出的pba地址将回写的数据写入对应的物理块。其中,将该Iba地址换算成pba地址的具体实现请参考现有技术,本发明不再详述。
[0097]在本实施例中,在数据回写期间,新的写10将不再由写缓存处理,新写入的数据将直接写入恢复后的目标RAID阵列。然而,由于写缓存在回写期间,目标RAID阵列上的部分有效数据仍然在写缓存中,因此在回写期间的读10请求还是先由写缓存处理,当从写缓存读取数据时未命中对应的数据,再从目标RAID阵列中读取数据。
[0098]当然,在具体实现时,写缓存也可以在目标RAID阵列正常时就启用,将该目标RAID阵列已写入数据同步地写入写缓存,从而即使该目标RAID阵列失效是因为硬盘故障导致的,目标RAID阵列本地数据也不会全部丢失。例如,对于视频监控领域的应用,录像写入之前需要读取录像索引数据,因此可以在RAID阵列正常时启用写缓存,将索引数据提前进行备份,从而使得RAID阵列失效时,也能正常的读取录像索引数据。
[0099]通过以上描述可知,本发明通过创建写缓存,可以使用少量的存储空间可同时为多个RAID阵列提供失效备份,减低了硬件成本;而且,由于所述写缓存在RAID阵列失效时才启用,可以有效的区分出阵列失效期间写入的数据,并且由于在RAID阵列失效再恢复时,只回写失效期间写入的数据,从而显著降低了对业务的性能影响。该方案尤其适用于因非磁盘故障而导致的RAID阵列失效的数据备份和恢复。
[0100]请参见图6,本发明还提出一种存储数据的备份装置60,应用于RAID阵列,所述装置60包括:
[0101]创建模块601,用于为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用;
[0102]读写模块602,用于在所述目标RAID阵列失效时,在执行写1命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读1命令时从所述写缓存中读取数据;
[0103]回写模块603,用于在所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
[0104]在本实施例中,所述回写模块603进一步用于:
[0105]在所述回写过程中,如果需要执行写1命令,则将该写1命令对应的数据写入所述目标RAID阵列;
[0106]所述读写模块602进一步用于:
[0107]在所述回写过程中,如果需要执行读1命令,则根据待读取的数据信息从所述写缓存中或者从所述目标RAID阵列中读取数据。
[0108]在本实施例中,所述写缓存的存储空间被划分为全局头、RAID头、Block头以及Block数据区;
[0109]所述全局头,包括写缓存存储空间的大小以及记录各RAID头是否已被分配的第一 bitmap 位图;
[0110]所述RAID头,根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列,并记录该目标RAID阵列信息;所述目标RAID阵列信息包括所述目标RAID阵列的阵列编号、Block大小以及可用Block个数;
[0111]所述Block头,每个Block头分别对应一个Block数据块,并分别记录所述Block数据块所属RAID头编号、该Block数据块在目标RAID阵列中的Iba地址以及记录该Block数据块是否已写入数据的第二 bitmap位图;
[0112]所述Block数据区,包括若干个Block数据块,所述Block数据块的大小为所述RAID头中记录的所述Block大小。
[0113]在本实施例中,所述创建模块601进一步用于:
[0114]根据所述第一 bitmap位图,为所述目标RAID阵列分配一个未使用的RAID头;
[0115]将所述目标RAID阵列信息以及为所述目标RAID阵列分配的可用Block个数记录到对应的RAID头中。
[0116]在本实施例中,所述读写模块602进一步用于:
[0117]根据收到的写10请求中的目标RAID阵列编号查找对应的RAID头;
[0118]根据所述写10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0119]如果查找到了对应的Block头,将数据写入该Block头对应的Block数据块中;
[0120]如果未查找到对应的Block头,则获取一个空Block数据块,将数据写入该空Block数据块中,同时在该空Block数据块对应的Block头中记录所属RAID头的编号,在所述第二 bitmap位图中记录该Block头对应的Block数据块已写入数据,并将该数据在目标RAID阵列中的Iba地址记录到该Block头中;
[0121]其中,当获取到一个空数据块时,更新对应的RAID头中记录的所述可用Block个数。
[0122]在本实施例中,所述读写模块602进一步用于:
[0123]根据收到的读10请求中的目标RAID阵列编号查找对应的RAID头;
[0124]根据所述读10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;
[0125]如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块已写入了数据,则读取该数据;
[0126]如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块未写入数据,从所述目标RAID阵列中读取数据,并返回读取结果O
[0127]本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可进一步拆分成多个子模块。上述发明实施例编号仅仅为了描述,不代表实施例的优劣。
[0128]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
【权利要求】
1.一种存储数据的备份方法,应用于RAID阵列,其特征在于,所述方法包括: 为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用; 当所述目标RAID阵列失效时,在执行写1命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读1命令时从所述写缓存中读取数据; 当所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
2.如权利要求1所述的方法,其特征在于,所述方法还包括: 在所述回写过程中,如果需要执行写1命令,则将该写1命令对应的数据写入所述目标RAID阵列; 在所述回写过程中,如果需要执行读1命令,则根据待读取的数据信息从所述写缓存中或者从所述目标RAID阵列中读取数据。
3.如权利要求1所述的方法,其特征在于,所述写缓存的存储空间被划分为全局头、RAID头、Block头以及Block数据区; 所述全局头,记录写缓存存储空间的大小以及各RAID头是否已被分配的第一 bitmap位图; 所述RAID头,根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列,并记录该目标RAID阵列信息;所述目标RAID阵列信息包括所述目标RAID阵列的阵列编号、Block大小以及可用Block个数; 所述Block头,每个Block头分别对应一个Block数据块,并分别记录所述Block数据块所属RAID头编号、该Block数据块在目标RAID阵列中的Iba地址以及记录该Block数据块是否已写入数据的第二 bitmap位图; 所述Block数据区,包括若干个Block数据块,所述Block数据块的大小为所述RAID头中记录的所述Block大小。
4.如权利要求3所述的方法,其特征在于,所述为目标RAID阵列创建写缓存包括: 根据所述第一 bitmap位图,为所述目标RAID阵列分配一个未使用的RAID头; 将所述目标RAID阵列信息以及为所述目标RAID阵列分配的可用Block个数记录到对应的RAID头中。
5.如权利要求3所述的方法,其特征在于,所述将写入所述目标RAID阵列的存储数据写入所述写缓存包括: 根据收到的写10请求中的目标RAID阵列编号查找对应的RAID头;根据所述写10请求中的Iba地址,在该RAID头对应的Block头中查找Block头;如果查找到了对应的Block头,将数据写入该Block头对应的Block数据块中;如果未查找到对应的Block头,则获取一个空Block数据块,将数据写入该空Block数据块中,同时在该空Block数据块对应的Block头中记录所属RAID头的编号,在所述第二bitmap位图中记录该Block头对应的Block数据块已写入数据,并将该数据在目标RAID阵列中的Iba地址记录到该Block头中; 其中当获取到一个空数据块时,更新对应的RAID头中记录的所述可用Block个数。
6.如权利要求3所述的方法,其特征在于,所述从所述写缓存中读取数据包括: 根据收到的读10请求中的目标RAID阵列编号查找对应的RAID头; 根据所述读1请求中的Iba地址,在该RAID头对应的Block头中查找Block头;如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块已写入了数据,则读取该数据; 如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块未写入数据,从所述目标RAID阵列中读取数据,并返回读取结果O
7.一种存储数据的备份装置,应用于RAID阵列,其特征在于,所述装置包括: 创建模块,用于为目标RAID阵列创建写缓存;其中,所述写缓存在所述目标RAID阵列失效时启用; 读写模块,用于在所述目标RAID阵列失效时,在执行写1命令时将写入所述目标RAID阵列的数据写入所述写缓存,在执行读1命令时从所述写缓存中读取数据; 回写模块,用于在所述目标RAID阵列恢复正常时,自动触发所述写缓存将已写入数据回写至所述目标RAID阵列,并在回写完成时禁用所述写缓存。
8.如权利要求7所述的装置,其特征在于,所述回写模块进一步用于: 在所述回写过程中,如果需要执行写1命令,则将该写1命令对应的数据写入所述目标RAID阵列; 所述读写模块进一步用于: 在所述回写过程中,如果需要执行读10命令,则根据待读取的数据信息从所述写缓存中或者从所述目标RAID阵列中读取数据。
9.如权利要求7所述的装置,其特征在于,所述写缓存的存储空间被划分为全局头、RAID头、Block头以及Block数据区; 所述全局头,包括写缓存存储空间的大小以及记录各RAID头是否已被分配的第一bitmap 位图; 所述RAID头,根据使用写缓存进行失效备份的目标RAID阵列个数被划分为若干子区域,每个子区域分别对应一个目标RAID阵列,并记录该目标RAID阵列信息;所述目标RAID阵列信息包括所述目标RAID阵列的阵列编号、Block大小以及可用Block个数; 所述Block头,每个Block头分别对应一个Block数据块,并分别记录所述Block数据块所属RAID头编号、该Block数据块在目标RAID阵列中的Iba地址以及记录该Block数据块是否已写入数据的第二 bitmap位图; 所述Block数据区,包括若干个Block数据块,所述Block数据块的大小为所述RAID头中记录的所述Block大小。
10.如权利要求9所述的装置,其特征在于,所述创建模块进一步用于: 根据所述第一 bitmap位图,为所述目标RAID阵列分配一个未使用的RAID头; 将所述目标RAID阵列信息以及为所述目标RAID阵列分配的可用Block个数记录到对应的RAID头中。
11.如权利要求9所述的装置,其特征在于,所述读写模块进一步用于: 根据收到的写10请求中的目标RAID阵列编号查找对应的RAID头; 根据所述写10请求中的Iba地址,在该RAID头对应的Block头中查找Block头; 如果查找到了对应的Block头,将数据写入该Block头对应的Block数据块中; 如果未查找到对应的Block头,则获取一个空Block数据块,将数据写入该空Block数据块中,同时在该空Block数据块对应的Block头中记录所属RAID头的编号,在所述第二bitmap位图中记录该Block头对应的Block数据块已写入数据,并将该数据在目标RAID阵列中的Iba地址记录到该Block头中; 其中,当获取到一个空数据块时,更新对应的RAID头中记录的所述可用Block个数。
12.如权利要求9所述的装置,其特征在于,所述读写模块进一步用于: 根据收到的读1请求中的目标RAID阵列编号查找对应的RAID头; 根据所述读1请求中的Iba地址,在该RAID头对应的Block头中查找Block头;如果查找到了对应的Block头,并且该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块已写入了数据,则读取该数据; 如果未查找到对应的Block头,或者该Block头中的所述第二 bitmap位图记录该Block头对应的Block数据块未写入数据,从所述目标RAID阵列中读取数据,并返回读取结果O
【文档编号】G06F12/08GK104166601SQ201410401367
【公开日】2014年11月26日 申请日期:2014年8月14日 优先权日:2014年8月14日
【发明者】余丽, 许勇 申请人:浙江宇视科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1