用来在一冗余储存系统中进行数据修复的方法与装置与流程

文档序号:12963378阅读:318来源:国知局
用来在一冗余储存系统中进行数据修复的方法与装置与流程

本发明是涉及数据储存系统的效能管理,尤其是涉及一种用来在一冗余储存系统(redundantstoragesystem)中进行数据修复(datarecovery)的方法与相关装置。



背景技术:

依据现有技术,具有冗余储存能力的一传统的冗余储存系统,诸如一传统的容错式磁盘阵列(redundantarrayofindependentdisks,可简称为「raid」),可将多个储存装置联合成一个大的储存集区(storagepool)、且可将冗余数据分散在不同的储存装置,其中所述冗余数据可以有助于在单一储存装置毁损时的数据复原。然而,当位衰减(bitrot)或静态数据毁损(silentdatacorruption)发生时,所述传统的储存系统缺乏有效率的处理机制来解决这一类的问题。例如:在所述传统的raid的raid等级(raidlevel)为「raid5」的状况下,为了检查所述储存装置中的某一者中的一数据厚片(datachunk)a1的数据是否正确,必须从其它储存装置读取相对应的数据厚片a2与a3以及奇偶厚片(paritychunk)ap,以供进行比较(尤其是,比较数据厚片a1的原始数据、以及依据数据厚片a2与a3和奇偶厚片ap计算所得的计算数据),这会大大降低随机小档案读取的性能。另外,即使进行比较之后发现所述原始数据与所述计算数据不一致,所述传统的raid无法确定是否所述原始数据与所述计算数据中的哪一者为正确的。又例如:在所述传统的raid的raid等级为「raid1」的状况下,为了检查位衰减是否发生所述传统的raid必须花费两倍的时间来读取。

现有技术中提出某些传统的方法,以尝试解决这些问题。然而,额外的问题诸如一些副作用可能会浮现。因此,需要一种新颖的方法及相关的架构,以在较少副作用、或不造成副作用的状况下,妥善地解决既有的问题。



技术实现要素:

本发明的目的之一在于公开一种用来在一冗余储存系统(redundantstoragesystem)中进行数据修复的方法与相关装置,以解决上述问题。

本发明的另一目的在于公开一种用来在一冗余储存系统中进行数据修复的方法与相关装置,以提升所述冗余储存系统的整体效能。

本发明的至少一较佳实施例中公开一种用来在一冗余储存系统中进行数据修复的方法,其中所述冗余储存系统可包括多个储存装置。所述方法可包括:从所述冗余储存系统的多层中的一特定层传送至少一基本指令至所述特定层的下层,其中所述至少一基本指令包括一读取指令,而所述读取指令是用来要求所述下层传回对应于一索引的一数据区块;以及从所述特定层传送至少一额外指令至所述下层,其中所述至少一额外指令包括一读取重试指令,而所述读取重试指令是用来要求所述下层传回对应于所述索引的一冗余数据区块,以供修复所述数据区块;其中所述冗余储存系统包括一文件系统与多个储存组件,所述文件系统是位于所述多层中的最上层(topmostlayer),以及所述多个储存组件当中位于所述多层中的最底层者(bottommostlayer)包括所述多个储存装置中的至少一组储存装置。

于某些实施例中,当所述下层传回回复错误指令予所述特定层,所述特定层停止传送所述读取重试指令至所述下层。另外,于某些实施例中,当所述下层传回两次一样的数据予所述特定层,所述特定层停止传送所述读取重试指令至所述下层。此外,于某些实施例中,要求所述下层传回对应于所述索引的所述数据区块还包括:传回一读取到的数据以及一读取到的校验信息;其中,所述用来在所述冗余储存系统中进行数据修复的方法还包括:依据所述读取到的数据产生一读取到的数据的校验信息;比对所述读取到的数据的校验信息以及所述读取到的校验信息;以及当所述读取到的数据的校验信息以及所述读取到的校验信息不吻合,则传送所述额外指令至所述下层。

本发明于公开上述方法的同时,也对应地公开一种用来在一冗余储存系统中进行数据修复的装置,其中所述装置可包括所述冗余储存系统的至少一部分(例如:一部分或全部)。所述装置可包括:一控制电路,位于所述冗余储存系统中的多层中的一特定层、且耦接至所述冗余储存系统中的多个储存装置,用来控制所述冗余储存系统的运作。例如:控制所述冗余储存系统的运作包括:从所述特定层传送至少一基本指令至所述特定层的下层,其中所述至少一基本指令包括一读取指令,而所述读取指令是用来要求所述下层传回对应于一索引的一数据区块;以及从所述特定层传送至少一额外指令至所述下层,其中所述至少一额外指令包括一读取重试指令,而所述读取重试指令是用来要求所述下层传回对应于所述索引的一冗余数据区块,以供修复所述数据区块。此外,所述冗余储存系统包括一文件系统与多个储存组件,所述文件系统是位于所述多层中的最上层,以及所述多个储存组件当中位于所述多层中的最底层者包括所述多个储存装置中的至少一组储存装置。

于某些实施例中,当所述下层传回回复错误指令予所述特定层,所述特定层停止传送所述读取重试指令至所述下层。另外,于某些实施例中,当所述下层传回两次一样的数据予所述特定层,所述特定层停止传送所述读取重试指令至所述下层。此外,于某些实施例中,要求所述下层传回对应于所述索引的所述数据区块还包括:传回一读取到的数据以及一读取到的校验信息;其中,控制所述冗余储存系统的运作还包括:依据所述读取到的数据产生一读取到的数据的校验信息;比对所述读取到的数据的校验信息以及所述读取到的校验信息;以及当所述读取到的数据的校验信息以及所述读取到的校验信息不吻合,则传送所述额外指令至所述下层。

本发明的有益之处是,本发明的方法与相关装置可在较少副作用、或不造成副作用的状况下,妥善地解决既有的问题。另外,本发明的方法与相关装置可有效提高整体效能,并且不会有浪费运算资源的问题。

附图说明

图1为依据本发明一实施例的一种冗余储存系统(redundantstoragesystem)的示意图。

图2为依据本发明一实施例的一种储存系统的示意图。

图3为图1所示冗余储存系统于一实施例中所涉及的一文件系统端控制方案的流程图。

图4为图1所示冗余储存系统于一实施例中所涉及的一储存系统端控制方案的流程图。

图5为图1所示冗余储存系统于一实施例中所涉及的一冗余能力搜寻方案。

图6为依据本发明另一实施例的一种冗余储存系统的示意图。

其中,附图标记说明如下:

10,10’冗余储存系统

12内建校验能力的文件系统

12’文件系统

12c,14c,16c,18c控制模块

13装置映像器

14raid-1储存系统

16raid-5储存系统

18drbd储存系统

disk(1),disk(2),…,disk(6)储存装置

100装置

110控制电路

120-1,120-2,…,120-n储存组件

210,212,…,232、步骤

310,312,…,340、

s1,s2,…,s62

具体实施方式

本发明的一或多个实施例提出一种使用在一冗余储存系统(redundantstoragesystem)的数据修复(datarecovery)机制,其中此冗余储存系统可为具有冗余储存能力的储存系统、或是由具有冗余储存能力的多个储存系统所组成的一个多层储存系统堆栈(multilayerstoragesystemstack)。例如:此储存系统可包括至少一容错式磁盘阵列(redundantarrayofindependentdisks,可简称为「raid」)或至少一分布式块装置(distributedreplicatedblockdevice,可简称为「drbd」),且数据修复机制可实施于此储存系统。又例如:多个储存系统可包括至少一raid或至少一drbd,且此数据修复机制可实施于多个储存系统中的任一者。

基于本发明一或多个实施例的数据修复机制,冗余储存系统可自动地修复或修正数据。例如:当文件系统或应用程序通过校验和(checksum)或哈希值(hashvalue),发现档案内容毁损时,数据修复机制可在背景自动地进行数据修复运作,并确保用户不会读取到不正确的内容。为了便于理解,内建校验能力的文件系统可作为冗余储存系统的文件系统的一例。

图1为依据本发明一实施例的一种冗余储存系统10的示意图,其中冗余储存系统10可包括上述的多层储存系统堆栈。例如:冗余储存系统10可包括一内建校验能力的文件系统12(其可简称为文件系统12),诸如一内建校验和能力的文件系统(其具备以预先储存的校验和检查数据区块错误的能力)、或一内建哈希值能力的文件系统(其具备以预先储存的哈希值检查数据区块错误的能力),且可还包括装置映像器(devicemapper)13。另外,冗余储存系统10可包括多个储存组件,诸如至少一储存系统与至少一储存装置(storagedevice)。尤其是,上述的至少一储存系统可包括多个储存系统,诸如raid-1储存系统14(其raid等级(raidlevel)为「raid1」)、raid-5储存系统16(其raid等级为「raid5」)以及drbd储存系统18,且上述的至少一储存装置可包括多个储存装置,诸如储存装置disk(1)、disk(2)、…与disk(6)。多个储存装置的每一者可包括至少一实体的储存媒体。例如:多个储存装置的任一者可为一整个硬式磁盘驱动器(harddiskdrive,可简称为「hdd」)、一整个固态硬盘(solidstatedrive,可简称为「ssd」)、一hdd中的一分割区(partition)或一ssd中的一分割区。此外,raid-1储存系统14、raid-5储存系统16与drbd储存系统18的每一者可包括多个储存装置的联合所组成的一存放集区(storagepool),其中用户可以把这个存放集区视为一个装置来使用。

为了便于说明,针对冗余储存系统10的多层中的某一层,诸如一特定层,位于所述特定层的下方的任一层(若存在)可称为一较低层(lowerlayer),而位于所述特定层的上方的任一层(若存在)可称为一较高层(upperlayer)。例如:所述较低层可以是紧邻于所述特定层;此状况下,所述较低层可视为一较低紧邻层(loweradjacentlayer),以下可简称为下层。又例如:所述较高层可以是紧邻于所述特定层;此状况下,所述较高层可视为一较高紧邻层(upperadjacentlayer),以下可简称为上层。

如图1所示,文件系统12可位于多层中的最上层(topmostlayer),而储存装置disk(2)、disk(3)、…与disk(6)可位于多层中的最底层(bottommostlayer),其中一组储存装置disk(2)、disk(3)与disk(4)属于raid-5储存系统16,且另一组储存装置disk(5)与disk(6)属于drbd储存系统18。储存装置disk(1)、raid-5储存系统16与drbd储存系统18位于多层中的一中间层(intermediatelayer;其对最底层而言是一较高层,对最上层而言是一较低层),且raid-1储存系统14位于多层中的另一中间层(其对最上层而言是一较低层,对最底层而言是一较高层),其中储存装置disk(1)、raid-5储存系统16与drbd储存系统18属于raid-1储存系统14。另外,于图1所示的树状架构中,文件系统12位于最上层,且装置映像器13可实施于文件系统12与raid-1储存系统14之间。此外,冗余储存系统10可包括对应于数据修复机制的多个控制模块,诸如控制模块12c、14c、16c与18c。例如:多个控制模块中的任一者可为对应于数据修复机制的一控制程序模块、或对应于数据修复机制的一控制电路。

于冗余储存系统10中,文件系统12、raid-1储存系统14、raid-5储存系统16与drbd储存系统18可分别于其各自的控制模块12c、14c、16c与18c的控制下进行运作。藉助于多个控制模块中的至少一部分(例如一部分或全部),诸如控制模块12c、14c、16c与18c,储存系统之间可以互相堆栈(例如:raid-1储存系统14下面可以存在另外一层的raid诸如raid-5储存系统16,也可以存在一个drbd系统诸如drbd储存系统18),以形成上述的多层储存系统堆栈。依据某些实施例,传统的储存系统和传统的储存装置也可以加入多层储存系统堆栈,即使它们都没有设置对应于数据修复机制的任何控制模块、或是根本没有冗余储存能力。例如:在修复毁损数据时,它们可以充分利用其下层储存系统堆栈(诸如多层储存系统堆栈当中位于它们的下的部分)的所有冗余能力。

于图1所示的实施例中,有三个有冗余能力的储存系统(诸如raid-1储存系统14、raid-5储存系统16与drbd储存系统18)堆栈在一起。在这三个储存系统以及位于最上层的文件系统12都设置了对应于数据修复机制的控制模块的状况下,冗余储存系统10最多可以提供对应于同一个档案的五个不同的版本,以供自动地进行数据修复。即使装置映像器13本身没有冗余储存能力、也没有设置对应于数据修复机制的任何控制模块,也不会影响到数据修复机制的运作。

多个控制模块诸如控制模块12c、14c、16c与18c可采用同一种沟通接口。对于多层中的系统/装置(诸如位于最上层的文件系统12、位于些中间层的储存装置或储存系统、或位于最底层的储存装置disk(2)、disk(3)、…与disk(6))而言,任两彼此紧邻层的系统/装置之间都需要事先定义好一组接口来沟通和传递数据。一般而言,不论文件系统12是以各种不同的操作系统(operatingsystem,os)中的哪一种操作系统来实施,冗余储存系统10中的各层可采用下面四类基本指令:

(cmd1).read(block_index);

(cmd2).write(data,block_index);

(cmd3).return(data,block_index);以及

(cmd4).return(err,block_index);

其中,对于一指令发送(commandsender)者,所述基本指令中的前两者是从特定层送往下层(诸如紧邻此指令发送者所在的那一层的下方一层)的指令,而所述基本指令中的后两者是从特定层送往上层(诸如紧邻此指令发送者所在的那一层的上方一层)的指令。于冗余储存系统10中,所述基本指令中的前两者可由文件系统12、装置映像器13、raid-1储存系统14、raid-5储存系统16与drbd储存系统18中的任一者向下发送,而所述基本指令中的后两者可由储存装置disk(1)、disk(2)、…与disk(6)中的任一者向上发送,也可由装置映像器13、raid-1储存系统14、raid-5储存系统16与drbd储存系统18中的任一者向上发送。例如:指令read(block_index)可用来从下层的储存装置或储存系统,读取对应于索引block_index的数据区块(datablock),故指令read(block_index)可称为读取指令。指令write(data,block_index)可用来将对应于索引block_index的数据data写入下层的储存装置或储存系统,故指令write(data,block_index)可称为写入指令。指令return(data,block_index)可用来将对应于索引block_index的数据data传回至上层,故指令return(data,block_index)可称为回复数据指令。指令return(err,block_index)可用来向上层回报,以将对应于索引block_index的数据读取运作(即,读取对应于索引block_index的数据区块的运作)的失败(failure)告知上层,故指令return(err,block_index)可称为回复错误指令,其中失败信息err指出此失败。

请注意,为了便于理解,所述基本指令是以上列例子中的格式来表示,以指出它们的主要特性。针对不同类型的操作系统,所述基本指令的详细定义可予以变化,但其主要特性会对应于上列例子。

数据修复机制(尤其是多个控制模块)可认得并采用所述基本指令,并可采用至少一额外指令(诸如一或多个额外指令),其可包括:

(cmd5).read_retry(block_index);

其中,对于一指令发送者,所述一或多个额外指令是从特定层送往下层(诸如紧邻此指令发送者所在的那一层的下方一层)的一或多个指令。于冗余储存系统10中,所述一或多个额外指令可由文件系统12、装置映像器13、raid-1储存系统14、raid-5储存系统16与drbd储存系统18中的任一者向下发送。例如:指令read_retry(block_index)可用来从下层的储存装置或储存系统,读取对应于索引block_index的冗余数据区块,以进行读取重试,故指令read_retry(block_index)可称为读取重试指令。在数据无误的状况下,对应于索引block_index的冗余数据区块中的数据会等同于对应于索引block_index的数据区块中的数据。

于某些实施例中,指令read_retry(block_index)和指令read(block_index)可以被整合成具有同一个名称的指令,诸如指令read(block_index,retry),但它们可用一个新的位旗标(bitflag)retry来彼此区别,其中位旗标retry可用来指出上述具有同一个名称的指令是否代表指令read_retry(block_index),故位旗标retry可称为重试位旗标。例如:当位旗标retry被设定为逻辑值1时,指令read(block_index,retry)代表指令read_retry(block_index);否则(即,位旗标retry被设定为逻辑值0),指令read(block_index,retry)代表指令read(block_index)。这样的设计很适合各种储存系统或储存装置的组合。假设下层中存在传统的储存组件(诸如传统的储存系统或传统的储存装置),其没有设置对应于数据修复机制的任何控制模块。由于此传统的储存组件不认得位旗标retry,所以会将位旗标retry继续往其下层传。若此传统的储存组件本身就是最底层的储存装置,则指令read(block_index,retry)会被单纯地视为指令read(block_index),而非指令read_retry(block_index)。这样的设计的好处是,虽然此传统的储存组件不认得指令read(block_index,retry)中的位旗标retry、也不认得指令read_retry(block_index),依然可以加入多层储存系统堆栈。

为了简明起见,于一些后续实施例中,指令read_retry(block_index)可作为上述的至少一额外指令的一例,其中指令read_retry(block_index)可代换成指令read(block_index,retry)。数据修复机制可依据一些预定准则来运作。例如:当发现档案内容错误的时候,数据修复机制可依据一深度优先搜寻(depth-firstsearch)准则来进行深度优先搜寻。尤其是,数据修复机制可逐一搜寻多层储存系统堆栈中所有可用的冗余储存能力;一旦发现正确的冗余版本,数据修复机制可立刻进行修复。由于在进行搜寻时,下层的储存装置或储存系统不一定有冗余能力、或者不一定设置有对应于数据修复机制的任何控制模块,所以数据修复机制可依据一停止搜寻准则来停止往下搜寻。基于停止搜寻准则,当一组预定条件中的任一者被满足时,多个控制模块中的某一控制模块(诸如文件系统12、raid-1储存系统14、raid-5储存系统16与drbd储存系统18中的每一者内的控制模块)可停止往下搜寻,而所述组预定条件可包括:

(c1).下层传回return(err,block_index)(即,下层以指令return(err,block_index)回复此控制模块);以及

(c2).当此控制模块已向下层发出两次read_retry(block_index),此控制模块收到两次一模一样的数据(即,下层两次以指令return(data,block_index)回复此控制模块,且两次送出的数据data是一模一样的数据);

其中预定条件(c1)中的指令return(err,block_index)可称为回复错误指令,代表传回return(err,block_index)者确定提供不了冗余版本。预定条件(c2)代表传回上述一模一样的数据者及其任何下层组件(诸如其任何下层储存系统、或其任何下层储存装置,若存在)确定提供不了冗余版本。上列预定条件(c1)与(c2)都代表此控制模块已经搜寻完下层所有的冗余能力,且因此必须继续搜寻此控制模块的兄弟层(sibling)、或是回传失败给此控制模块的上层。

在向下层发出指令read_retry(block_index)之后,此控制模块可从下层收到数据且自行计算对应于此数据的校验信息(诸如此数据的校验和或哈希值)。为了判断两次收到的数据是否一样,此控制模块可暂存此自行计算的校验信息。例如:若两次收到的数据的校验信息彼此吻合,则此控制模块可判断两次收到的数据是一模一样的数据;否则,此控制模块可判断两次收到的数据彼此相异。

为了避免冗余储存系统10中的暂存数据随着错误数据的增加而线性成长(甚至导致系统崩溃),当另一组预定条件中的任一者被满足时,此控制模块可释放或丢弃此自行计算的校验信息(诸如此校验和或此哈希值),其中另一组预定条件可包括:

(c11).此控制模块准备回传return(err,block_index)给上层;以及

(c12).此控制模块从上层收到指令write(data,block_index);

其中预定条件(c11)与(c12)中的每一者所涉及的索引block_index等同于此控制模块已向下层发出的指令read_retry(block_index)中的索引block_index。预定条件(c11)代表此控制模块已测试完毕冗余储存系统10当中位于此控制模块下方者的所有的冗余储存能力。上述位于此控制模块下方者就是,于多层当中,此控制模块所在位置以下的全部储存组件(诸如储存装置或储存系统)。另外,预定条件(c12)中的指令为写入指令,其代表数据修复机制在冗余储存系统10中的某一处找到了正确版本的数据。例如:于多层当中,此控制模块所在位置以上的某一层中的某一储存系统已从属于此储存系统的储存组件(诸如储存装置或储存系统)取得正确版本的数据,且通过指令write(data,block_index)写回正确的数据,尤其是将正确的数据写至其下层储存系统堆栈(诸如多层当中位于它的下的部分),其中上述某一层中的储存系统可视为此控制模块的文件系统端,因它位于此控制模块的上方,即文件系统12的那一端。于是,在收到指令write(data,block_index)时,此控制模块可释放有关(对应于索引block_index的)数据区块的所有暂存数据。

多个控制模块中的一控制模块可扮演「文件系统端」的角色与「储存系统端」的角色中的一者或两者,并进行对应的运作,其中对应于文件系统端的运作(可简称为「文件系统端运作」)包括此控制模块控制其下层时的控制运作,而对应于储存系统端的运作(可简称为「储存系统端运作」)包括此控制模块因应其上层的要求(request)而进行的运作。例如:文件系统12、raid-1储存系统14、raid-5储存系统16与drbd储存系统18各自的控制模块12c、14c、16c与18c均可扮演「文件系统端」的角色。又例如:raid-1储存系统14、raid-5储存系统16与drbd储存系统18各自的控制模块14c、16c与18c均可扮演「储存系统端」的角色。又例如:在一应用程序下达某一预定指令给文件系统12的状况下,文件系统12的控制模块12c也可扮演「储存系统端」的角色。实作上,此控制模块(诸如控制模块12c、14c、16c与18c中的一者)可实施成执行于至少一处理器(诸如一个或多个处理器)上的程序模块、或实施成客制化硬件电路。例如:在冗余储存系统10实施成服务器系统的状况下,上述的至少一处理器可为服务器系统中的处理器。

为了便于说明,此控制模块可用图2中的控制电路110来表示,而此控制模块的下层中的储存系统或储存装置可用图2中的n个储存组件{120-1,120-2,…,120-n}来表示(符号「n」可代表一个正整数),其中储存系统100可用来实现数据修复机制。例如:控制电路110可代表控制模块12c,而所述n个储存组件可包括raid-1储存系统14,其中n=1。又例如:控制电路110可代表控制模块14c,而n个储存组件可包括储存装置disk(1)、raid-5储存系统16与drbd储存系统18,其中n=3。又例如:控制电路110可代表控制模块16c,而n个储存组件可包括储存装置disk(2)、disk(3)与disk(4),其中n=3。又例如:控制电路110可代表控制模块18c,而n个储存组件可包括储存装置disk(5)与disk(6),其中n=2。

图3为图1所示冗余储存系统10于一实施例中所涉及的一文件系统端控制方案的流程图,其中文件系统端控制方案的步骤210、212、…与232的运作可作为所述文件系统端运作的例子。于一正常读取档案的流程中,文件系统12可向下层的储存装置或储存系统发出指令read(block_index),以要求读取某个数据区块,诸如对应于索引block_index的数据区块。为了实现数据修复机制,控制电路110可基于文件系统端控制方案进行下列运作。

于步骤210中,控制电路110可向下层的储存装置或储存系统发出指令read(block_index),以要求读取对应于索引block_index的数据区块。例如:下层的储存装置或储存系统传回读取到的数据以及读取到的校验和(其均应已储存于冗余储存系统10中,尤其是多层中的最底层)。

于步骤212中,控制电路110可检查读取到的数据是否与读取到的校验和吻合。例如:控制电路110可依据此读取到的数据进行计算,以自行产生对应于此读取到的数据的校验和,并将此自行产生的校验和以及此读取到的校验和进行比较。当这两个校验和彼此相同(即,此读取到的数据与此读取到的校验和吻合),则进入步骤226,以将读取到的数据回传给上层;否则(即,此读取到的数据与此读取到的校验和不吻合),则进入步骤214。例如:在控制电路110代表控制模块12c的状况下,上层可代表多层上方的应用程序。又例如:在控制电路110代表控制模块14c、16c或18c的状况下,控制电路110可通过上层将读取到的数据回传给多层上方的应用程序。

于步骤214中,控制电路110可向下层的储存装置或储存系统发出指令read_retry(block_index)。例如:控制电路110可利用指令read_retry(block_index)告知下层开始错误修复的程序,并将损坏数据的错误校验和(badchecksum;尤其是,步骤212中所述的此自行产生的校验和)暂时地储存起来。

于步骤216中,控制电路110可检查是否从下层取得(err,block_index)。当下层储存装置或储存系统以指令return(err,block_index)传回(err,block_index)作为响应(这表示下层已无其它份的冗余数据),则进入步骤230起的子工作路径,以向上层回报错误(步骤232);否则(例如:下层储存装置或储存系统可传回数据作为响应),进入步骤218。例如:在控制电路110代表控制模块12c的状况下,上层可代表多层上方的应用程序。又例如:在控制电路110代表控制模块14c、16c或18c的状况下,控制电路110可通过上层向多层上方的应用程序回报错误。

于步骤218中,控制电路110可检查读取到的数据(即,于步骤214之后刚刚读取到的数据)是否与先前暂存的错误校验和(若存在)吻合。例如:控制电路110可依据刚刚读取到的数据进行计算,以自行产生对应于此数据的校验和,并将此自行产生的校验和以及先前暂存的错误校验和进行比较。当这两个校验和彼此相同(即,于步骤214之后刚刚读取到的数据与先前暂存的错误校验和吻合,这表示下层已无其它份的冗余数据),则进入步骤230起的子工作路径,以向上层回报错误(步骤232);否则(即,于步骤214之后刚刚读取到的数据与先前暂存的错误校验和不吻合),则进入步骤220。

关于上述先前暂存的错误校验和,若它不存在,则步骤218中的此检查的结果可视为不吻合,故此状况下可进入步骤220。

于步骤220中,控制电路110可检查读取到的数据(即,于步骤218所述的数据)是否与读取到的校验和(即,因应步骤210中的指令read(block_index)而读取到的校验和)吻合。例如:控制电路110可依据此读取到的数据进行计算,以自行产生对应于此读取到的数据的校验和,并将此自行产生的校验和以及步骤210中所读取到的校验和进行比较。当这两个校验和彼此相同(即,步骤220中读取到的数据所产生的效验和与步骤210所读取到的校验和吻合),代表找到正确版本的数据,则进入步骤222,以将此读取到的数据写入下层;否则(即,此读取到的数据与此读取到的校验和不吻合),则进入步骤228。

于步骤222中,控制电路110可向下层的储存装置或储存系统发出指令write(data,block_index),以要求将步骤220中所述的此读取到的数据写入下层,以便修复损坏的版本。

于步骤224中,控制电路110可清除(于图3所示工作流程中)所储存的错误校验和。

于步骤226中,控制电路110可通过利用指令return(data,block_index)传回数据data(诸如步骤220中所述的此读取到的数据)予上层。

于步骤228中,控制电路110可储存冲突数据(corruptdata;尤其是,步骤220中所述的此读取到的数据)的错误校验和(尤其是,步骤220中所述的此自行产生的校验和)。之后,重新进入步骤214,以重复利用指令read_retry(block_index)去读取冗余版本的数据,直到将所有的冗余版本试完为止。

于步骤230中,控制电路110可清除(于图3所示工作流程中)所储存的错误校验和。

于步骤232中,控制电路110可通过指令return(err,block_index)向上层传回(err,block_index)作为响应,以向上层回报错误。

依据某些实施例,文件系统端控制方案中的所有的校验和可代换为哈希值,其中所有的错误校验和可代换为错误哈希值(badhashvalue)。所述实施例与前述实施例/变化例相仿之处不再重复赘述。

依据某些实施例,文件系统端控制方案中的指令read(block_index)可代换为指令read(block_index,retry=0)(其位旗标retry被设定为逻辑值0),而文件系统端控制方案中的指令read_retry(block_index)可代换为指令read(block_index,retry=1)(其位旗标retry被设定为逻辑值1)。所述实施例与前述实施例/变化例相仿之处不再重复赘述。

图4为图1所示冗余储存系统10于一实施例中所涉及的一储存系统端控制方案的流程图,其中储存系统端控制方案的步骤310、312、…与340的运作可作为所述储存系统端运作的例子。例如:在冗余储存系统10中,每一个数据区块可有多个冗余版本(诸如某一数据区块本身,以及此数据区块的至少一复制品、及/或此数据区块的至少一等效版本),而多个冗余版本中的任两者可彼此互为对方的备援(backup)版本。当需要读取此数据区块时,冗余储存系统10可读取多个冗余版本中的任一者,故多个冗余版本可视为此数据区块的候选者。多个冗余版本的候选者清单(candidatelist)可由控制电路110按照一预定规则动态推算出来,只要有需要随时可推算出候选者清单中的至少一部分(例如一部分或全部);因此,通常不需要将整个候选者清单列举起来存成一个对照表并储存在冗余储存系统10中的某处。基于候选者列表,冗余储存系统10可于需要时从多个冗余版本中选出一冗余版本。另外,候选者列表也可用于数据修复机制。藉助于候选者列表,数据修复机制可搜寻完所有可用的冗余版本而不会有遗漏。当需要读取冗余版本时,控制电路110可从候选者清单上最前面的候选者开始读取,而在候选者清单上,读取代价越小的候选者通常会排在越前面。例如:针对raid-5储存系统16,若某个数据区块的位置在储存装置disk(2)上,则此数据区块的候选者清单可以表示如下:{disk(2),(disk(3)⊕disk(4))};

其中符号「⊕」代表位互斥或(bitwiseexclusiveor,bitwisexor)运算。基于此候选者列表,此数据区块的候选者包括:位于储存装置disk(2)上的一冗余版本;以及位于储存装置disk(3)与disk(4)上的一冗余版本,诸如储存装置disk(3)与disk(4)中的相对应数据区块的位互斥或运算结果。为了实现数据修复机制,控制电路110可基于储存系统端控制方案进行下列运作。

于步骤310中,关于对应于索引block_index的数据区块,控制电路110可判断(从上层)所接收到的要求是否为重试要求诸如指令read_retry(block_index)。当所接收到的要求是重试要求,则进入步骤312,以从此数据区块的候选者清单上最前头的候选者开始执行指令read_retry(block_index);否则,进入步骤330,以使用正常的读取指令诸如指令read(block_index)去向下层要求读取此数据区块。

于步骤312中,控制电路110可检查是否能找到一候选者,诸如候选者清单上最新的领先候选者(leadingcandidate)。当找到此候选者时,则进入步骤314;否则,进入步骤338。

于步骤314中,控制电路110可向候选者清单上最新的领先候选者传送指令read_retry(block_index)。

于步骤316中,控制电路110可检查是否从下层取得(err,block_index)。当下层储存装置或储存系统以指令return(err,block_index)传回(err,block_index)作为响应(这表示最新的领先候选者有问题,例如读取失败),则进入步骤324;否则(例如:下层储存装置或储存系统可传回数据作为响应),进入步骤318。

于步骤318中,控制电路110可检查读取到的数据(即,于步骤314之后刚刚读取到的数据)是否与先前暂存的错误哈希值(若存在)吻合。例如:控制电路110可依据刚刚读取到的数据进行计算,以自行产生对应于此数据的哈希值,并将此自行产生的哈希值以及先前暂存的错误哈希值进行比较。当这两个哈希值彼此相同(即,于步骤314之后刚刚读取到的数据与先前暂存的错误哈希值吻合,这表示最新的领先候选者有问题,例如数据可能损坏),则进入步骤324,以从候选者清单移除此领先候选者;否则(即,于步骤314之后刚刚读取到的数据与先前暂存的错误哈希值不吻合),则进入步骤320。

关于上述先前暂存的错误哈希值,若它不存在,则步骤318中的此检查的结果可视为不吻合,故此状况下可进入步骤320。

于步骤320中,控制电路110可储存此数据的哈希值(即,于步骤314之后刚刚读取到的数据的哈希值,诸如上述自行产生的哈希值)。

于步骤322中,控制电路110可通过利用指令return(data,block_index)传回数据data(诸如步骤320中的数据)予上层。

于步骤324中,关于对应于索引block_index的此数据区块,控制电路110可从候选者清单移除领先的候选者(headcandidate),诸如步骤314中的最新领先候选者。例如:候选者列表上的每一候选者的记录中有个字段,而此字段可用来标示上述每一候选者是否有效,故控制电路110可利用此字段来注销某一候选者,其中候选者当中凡是被标示为无效者可视为被移除。又例如:控制电路110可清除某一候选者的记录,其中候选者当中凡是其记录被清除者可视为被移除。

于步骤326中,控制电路110可清除所储存的错误哈希值,诸如于步骤324中所移除的候选者的哈希值。

于步骤330中,控制电路110可向候选者清单上的一候选者传送指令read(block_index),以由候选者读取数据。

于步骤332中,控制电路110可检查是否从下层取得(err,block_index)。当下层储存装置或储存系统以指令return(err,block_index)传回(err,block_index)作为响应(这表示步骤330中的候选者有问题,例如发生读取失败),则进入步骤336;否则(例如:下层储存装置或储存系统可传回数据作为响应),进入步骤334。

于步骤334中,控制电路110可通过利用指令return(data,block_index)传回数据data(诸如于步骤330之后刚刚读取到的数据)予上层。

于步骤336中,关于对应于索引block_index的此数据区块,控制电路110可从候选者清单移除(步骤330中所述的)候选者。

于步骤338中,控制电路110可清除所储存的错误哈希值,诸如于步骤310之前所取得的哈希值。例如:基于步骤312的检查运作,当从步骤312进入步骤338时,就表示控制电路110的下层不存在任何有效的冗余版本,故控制电路110针对此数据区块所储存的任何哈希值可视为错误哈希值。

于步骤340中,控制电路110可通过指令return(err,block_index)向上层传回(err,block_index)作为响应,以向上层回报错误。

关于上述先前暂存的错误哈希值是否存在,另说明如下。于各种不同状况中的任一者,上述先前暂存的错误哈希值有可能存在、或不存在。例如:于步骤322中可传送数据data给上层,而上层拿到此数据data就会去比对哈希值,如果有错误的哈希值就会暂存起来,接着进行重试要求,这个时候就会有错误的哈希值存在;然而,如果哈希值经比对后,被确认是正确的,就代表于步骤322中所传送的数据data是正确的,故可以进行写入动作。

另外,关于候选者清单的某些实施细节另说明如下。依据某些实施例,对于各种类型的具有冗余能力的储存系统中的任一者而言,它的控制电路(诸如控制电路110)可依据对应的预定规则(诸如上述的预定规则)推算出任一个数据区块的候选者清单。于此候选者清单中,存取代价较小者通常会排在前面,而存取代价较大者通常会排在后面。若有数个候选者代价都相同,则预定规则通常会被妥善的设计,以保证每次针对此数据区块查询此候选者清单时,都会得到一样的结果,而不至于有不同的候选者顺序。例如:图1所示的raid-5储存系统16的控制模块16c可得知raid-5储存系统16之下有3个储存装置disk(2)、disk(3)与disk(4)。基于对应于raid-5储存系统16的预定规则,如果某个数据区块储存在储存装置disk(2)上,则此数据区块的第一候选者一定是储存装置disk(2),这是因为可以直接读取、代价比较低;虽然从储存装置disk(3)与disk(4)也可以组合出此数据区块,不过需要读取两次再进行位互斥或运算,故代价较高。又例如:图1所示的raid-1储存系统14的控制模块14c可依据对应的预订规则得知,raid-1储存系统14的任一数据区块的候选者清单可以是:

(block_index)modn1,(block_index+1)modn1,(block_index+2)modn1,...,(block_index+n1-1)modn1;

其中符号「n1」代表raid-1储存系统14的储存装置(诸如一个或多个hdd及/或一个或多个ssd)的数目。这样,冗余储存系统10就不需要额外的储存装置空间来储存许多分别对应于全部区块的候选者列表,以节省储存容量。

依据某些实施例,当控制电路110向下层传送指令read_retry(block_index)且从下层中的一候选者取得此数据区块的数据时,控制电路110可自行计算对应于此数据的校验信息(诸如此数据的校验和或哈希值),且可暂存此自行计算的校验信息。之后,若从另一候选者读到同样的数据区块内容(例如:当两次收到的数据的校验信息彼此吻合),这表示另一候选者的来源储存组件,诸如下层的这个候选储存系统或候选储存装置,已用光了所有的冗余能力。此状况下,控制电路110可将此候选者从候选者清单中剔除,且清除暂存值,继续搜寻下一个候选者(如步骤312、314、316、318、324与326的运作所示)。这样的流程可一直重复,直到文件系统12找到正确版本(例如文件系统12使用指令write(data,block_index)来修复)、或是控制电路110试光了所有的候选者为止。

依据某些实施例,储存系统端控制方案中的所有的哈希值可代换为校验和。所述实施例与前述实施例/变化例相仿之处不再重复赘述。

依据某些实施例,储存系统端控制方案中的指令read_retry(block_index)可代换为指令read(block_index,retry=1)(其位旗标retry被设定为逻辑值1),而储存系统端控制方案中的指令read(block_index)可代换为指令read(block_index,retry=0)(其位旗标retry被设定为逻辑值0)。所述实施例与前述实施例/变化例相仿之处不再重复赘述。

图5为图1所示冗余储存系统10于一实施例中所涉及的一冗余能力搜寻方案。例如:冗余储存系统10可具备五份的冗余能力,其中一数据区块诸如上述者可具有五个冗余版本。依据本实施例,冗余能力搜寻方案的步骤s1、s2、…与s62可指出数据修复机制的冗余能力搜寻顺序。例如:在步骤s1、s2、…与s62全部被依序执行的状况下,数据修复机制可将冗余储存系统10的五个冗余版本全部搜寻过一遍。

如图5所示,步骤s1至s6可对应于指令read(block_index),并可视为正常读取流程。例如:指令read(block_index))可逐层地从文件系统12通过装置映像器13与raid-1储存系统14传送至储存装置disk(1)(步骤s1至s3),而储存装置disk(1)的回复(诸如以指令return(data,block_index)所传回的数据data)可逐层地通过raid-1储存系统14与装置映像器13传送至文件系统12(步骤s4至s6)。另外,步骤s7至s62可对应于指令read_retry(block_index),并可视为重试读取流程,其中步骤s1至s62可搜寻所有可用的冗余能力。基于文件系统端控制方案,当发现校验和错误,文件系统12(尤其是其控制模块12c)可触发重试读取流程。例如:指令read_retry(block_index)可逐层地从文件系统12通过装置映像器13与raid-1储存系统14传送至储存装置disk(1)(步骤s7至s9),而储存装置disk(1)的回复(诸如以指令return(data,block_index)所传回的数据data、或以指令return(err,block_index)所传回的失败信息err)可逐层地通过raid-1储存系统14与装置映像器13传送至文件系统12(步骤s10至s12)。例如:当重试结果不成功,控制模块12c、14c、16c与18c可基于文件系统端控制方案与储存系统端控制方案进行后续运作(诸如步骤s13至s62的至少一部分),直到(依据停止搜寻准则)判断应当停止搜寻为止。例如:于对储存装置disk(1)重试完毕之后,控制模块14c可排除储存装置disk(1)(步骤s9、s10、s15与s16)。又例如:于对储存装置disk(2)重试完毕之后,控制模块16c可排除储存装置disk(2)(步骤s18、s19、s26与s27)。又例如:于对储存装置disk(3)与disk(4)的组合(尤其是其相对应数据区块的位互斥或运算结果)重试完毕之后,控制模块16c可排除储存装置disk(3)与disk(4)(步骤s28、s29、s36与s37)。又例如:于对raid-5储存系统16重试完毕之后,控制模块14c可排除raid-5储存系统16及其下层(步骤s17、s20、s25、s30、s35与s38)。依此类推。

为了便于理解,图5中有许多步骤。例如:当五个冗余版本都是错的,则步骤s1至s62可全部执行。又例如:当五个冗余版本中的一者是正确的,则只要找到此正确的版本,就可以停止搜寻;尤其是,停止在步骤s1至s62中的一中间(intermediate)步骤。由于五个冗余版本全错的机率很小,故步骤s1至s62全部执行的机率也很小。实作上,为了降低成本,多层储存系统堆栈可以简化,例如其特定一或多个部分可移除,故冗余版本的总数可减少、且步骤s1至s62可对应地简化。另外,由于控制电路110在有需要时才会采用上述至少一额外指令诸如指令read_retry(block_index),故在冗余储存系统10正常、没有错误的情况下读写时,本发明并不会对冗余储存系统10造成多余的负担。

依据某些实施例,应用程序可包括一控制模块,诸如一应用程序端控制模块,其中应用程序端控制模块可扮演「文件系统端」的角色,并可基于文件系统端控制方案来运作,以进行数据验证。执行于上述至少一处理器的应用程序端控制模块可作为控制电路110的一例。

图6为依据本发明另一实施例的一种冗余储存系统10’的示意图。相较于图1所示的架构,冗余储存系统10’中的文件系统12’原本为一未内建校验能力的文件系统,其中应用程序可存取文件系统12’。另外,应用程序端控制模块可对文件系统12’进行数据修复。例如:为了进行数据验证,应用程序端控制模块可针对需要保护的档案去个别地产生校验信息(诸如校验和或哈希值)。当应用程序端控制模块通过档案的校验信息发现档案内容有误时,可以利用指令read(block_index,retry)将此错误通过文件系统12’告知其下层储存系统堆栈(诸如文件系统12’下方的储存系统或储存装置),以容许控制模块12c、14c、16c与18c基于文件系统端控制方案与储存系统端控制方案进行运作。例如:应用程序端控制模块可进行数据验证的工作,而文件系统12’只需要负责传递指令与数据。如此,数据修复机制可以在不重建文件系统12’的情况下,达到修复毁损数据的功能。

关于图6所示的架构的某些实施细节另说明如下。依据某些实施例,未内建校验能力的文件系统可通过升级或更新其软件或韧体,而被赋予发出指令read_retry(block_index)的能力。例如:文件系统12’原本所存的旧档案都无附带校验和或哈希值,且文件系统12’原本也不会向下层发出指令read_retry(block_index)。通过升级文件系统12’的软件或韧体,可使文件系统12’具备控制模块12c的能力。之后,通过妥善设计、撰写的应用程序(诸如上述的应用程序)可读取档案的内容,并可将算出来的校验和或哈希值存在原档案的扩充字段(extendedattributes)中、或是存成另外一个新档案。例如:针对具有文件名filename的档案,应用程序可将算出来的校验和或哈希值存入一个新档案,诸如具有档名filename.md5的档案。当下次再读取此新档案时,应用程序可同时把两个档案(期分别具有档名filename及filename.md5)读取出来,以比对校验和或哈希值。当发现错误时,所述实施例中的控制电路110(诸如控制模块12c、14c、16c与18c中的任一者)即可通过指令read_retry(block_index)来尝试修复。如此,数据修复机制可以在不重建文件系统12’且不搬动数据的情况下,达到修复毁损数据的功能。于某些实施例中,类似的概念也可应用在原本不具备本发明的控制模块的储存系统,诸如软件仿真的raid数组卡(例如:工具程序模块「mdadm」所管理的软件raid;其中工具程序模块「mdadm」目前未见合适的中文译名)、或硬件的raid数组卡,一样可以通过升级软件或韧体的方式,使其具备本发明的特定一或多个控制模块诸如控制模块12c、14c、16c与18c,并且因此认得指令read_retry(block_index)并做出相对应的数据修复程序。此外,所述一或多个控制模块底下所有已存有数据的储存装置都不需要做修改,即可具备修复损毁数据的功能。

请注意,传统有冗余能力的储存系统仅能针对整个储存装置毁损的情况去保护,既无法侦测位衰减,也没有有效的手段去修复它。相较于现有技术,本发明可进行自动数据验证与自动数据修复,以确保用户总是读取到正确可靠的数据内容。另外,本发明的兼容性高、应用范围广。数据修复机制可通过软件、韧体与硬件中的一者或多者来实现,且不需修改储存系统或储存装置上的数据。例如:现有的各种raid、drbd、甚至是硬件的raid数组卡,都可以通过升级软件或韧体来实现数据修复机制,以得到自动数据验证及自动数据修复的能力。对于已储存有大量数据的储存系统的用户而言,不需要搬动数据即可轻易地实施本发明的架构。此外,本发明容许用户将任意数量、任意类型的储存装置与储存系统组合成储存系统堆栈诸如上述者,其中在修复数据的时候,数据修复机制可让上层使用到下层储存系统的冗余能力。若没有上述至少一额外指令(诸如指令read_retry(block_index)或指令read(block_index,retry=1)),这样的储存系统堆栈中的下层储存系统的冗余能力原本是不可见的(对上层而言)。基于上述至少一额外指令(诸如指令read_retry(block_index)或指令read(block_index,retry=1);不论是否实施于文件系统层或储存系统层),数据修复机制能确保堆栈中所有储存系统的冗余能力可在有需要时被利用。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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