CN101095116A - 允许各种规模存储装置的动态可扩展和可收缩的容错存储***和方法 - Google Patents
允许各种规模存储装置的动态可扩展和可收缩的容错存储***和方法 Download PDFInfo
- Publication number
- CN101095116A CN101095116A CN 200580045895 CN200580045895A CN101095116A CN 101095116 A CN101095116 A CN 101095116A CN 200580045895 CN200580045895 CN 200580045895 CN 200580045895 A CN200580045895 A CN 200580045895A CN 101095116 A CN101095116 A CN 101095116A
- Authority
- CN
- China
- Prior art keywords
- storage
- memory
- data
- piece
- hash
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Techniques For Improving Reliability Of Storages (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种允许各种规模的存储装置的动态地可扩展和可收缩的容错存储***。如果可能的话,就冗余地跨一个或多个存储装置存储数据。随着存储装置的添加或删除,自动再配置跨一个或多个存储装置的数据布局,以尽可能地为数据提供适当级别的冗余。可以采用基于散列函数的压缩技术,从而降低存储器的消耗。还公开了释放未使用存储块的技术。
Description
技术领域
本发明涉及数字数据存储***和方法,更具体地涉及那些提供容错存储的***和方法。
背景技术
已知现有技术依照根据各种RAID(独立磁盘冗余阵列)协议的任何一种的模式来提供冗余磁盘存储器。使用RAID模式的典型磁盘阵列是需要由经验丰富的信息技术人员来管理的复杂结构。而且在许多使用RAID模式的阵列设计中,如果所述阵列中的各磁盘驱动器是非均匀容量的,那么该设计可能不能够使用超过该阵列中最小驱动器容量的驱动器上的任何容量。
使用标准RAID***的一个问题是盘面损坏可能发生在磁盘阵列中不经常使用的区域。在另一个驱动器故障的情况下,并不总是能确定发生了损坏。在这种情况下,当所述RAID阵列重构所述故障驱动器时,损坏的数据可能被传播和保存。
在许多存储***中,按就绪状态(ready state)维持备用存储设备,使得其可以在另一个存储设备故障时被使用。这种备用存储设备通常被称作“热后备”。所述热后备在存储设备常规操作期间并不用于存储数据。当运行的存储设备故障时,该故障存储设备由该热后备逻辑上替换,而且要移动数据或者通过其他方式在所述热后备上再产生数据。当修复或者更换所述故障存储设备时,典型地要移动数据或者通过其他方式在(重新)运行的存储设备上重新产生这些数据,而且使所述热后备脱机,以准备好在另一个故障事件中使用。热后备的维护通常是复杂的,并因此通常由经验丰富的管理者进行操纵。热后备磁盘同样代表着附加费用。
发明内容
本发明的第一实施例提供了一种方法,用于在包括至少一个存储装置的存储装置组中存储数据。所述方法包括根据多种冗余模式自动确定一种混合冗余模式,用于在该存储装置组中存储数据,以提供容错功能,并在该存储装置组正好包括多个存储容量不同的装置时提供改善存储效率;以及利用混合冗余模式在该存储装置组中存储数据。
在相关实施例中,所述方法还包括,自动再配置利用第一种冗余模式先前存储在第一种布置的各存储装置中的数据,以利用下述之一进行存储:(a)相同布置的各存储装置上的第二种冗余模式,(b)不同布置的各存储装置上的第二种冗余模式,以及(c)不同布置的各存储装置上的相同冗余模式,用于在无数据损失情况下适应空间的扩展和收缩中的至少一个,所述扩展是通过向该组中添加其它存储装置实现的,而所述收缩是通过从该组中移除存储装置实现的。
在本发明的第二实施例中提供了一种方法,用于按允许存储装置组动态扩展和收缩的方式,在包括至少一个存储装置的存储装置组中存储数据。该方法包括利用第一种冗余模式在存储装置组中存储数据,根据存储装置组的构成的变化,利用下述之一自动再配置该存储装置组上的数据:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置的第二种冗余模式,以及(c)不同布置的存储装置上的相同冗余模式。
在本发明的第三实施例中,提供了一种用于存储数据的***,包括具有至少一个存储装置的存储装置组,以及利用混合冗余模式在该存储装置组中存储数据的存储管理器。存储管理器自动从多个冗余模式中确定所述混合冗余模式,用于在该存储装置组中存储数据,以提供容错功能,并在该存储装置组正好包括多个存储容量不同的装置时提供改善的存储效率。
在相关实施例中,存储管理器自动再配置利用第一种冗余模式先前存储在第一种布置的存储装置中的数据,以利用下述之一进行存储:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置上的第二种冗余模式,以及(c)不同布置的存储装置上的相同冗余模式,用于无数据损失地适应空间的扩展和收缩中的至少一个,所述扩展是通过向组中添加其它存储装置实现的,而所述收缩是通过从组中移除存储装置实现的。
在本发明第四实施例中,提供了一种用于存储数据的***,包括至少具有一个存储装置的存储装置组,以及在该存储装置组中存储数据的存储管理器。所述存储管理器利用第一冗余模式在该存储装置组中存储数据,根据存储装置组的构成的变化,利用下述之一自动再配置该存储装置组上的数据:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置的第二种冗余模式,以及(c)不同布置的存储装置上的相同冗余模式。
在相关实施例中,可以从包括下述的组中选择所述冗余模式,即,镜像、具有奇偶校验的条带化、RAID6、双奇偶校验、对角线奇偶校验、低密度奇偶校验检测码以及turbo码。
在相关实施例中,通过下述方式可以再配置数据,即,把跨两个存储装置的镜像模式转换为单个存储装置上的镜像模式;把跨第一对存储装置的镜像模式转换为跨第二对存储装置的镜像模式;把跨三个存储装置的条带化模式转换为跨两个存储装置的镜像模式;把跨第一组多个存储装置的第一条带化模式转换为跨第二组多个存储装置的第二条带化模式;把跨一个存储装置的镜像模式转换为跨两个存储装置的镜像模式;把一个存储装置上的镜像模式转换为另一个存储装置上的镜像模式;把跨两个存储装置的镜像模式转换为跨三个存储装置的条带化模式;把跨第一组多个存储装置的第一条带化模式转换为跨包括添加到所述组的存储装置的第二组多个存储装置的第二条带化模式。
在另一个相关实施例中,可以把对象分析为块(chunk),每个块都具有特定的内容,并且在存储***中只存储具有唯一性内容的块。所述块能够根据预定散列函数被标识为具有唯一性内容。在该实施例中,只存储标识为唯一的块可以涉及为每个块计算散列号,并在存储***中存储与所存储的块的散列号相联系的对象的唯一标识符及其位置信息。存储用于对象的唯一标识符涉及使用对象表,该对象表列出用于该对象的唯一标识符以及用于所存储块的散列号。存储位置信息可涉及在块表中存储用于每个存于其中的块列表,包括块在存储***中的物理位置的表示。存储在存储***中的对象可以被转换为单个存储装置以及文件***和对象存储***中的至少一个的表示。可以管理存储***中块的物理存储分配,从而提供容错存储,甚至在存储***可能包括各种容量的存储装置时。一旦从存储***中取出特定的块,就根据所存储的块的散列号检验所取出块的内容。例如,通过计算取出块的散列号;以及对计算出的散列号与为所述块相应存储的散列号进行比较。
在本发明的又一实施例中,提供了一种在存储装置组中存储数据的方法,包括利用至少一种冗余模式在存储装置组中存储数据,检测存储装置从所述组中的移除,利用剩下的存储装置再配置被移除的存储装置中的数据部分,检测被移除的存储装置是否重新***所述组中,释放对应于所述部分的重新***的存储装置中的区域,以及刷新所述重新***的存储装置的所有剩余部分,该部分可能在移除和重新***时被更改。
在本发明的又一实施例中,提供了一种在存储***中释放未使用的存储块的方法,该方法包括标识空闲块,为所述空闲块确定逻辑扇区地址,根据所述逻辑扇区地址为所述空闲块标识聚簇存取存取表项,与所述聚簇存取表项相关的引用计数递减,以及如果被递减的引用计数为0的话就释放该块。
在相关实施例中,标识所述空闲块包括标识与主机文件***关联的空闲块位图,以及分析所述空闲块位图以标识不再被文件***使用的聚簇。标识与主机文件***关联的空闲块位图包括维持分区表,分析该分区表以定位操作***分区,分析操作***分区以定位超块;以及根据超块标识主机文件***。可以制作空闲块位图的工作副本,其中所述空闲块位图的工作副本被分析以标识文件***不再使用的聚簇。
附图说明
通过参考下列附图参照下列详细说明,本发明上述特征将变得更加容易理解,其中:
图1示出本发明的实施例,其中将对象分析为一系列存储块。
图2是说明在相同实施例中块的容错存储模式如何根据附加更多存储器而动态改变。
图3说明本发明另一实施例,在使用不同大小存储设备构造的存储***上按不同容错模式的块的存储。
图4说明本发明的另一个实施例,其中指示器状态用于警告无效存储使用和低等级容错。
图5是根据本发明实施例的所述数据存储、检索和再布局中使用的功能模块框图。
图6表示在包含两个以上驱动器的阵列中使用镜像的示例。
图7表示使用不同布局模式以存储其数据的一些示例性存储区。
图8表示用于实施后备卷(sparse volume)的查找表。
图9表示根据本发明示例性实施例的状态指示器,其用于具有可用存储空间并按容错方式操作的示例性阵列。
图10表示根据本发明示例性实施例的状态指示器,其用于不具有足够空间以维护冗余数据存储并必须增加更大空间的示例性阵列。
图11表示根据本发明示例性实施例的状态指示器,其不能够维护故障情况下的冗余数据。
图12表示根据本发明示例性实施例的示例性阵列的状态指示器,其中存储设备已经故障。用存储设备填充插槽B、C、和D。
图13示出的模块层次表示示例性实施例的不同软件层以及它们彼此如何相关。
图14表示根据本发明实施例的聚簇存取表如何用于访问存储区中的数据聚簇。
图15表示根据本发明实施例的日志表更新。
图16表示根据本发明实施例的驱动器布局。
图17示出了根据本发明实施例的存储区0的布局和其他存储区如何被参照。
图18说明了根据本发明实施例的读差错处理。
图19说明了根据本发明实施例的写差错处理。
图20是根据本发明实施例的逻辑流程图,其说明了通过差错管理程序的坏区域备份。
图21是根据本发明实施例的示意框图,其表示存储阵列的相关组件。
图22是根据本发明实施例的逻辑流程图,其表示管理虚拟热后备的示例性逻辑。
图23是根据本发明实施例的逻辑流程图,其说明确定每个可能磁盘故障的再布局情况的示例性逻辑,如图22的框2102。
图24是根据本发明实施例的逻辑流程图,其表示调用虚拟热后备功能的示例性逻辑。
图25是根据本发明实施例的逻辑流程图,其表示自动再配置一个或多个剩余驱动器以恢复数据容错的示例性逻辑,如图24的框2306。
图26是根据本发明实施例的逻辑流程图,其用于升级存储设备。
具体实施例
如在本说明书和权利要求书中使用的,除非上下文另有要求,下面术语具有如下所解释的意思。
对象的“块(chunk)”是对象的提取片,由所使用的物理存储独立地形成,且典型地是对象的固定数量的连续字节。
数据存储的容错“模式”是指在一个或者多个存储设备上冗余地分布数据的特定方式,并且除了其他的,可以是:镜像(mirroring,例如按类似RAID1的方式)、条带化(striping,例如按类似RAID5的方式)、RAID6、双奇偶校验、对角线奇偶校验、低密度奇偶校验码、涡轮式码、或者其他冗余模式或者这些冗余模式的组合。
当给定块所产生的散列号通常与其他任何块的散列号都不同时,除非当其他块具有与该给定块相同的数据内容,该给定块的散列号是“唯一的(unique)”。即,当两个块的内容不相同,通常将具有不同散列号。如下们所要进一步详细描述的,在本上下文中,术语“唯一的”用于覆盖由那些偶尔对不同的块产生相同散列号的散列函数所产生的散列号,因为散列函数通常不能完美地在对不同的块产生不同的数。
“区域(region)”是存储介质(例如硬盘驱动器)上的一组连续物理块。
“存储区(zone)”是由两个或以上的区域组成的。组成存储区的各区域通常不需要连续。如下面示例性实施例所述,存储区存储相当于1GB的数据或者控制信息。
“聚簇(cluster)”是存储区中的单元尺寸,并表示压缩单位(下面论述)。如下面所述的示例性实施例所述,聚簇是4KB(即八个512字节的扇区)并且实质上等同于块。
“冗余集(redundant set)”是对一组数据提供冗余的一组扇区/聚簇。
“备份区域(backing up a region)”涉及将一个区域的内容复制到另一个区域。
存储设备的“第一对”和“第二对”可以包括公共的存储设备。
存储设备的“第一组多个”和“第二组多个”可以包括一个或者多个公共的存储设备。
存储设备的“第一布置”和“第二布置”或者“不同布置”可以包括一个或多个公共的存储设备。
图1是本发明实施例的说明,其中,将对象(object)分析成一系列用于存储的块(chunk),在本例中对象是文件(file)。开始,文件11被传递到存储软件,在其中被指定为对象12并被分配一个唯一对象标识号,在此是#007。在对象表13中形成新项131,用来表示这个新对象的分配。现在该对象被分析成数据“块”121、122、和123,它们是固定长度的对象段。每个块都经过散列算法,该算法返回块的唯一散列号。以后这个算法可以应用于检索块,并且结果与原始散列相比较以确保重试块与存储的相同。所述每个块的散列号按对象132的项行存储在对象表13中,以便于以后所述完成对象可以通过所述各块的集合进行检索。
同样在图1中,所述块散列现在与块表14中现有项进行比较。任何匹配现有项141的散列都已经存储并且因此不采取任何行动(即数据不会再次存储,导致对象的自动压缩)。新散列(在块表14中没有对应项的一个)被输入块表141。然后块中的数据以最有效容错存储方式存储在可用存储设备151、152、和153上。这种方法可例如导致所述块数据按镜像方式存储在包括一个或者两个设备的存储***上,或者按奇偶校验条带化存储在具有两个以上存储设备的***。这种数据将在物理位置1511、1521、和1531存储在存储设备上,而且这些位置和位置编号将存储在块表列143和142中,使得以后可以定位和检索块的所有物理部分。
图2说明在相同实施例中块的容错存储模式如何根据增加更多附加存储而动态改变。特别地,图2示出了一旦附加存储被添加到整个***,块的物理存储如何在所述存储设备上按新模式来布局。在图2(a)中,所述存储***包括两个存储设备221和222,而块数据在位置2211和2221被物理镜像到所述两个存储设备上以提供容错。在图2(b)中,添加第三存储设备223,以奇偶校验条带化方式存储所述块成为可能,这种模式较之所述镜像模式是更有效的存储。所述块按新模式布局在三个物理位置2311、2321、和2331,占用更少比例的可用存储。更新所述块表21以表现在三个位置212新布局,并且还在213记录新的块物理位置2311、2321、和2331。
图3示出根据本发明实施例的成熟存储***,其已经运行一段时间。该图说明了各块如何随时间在存储容量变化的存储设备上进行物理存储。该图示出包括40GB的存储设备31、80GB的存储设备32和120GB的存储设备33的存储***。最初,各块按容错条带化模式34来存储,直到40GB存储设备31变满。然后,由于缺乏存储空间,新数据就按镜像模式存储到80GB32和120GB33存储设备的可用空间上。一旦80GB存储设备32满了,则新数据按单个硬盘容错模式37来布局。尽管存储设备包括用于存储数据的单一存储池(pool),如按块存储的数据本身已经按多种不同模式来存储。
图4说明本发明另一实施例,其中指示器状态用于警告低效的存储使用和低级的容错。在图4A中,全部三个存储设备41、42和43具有空闲空间,而指示灯44是绿色以表示数据以有效和容错方式存储。在图4B中,40GB存储设备41已经变满了,因此新数据可按镜像模式只能存储在具有剩余空闲空间的两个存储设备42和43上。为了表示数据仍然十分冗余但不能有效存储,指示灯44变成黄色。在图4C中,仅120GB存储设备43具有空闲空间剩余,因此全部新数据可以按镜像模式仅存储在这一台设备43上。因为容错性不强并且***临界地缺乏空间,因此指示灯44变红以指示需要增加更多存储。
在一个替换实施例中,为阵列中每台驱动器/插槽提供指示器,例如,以三色灯形式(例如绿、黄、红)。在一个特定实施例中,所述灯用于照亮具有发光效果的硬盘机柜的整个前面。控制这些灯不仅用于指示该***的整体状态,还用于指示哪个驱动器/插槽需要加以注意(若有的话)。每个三色灯都可以处于至少四种状态:分别是关闭、绿色、黄色、红色。如果特定插槽为空且***按充足存储和冗余在运行因此不需要在插槽中安装驱动器,则相应插槽的灯可以处于关闭状态。如果相应驱动器充足并且不需要替换,则特定插槽的灯可以置于绿色状态。如果***运行在降级,则可以将特定插槽的灯置于黄色状态,以建议用较大驱动器替换相应驱动器。如果相应驱动器必须安装或者替换,则特定插槽的灯可以置于红色状态。如果需要或者期望的话,可以指示附加状态,例如,通过在开启状态和关闭状态之间闪烁灯或者在两种不同颜色(例如在替换驱动器之后并且进行数据重新布局时在红色和绿色之间闪烁灯)。下面说明示例性实施例的附加细节。
当然,可以使用其他指示技术来指示***状态和驱动器/插槽状态。例如,单个LCD显示器可以用于指示***状态,并且如果需要的话,可以指示需要注意的插槽号。同样,可以使用其他类型指示器(例如,***单个状态指示器(例如绿色/黄色/红色),还有每个插槽的插槽指示器或者灯)。
图5是根据本发明实施例的数据存储、检索和重新布局中使用的功能模块框图,如上与图1至3相关的讨论。通信的公共入口和出口点是对象界面511,用于将对象传递给***用于存储或者从***检索对象,框界面512,它让存储***看来像是一个更大的存储设备,以及CIFS接口513,它让存储***看来像是Windows文件***。当这些界面需要数据存储时,数据被传递到块分析器52,所述分析器52将数据分析为块,并在对象表512中创建初始项(如上与图1相关的讨论)。这些块被传递散列码生成器53,散列码生成器53产生每个块的相关联散列码,并将其输入到对象表中,这样与每个对象相关联的各块被列出512。块散列号与块表531中的项进行比较。在发现匹配时,该新块被废弃,因为它与已经存储在该存储***中的某个块相同。如果块是新的,则在块表531中为其建立新项,而且将散列的块传递到物理存储管理器54。该物理存储管理器以可能的最有效模式在可用存储设备571、572、和573上存储该块,并在块表531中制作相应项以表示哪里已经发生该块的物理存储,使得以后可以在512检索该块的内容(如上与图1的相关讨论)。
图5中由对象界面511、框界面512或者CIFS界面513的数据检索通过向检索管理器56请求来执行,检索管理器查询对象表521以确定哪个块包括该对象,然后从物理存储器54请求这些块。所述物理存储管理器54询问块表格531以确定所请求的块存储在哪里,然后检索它们并将完成数据(对象)传递回检索管理器56,检索管理器56向请求界面返回该数据。图5还包括容错管理器(FTL)55,其不断扫描块表以确定块是否以可能的最有效方式存储。(这可能由于添加和去除存储设备571、572、和573而改变。)如果块不是以最有效方式存储,则FTL将请求物理存储管理器创建该块的新布局模式并更新块表531。这样全部数据对构成该阵列的若干存储设备按可能的最有效方式来存储(如上与图2和3相关的讨论)。
下面提供本发明示例性实施例的其他细节。
数据布局模式——存储区(zone)
除了其他,存储区影响隐式冗余和存储在盘上的实际数据的盘再布局。存储区在不影响存储区用户的情况下使得可增加和改变的附加布局方法。
存储阵列在盘上按称作存储区的虚拟分段来布局数据。存储区存储给定的和固定数量的数据(例如1G字节)。存储区驻留在单个盘或者跨越一个或者多个驱动器。存储区的物理布局以特定于该存储区的形式提供冗余。
图6示出在包含两个以上驱动器的阵列中使用镜像的示例。图7示出使用不同布局模式来存储它们的数据的一些示例存储区。该图假定存储区存储1GB数据。注意以下几点:
i)跨多个驱动器的存储区不需要在整个集合中使用到驱动器的相同偏移。
ii)单个驱动器镜像需要2G的存储量来存储1G的数据。
iii)双驱动器镜像需要2G存储量来存储1G的数据。
iv)3驱动器条带化需要1.5GB存储量来存储1G的数据。
v)4驱动器条带化需要1.33GB存储量来存储1G的数据。
vi)存储区A、存储区B等是任意的存储区名。在实际实施例中每个存储区都用唯一编号来标识。
vii)虽然通过该图隐含,存储区不是必须在盘上连续的(见后面所述的区域)。
viii)为什么镜像被限于(不超过)两个驱动器没有技术原因。例如,在三个驱动器的***1中,数据的副本可存储在1驱动器上,且半数镜像数据可以存储在另外两个驱动器的每个上。同样,数据可跨三个驱动器来镜像,一半数据在两个驱动器的每个上以及一半镜像在其他两个驱动器上。
数据布局模式——区域(region)
每个盘都分割为一组相等尺寸的区域。区域的尺寸比存储区小得多,存储区由来自一个或者多个盘的一个或者多个区域构成。为了有效使用盘空间,区域的尺寸典型地是不同存储区尺寸和阵列所支持的不同盘数量的公因数。在示例性实施例中,区域是存储区数据尺寸的1/12。下面的表列出了根据本发明示例性实施例的各种布局的区域/存储区的数量和区域/盘的数量。
布局方法 | 区域/存储区的数量 | 区域/盘的数量 |
1驱动器镜像 | 24 | 24 |
2驱动器镜像 | 24 | 12 |
3驱动器镜像 | 18 | 6 |
4驱动器镜像 | 16 | 4 |
各区域可以标记为:使用、空闲或者损坏。当创建存储区时,选择来自适当盘的一组空闲区域并登记到表中。这些区域可以是任何任意顺序而且不需要在盘上连续。当从存储区读取或者向其写入数据时,存取被重定向到适当区域。除了其他,这允许以灵活和有效的方式发生数据再布局。随着时间的过去,不同尺寸的存储区将可能发生存储碎片化(fragmentation),使得许多盘区太小而不能保持完整存储区。通过使用适当区域尺寸,所有存储片所遗留的间隙都将至少是一个区域的尺寸,这些小间隙易于重用,而不必重新分段整个盘。
数据布局模式——再布局
为了便于实施,可以强制扩展和收缩的固定顺序。例如,如果突然增加两个驱动器,存储区的扩展可以经过中间扩展,就像增加一个驱动器一样,然后执行第二扩展以结合第二个驱动器。或者,包含多个驱动器的扩展和收缩可以自动处理,不需要中间步骤。
在任何再布局之前,所需空间都必须是可用的。这应当在开始再布局之前计算,以确保不会发生不必要的再布局。
数据布局模式——驱动器扩展
下面根据本发明示例性实施例描述从单驱动器镜像扩展为双驱动器镜像的一般过程:
i)假定单驱动器镜像具有数据‘A’和镜像‘B’
ii)在驱动器上分配12个区域以扩展存储区到‘C’
iii)复制镜像‘B’到区域集‘C’
iv)任何已经复制的对数据的写都必须镜像到‘C’中的适当位置
v)当完成复制时,使用新布局类型更新存储区表并利用指向‘C’的指针来替换指向‘B’的指针
vi)将构成‘B’的区域标记为空闲的。
下面根据本发明示例性实施例,描述从双驱动器镜像扩展为具有奇偶校验的三驱动器条带化的一般过程:
i)假定一个驱动器具有数据‘A’而第二驱动器具有镜像‘B’
ii)为奇偶校验信息‘C’在第三驱动器上分配6个区域
iii)使用‘A’的第一组6区域和‘B’的第二组6区域计算奇偶校验信息
iv)在‘C’中放置奇偶校验信息
v)任何已经处理的对数据的写都必须奇偶校验到‘C’中适当位置
vi)当复制完成时,用新布局类型点表将存储区表更新为‘A’的前一半,‘B’和‘C’的后一半
vii)标记‘A’的前一半和‘B’的前一半为空闲
下面描述根据本发明示例性实施例的从三驱动器条带化扩展为具有奇偶校验的四驱动器条带化的一般过程:
i)假定一个驱动器具有数据‘A’,第二驱动器具有数据‘B’而第三个具有奇偶校验‘P’
ii)对条带数据‘C’在第四驱动器上分配四个区域
iii)将‘A’的最后两个区域复制到‘C’的最初两个区域
iv)将‘B’的最初两个区域复制到‘C’的最后区域
v)在奇偶校验驱动器‘D’上分配四个区域
vi)使用A、C的最初四个区域和B的最后四个区域计算奇偶校验信息
vii)在‘D’中放置奇偶校验信息
viii)任何已经处理的对数据的写都必须奇偶校验到‘D’中适当位置
ix)用新布局类型和点表更新存储区表为‘A’‘C’的最初四区域、‘B’和‘D’的其次四区域
x)标记‘A’的最后两区域和‘B’的最初两区域为空闲。
数据布局模式——驱动器收缩
驱动器收缩在盘去除或者故障时发生。在这种情况下,如果可能的话,阵列收缩数据使全部存储区返回到冗余状态。驱动器收缩比扩展稍微复杂,由于要做更多选择。但是,在布局方法之间的转换按照与扩展相类似的方式发生,但要反过来。保持要再生的数据量为最小以使得尽快实现冗余。在空间可用时,驱动器收缩通常一次处理一个存储区,直到全部存储区被再布局。
选择如何收缩
下表描述根据本发明示例性实施例的用于需要再布局的每个存储区决策树:
存储区类型缺失数据 | 条件 | 操作 |
任何 | 对存储区再布局没有可用空间 | 让存储区处于降级状态直到增加新盘或者替换去除的盘 |
单驱动器镜像 | 数据不一致 | 锁定***并等待复位或者替换缺失的驱动器 |
双驱动器镜像 | 在***剩下1个盘 | 转换为单驱动器镜像 |
仅在包含剩余数据的驱动器上有可用空间 | ||
在***剩留下具有可用空间的2或3个盘 | 在其他驱动器上重建镜像 | |
3驱动器条带化 | ***剩下具有可用空间的2个盘 | 转换为2驱动器镜像 |
***剩下具有可用空间的3个盘 | 第三驱动器上重构缺失的条带化分片 | |
4驱动器条带化 | ***剩下具有可用空间的3个盘 | 转换为3驱动器条带化 |
下面描述根据本发明示例性实施例的从双驱动器镜像收缩为单驱动器镜像的一般过程:
i)假定单驱动器镜像具有数据‘A’和缺失的镜像‘B’或者反过来
ii)在包含‘A’的驱动器上分配12个区域作为‘C’
iii)将数据‘A’复制到区域集‘C’
iv)任何已经复制的对数据的写都必须镜像到‘C’中适当位置
v)当复制完成时,用新布局类型更新存储区表并用指向‘C’的指针替换指向‘B’的指针
下面说明根据本发明示例性实施例的从三驱动器条带化收缩为双驱动器镜像(缺失奇偶校验)的一般过程:
i)假定所述条带由不同驱动器上的数据块‘A’、‘B’、‘C’组成。缺失奇偶校验‘C’。
ii)定义‘A’为包括该存储区的前一半,而‘B’为该存储区的后一半。
iii)在‘A’驱动器上分配6个区域的‘D’并在‘B’驱动器上分配6个区域的‘E’。
iv)将‘A’复制到‘E’。
v)将‘B’复制到‘D’。
vi)任何已经复制的对数据的写都必须镜像到‘D’和‘E’中的适当位置
vii)当复制完成时,用新布局类型更新存储区表并将指针设置到指向‘A’/‘D’和‘E’/‘B’
下面说明根据本发明示例性实施例的从三驱动器条带化收缩为双驱动器镜像(缺失数据)的一般过程:
i)假定所述带由不同驱动器上的数据块‘A’‘B’‘C’组成。缺失数据‘C’。
ii)定义‘A’为包括该存储区的前一半,而‘C’为该存储区的后一半。
iii)在‘A’驱动器上分配6个区域的‘D’并在‘B’驱动器上分配12个区域的‘E’。
iv)将‘A’复制到‘E’的前一半。
v)重构从‘A’和‘B’缺失的数据。将数据写入‘D’。
vi)将‘D’复制到‘E’的后一半。
vii)任何已经复制的对数据的写都必须镜像到‘D’和‘E’中的适当位置
viii)当复制完成时,用新布局类型更新存储区表并将指针设置为指向‘A’/‘D’和‘E’
ix)将‘B’区域标记为空闲。
下面说明根据本发明示例性实施例的从四驱动器条带化收缩为三驱动器条带化(缺失奇偶校验)的一般过程:
i)假定所述条带由不同驱动器上的数据块‘A’‘B’‘C’和‘D’组成。缺失奇偶校验‘D’。
ii)定义‘A’为包括存储区的前三分之一,‘B’为第二个三分之一,而‘C’为第三个三分之一。
iii)在‘A’驱动器上分配2个区域的‘G’,在‘C’驱动器上分配2个区域的‘E’并在‘B’驱动器上分配6个区域的‘F’。
iv)将‘B’的前一半复制到‘G’。
v)将‘B’的后一半复制到‘E’。
vi)从‘A’/‘G’和‘E’/‘C’构造奇偶校验并将其写入‘F’。
vii)任何已经复制的对数据的写都必须镜像到‘D’、‘E’和‘F’中的适当位置
viii)当复制完成时,用新布局类型更新存储区表并将指针设置为指向‘A’/‘G’、‘E’/‘C’和‘F’
ix)将‘B’区域标记为空闲。
下面说明根据本发明示例性实施例的从四驱动器条带化收缩为三驱动器条带化(缺失前1/3)的一般过程:
i)假定所述条带由不同驱动器上的数据块‘A’‘B’‘C’和‘D’组成。缺失数据‘A’。
ii)定义‘A’为包括存储区的前三分之一,‘B’为第二个三分之一而‘C’为第三个三分之一以及‘D’为奇偶校验。
iii)在‘B’驱动器上分配4个区域的‘E’,在‘C’驱动器上分配2个区域的‘F’并在‘D’驱动器上分配6个区域的‘G’。
iv)将‘B’的后一半复制到‘F’。
v)根据‘B’、‘C’和‘D’构造缺失数据并写入‘E’
vi)根据‘E’、‘B’的前一半和‘F’/‘C’构造新奇偶校验并写入‘G’
vii)任何已经复制的对数据的写都必须镜像到‘B’、‘E’、‘F’和‘G’中的适当位置
viii)当复制完成时,用新布局类型更新存储区表并将指针设置为指向‘E’、‘B’的前一半和‘F’/‘C’以及‘G’
ix)将‘B’的后一半和‘D’区域标记为空闲。
下面说明根据本发明示例性实施例的从四驱动器条带化收缩为三驱动器条带化(缺失第二个1/3)的一般过程:
i)假定所述条带由不同驱动器上的数据块‘A’‘B’‘C’和‘D’组成。缺失数据‘B’。
ii)定义‘A’为包括存储区的前三分之一,‘B’为第二个三分之一而‘C’为第三个三分之一以及‘D’为奇偶校验。
iii)在‘A’驱动器上分配2个区域的‘E’,在‘C’驱动器上分配2个区域的‘F’并在‘D’驱动器上分配6个区域的‘G’。
iv)根据‘A’的前一半、‘C’的前一半和‘D’的前一半构造缺失数据并写入‘E’
v)从‘A’的后一半、‘C’的后一半和‘D’的后一半构造缺失数据并写入‘F’
vi)从‘A’/‘E’和‘F’/‘C’构造新奇偶校验并写入‘G’
vii)任何已经复制的对数据的写都必须镜像到‘E’、‘F’和‘G’中的适当位置
viii)当复制完成时,用新布局类型更新存储区表并将指针设置为指向‘E’‘F’以及‘G’
ix)将‘D’区域标记为空闲。
下面说明根据本发明示例性实施例的从四驱动器条带化收缩为三驱动器条带化(缺失第三个1/3)的一般过程:
i)假定所述条带由不同驱动器上的数据块‘A’‘B’‘C’和‘D’组成。缺失数据‘C’。
ii)定义‘A’为包括该存储区的前三分之一,‘B’为第二个三分之一而‘C’为第三个三分之一以及‘D’为奇偶校验。
iii)在‘A’驱动器上分配2个区域的‘E’,在‘B’驱动器上分配4个区域的‘F’并在‘D’驱动器上分配6个区域的‘G’。
iv)将‘B’的前一半复制到‘E’
v)根据‘A’、‘B’和‘D’构造缺失数据并写入‘F’
vi)从‘A’/‘E’和‘B’/‘F’的后一半构造新奇偶校验并写入‘G’
vii)任何已经复制的对数据的写都必须镜像到‘E’、‘F’和‘G’中的适当位置
viii)当复制完成时,用新布局类型更新存储区表并将指针设置为指向‘A’/‘E’和‘B’/‘F’的后一半以及‘G’
ix)将‘B’的前一半和‘D’区域标记为空闲。
例如,再次参考图3,如果驱动器0或者驱动器1丢失,只要在驱动器2上有足够的可用空间,就可以在驱动器2上重构双驱动器镜像(存储区B)。类似地,如果损失任何驱动器0至2,只要驱动器3上有足够可用空间,三驱动器镜像(存储区C)就可以利用驱动器3重构。
数据布局模式——存储区重构
当已经去除驱动器并且剩余驱动器上有足够空间用于理想的存储区再布局或者驱动器已经用新的或者更大尺寸驱动器替换,会发生存储区重构。
下面说明根据本发明示例性实施例的双驱动器镜像重构的一般过程:
i)假定单驱动器镜像具有数据‘A’和缺失镜像‘B’
ii)在不同于包含‘A’的驱动器的驱动器上分配12个区域的‘C’
iii)将数据A’复制到‘C’
iv)任何已经复制的对数据的写都必须镜像到‘C’中适当位置
v)当复制完成时用指向‘C’指针更新存储区表指向‘B’的指针
下面说明根据本发明示例性实施例的三驱动器条带化重构的一般过程:
i)假定一个驱动器具有数据‘A’,第二驱动器具有数据‘B’而第三个具有奇偶校验‘P’。缺失‘B’。注意缺失哪片无关紧要,在所有情况下需要的操作都是相同的。
ii)在不同于包含‘A’和‘P’的驱动器的驱动器上分配6个区域的‘D’
iii)从‘A’和‘P’构造缺失数据。向‘D’写数据
iv)任何已经复制的对数据的写都必须奇偶校验到‘D’中的适当位置
v)用指向‘D’的指针替换指向‘B’的指针以更新存储区表
在这个示例性实施例中,四驱动器重构仅当如果去除的驱动器被其他驱动器替换时发生。所述重构包括在新驱动器上分配六个区域并根据其他三个区域集合重构缺失的数据。
数据布局模式——暂时缺失驱动器问题
当去除驱动器而没有用于再布局的空间时,阵列将继续按降级模式来运行,直到其他旧驱动器插回或者用新的替换该驱动器。如果***新的驱动器,那么将再建驱动器组。在这种情况下,数据将再布局。如果旧的盘放回该阵列,那么其将不再是当前盘组的一部分并且将被视其为新盘。但是,如果该阵列中没有放入新盘而是放回旧的那个,那么旧的那个将仍然被视为该盘组的一员,尽管是被废弃的成员。在这种情况下,任何已经再布局的存储区都将保持其新配置而该旧盘上的区域将空闲。任何没有被再布局的区域仍然指向该旧盘存储区的适当区域。但是,由于已经对降级存储区执行了某些写,因此这些存储区需要刷新。可以标记已经改变的降级区域,而不是记录每个已经发生的写。这样,当替换盘时,仅已经改变的区域需要刷新。
而且,任何已经被写入的存储区可被置于更高的优先表用于再布局。这应当减少了应该替换盘的需要刷新的区域数量。还可以使用超时,在这一点之后,即使该盘被替换也将被擦去。但是,这种超时可能相当大,可能是数小时而非数分钟。
数据布局模式——数据完整性
如上所述,标准RAID***的一个问题是可能盘面损坏发生在盘阵列的不常使用的区域。在另一个驱动器故障的情况下,经常不能确定损坏已经发生。在这种情况下,当RAID阵列重建该故障驱动器时,会传播并保存该损坏的数据。
上述散列机制提供在RAID下可用的数据破坏检测的附加机制。如在其他地方提及的,当存储某个块(chunk)时,为该块计算并存储散列值。每次读取该块的时候,都可以计算检索块的散列值并与存储的散列值进行比较。如果该散列值不匹配(指示损坏的块),那么块数据可以根据冗余数据恢复。
为了最小化在其中可能发生盘上数据损坏的时间窗口,将执行盘数据常规扫描以尽快发现并校正损坏的数据。也可选地允许执行对阵列读取的检查。
数据布局模式——卷(volume)
在后备卷中,不管阵列中盘上可用存储空间量如何,总是要求阵列是固定尺寸——例如M千兆字节。假定该阵列包含实际存储空间的S字节,其中S<=M,并且可以请求的数据存储在M千兆字节空间的位置L1、L2、L3等。如果所请求的位置Ln>S,那么用于Ln的数据必须存储在位置Pn<S。这通过基于Ln的包括查找表的索引Pn来进行管理,如图8所示。这种特征使得阵列与不支持卷扩展的操作***共同工作,所述操作***例如Windows、Linux、和苹果操作***。另外,该阵列可以提供多个都共享相同物理存储器的后备卷。每个后备卷都将具有专用查找表,但是将共享数据存储器的相同物理空间。
驱动器插槽指示器
如上所述,存储阵列包括一个或者多个驱动器插槽。每个驱动器插槽都可以是空的或者容纳硬盘驱动器。每个驱动器插槽具有能够指示四种状态的专用指示器,所述四种状态是:关闭、正常、降级和故障。该状态通常解释如下:
指示器状态 | 对阵列用户的含义 |
关闭 | 驱动器插槽为空并且对待***的附加驱动器是可用的 |
正常 | 插槽中的驱动器正确运行 |
降级 | 用户建议的操作:如果插槽为空,则向这个插槽增加驱动器;如果插槽已包含驱动器,则应该用另一个更高容量的驱动器替换该驱动器。 |
故障 | 由用户请求的ASAP操作:如果插槽为空,则向这个插槽增加驱动器;如果插槽已包含驱动器,则用另一个更高容量的驱动器替换该驱动器。 |
在这个示例性实施例中,红/黄/绿发光二极管(LED)用作指示器。所述LED通常解释如下:
LED状态 | 指示器状态 | 可发生状态的示例情况 | 附图 |
关闭 | 关闭 | 插槽为空。阵列有可用空间。 | 9,10,12 |
绿色 | 正常 | 驱动器正确运行,阵列数据冗余并且阵列有可用盘空间。 | 9,10,11,12 |
黄色 | 降级 | 阵列接近故障条件;盘故障情况下,没有足够空间维护冗余数据。 | 11 |
红色 | 故障 | 该插槽中的盘已经故障并且必须替换;阵列没有足够空间维护冗余数据存储而且必须增加更多空间。 | 10,12 |
图9示出了根据本发明示例性实施例的具有可用存储空间并按容错方式运行的示例性阵列。用存储设备填充插槽B、C和D,并且有充足存储空间可用于冗余地存储附加数据。插槽B、C和D的指示器是绿色(指示这些存储设备操作正确,阵列数据冗余,且该阵列具有可用磁盘空间),而插槽A的指示器关闭(指示插槽A中不需要填充存储设备)。
图10示出了根据本发明示例性实施例的示例性阵列,其不具有足够空间用于维持冗余数据存储,并且必须要增加更大空间。插槽C和D中的存储设备是满的。插槽B、C和D的指示器是绿色(指示这些存储设备正确运行),而插槽A的指示器是红色(指示该阵列没有足够空间用来维持冗余数据存储以及插槽A中应当填充存储设备)。
图11示出了根据本发明示例性实施例的在故障情况下不能维持冗余数据的示例性阵列。插槽A、B、C和D用存储设备填充。插槽C和D中的存储设备是满的。插槽A、B、和C的指示器是绿色(指示它们正确运行),而插槽D的指示器是黄色(指示插槽D中的存储设备应当用具有更大存储容量的存储设备来填充)。
图12示出了根据本发明示例性实施例的示例性阵列,其中的存储设备已经故障。用存储设备填充插槽B、C和D。插槽C中的存储设备故障。插槽B和D的指示器是绿色(指示它们正确运行),而插槽C的指示器是红色(指示应当替换插槽C中的存储设备),而插槽A的指示器关闭(指示插槽A中不需要填充存储设备)。
下面说明本发明示例性实施例的软件设计。该软件设计基于六个软件层,其跨越从物理访问该磁盘到与主机计算***通行的逻辑体系结构。
在这个示例性实施例中,文件***驻留在主服务器上,例如Windows、Linux、或者苹果服务器,并访问如USB或者iSCSI设备的存储阵列。由主请求管理器(HRM)处理经过主界面到达的物理盘请求。主I/O界面将主USB或者iSCSI界面的表示协调至该主机(host),以及与HRM有接口。HRM协调来自主I/O界面的数据读/写请求,调度读和写请求,并在它们完成时协调这些请求的结果返回该主机。
本存储阵列的主要目的是保证一旦***接受数据,其按可靠方法来存储,使用***当前存储的最大量冗余。随着该阵列改变物理配置,而重新组织数据以维持(以及可能最大化)冗余。另外,基于压缩的简单散列用于减少使用的存储量。
最基本的层包括盘驱动器,用来在不同盘上存储数据。可以经由各种接口连接盘,例如经USB接口的ATA隧道。
所述盘上的扇区被组织成区域、存储区和聚簇,其中每个都具有不同逻辑角色。
区域表示盘上的一组连续物理块。在四驱动器***中,每个区域是1/12GB大小,并表示冗余的最小单位。如果发现区域中的扇区是物理损坏的,那么将放弃整个区域。
存储区表示冗余单位。存储区包括一组区域,可能在不同盘上用来提供适当的冗余量。存储区将提供1GB的数据容量,但是可能需要更多的区域以便于提供冗余。具有冗余的1GB需要12个区域的集合(1GB);1GB镜像存储区需要两组1GB的区域(24个区域);1GB三盘条带化存储区将需要三组0.5GB的区域(18个区域)。不同存储区将具有不同冗余特征。
聚簇表示压缩的基本单位,并且是存储区之内的单元尺寸。它们当前是4KB:8×512字节扇区大小。许多盘上的聚簇会包含相同数据。聚簇存取表(CAT)用于经由散列函数追踪聚簇的使用。CAT在逻辑主地址和存储区中适当聚簇位置之间转换。
当向盘写入时,散列函数用于发现数据是否已经存在于该盘上。如果是,CAT表中的适当项会被设置为指向现有聚簇。
CAT表驻留在其自己的存储区。如果超过该存储区大小,会使用附加存储区,并且使用表把逻辑地址映射到该存储区用于CAT的部分。换句话说,预分配存储区用于包含该CAT表。
为了减少主写入等待时间并保证数据可靠性,日志管理器将记录全部写请求(或者写入盘或者写入NVRAM)。如果***重启,在重启时要提交日志项。
磁盘可以添加或者去除,或者如果发现区域已经损坏则可以让该区域退出。在任何这些情况下,布局管理器都可以在存储区中重组区域,以改变其冗余类型,或者改变存储区的区域构成(如果某个区域被损坏)。
由于存储阵列提供虚拟盘阵列因此通过改变物理盘空间的级别来返回,并且由于提供分块级别的接口,当聚簇不再被文件***使用时就不是显然的。结果,所使用的聚簇空间将继续扩展。垃圾收集器(位于主机或者按固件形式)将分析该文件***以确定哪个聚簇已经空闲,并且从散列表中删除它们。
下表示出了根据本发明该示例性实施例的六个软件层:
层5:垃圾收集器,主接口(USB/iSCSI) |
层4:主请求管理器 |
层3:CAT,HASH,日志管理器 |
层2:存储区管理器。分配/释放称作存储区的扇区块。知道SDM、DDM、SD3等,以处理差错和差错恢复。布局管理器 |
层1:读/写物理聚簇/扇区。分配每张盘的区域。 |
层0:盘存取驱动器 |
图13示出了模块层次,其表示不同软件层和它们彼此的关系。软件层优选地固定以便于提供清晰的API和描述。
垃圾收集器释放不再由主文件***使用的聚簇。例如,当删除文件时,优选地释放用于包含该文件的聚簇。
日志管理器提供某种形式的写日志,从而在电源故障或者其他差错条件的情况下不丢失挂起的写操作。
布局管理器提供存储区相对于其区域的运行时再布局。这可能根据盘***/删除或者故障而发生。
聚簇管理器在一组数据存储区中分配聚簇。盘利用守护程序(diskutilization daemon)周期性检查空闲的盘空间。
加锁表(Lock Table)处理写操作冲突问题后的读操作。
主请求管理器处理来自主机和垃圾收集器的读/写请求。写操作被传递到日志管理器,而读操作经由聚簇存取表(CAT)管理层来处理。
如上所述,在典型文件***中,一定量的数据通常实质上重复。为了减少盘空间利用,这种数据的多个复制不会写入该盘。而是写入一个实例,相同数据的其他全部实例引用(reference)这一个实例。
在本示例性实施例中,任何时间***在数据聚簇上操作(例如8个物理扇区),而这是散列的单位。使用SHA1算法来产生160位的散列值。这样具有很多好处,包括好的唯一性,并且被许多处理器在片上支持。全部160位将存储在散列记录中,但是仅最低16位被用作散列表中的索引。其他匹配该最低16位的实例将经由链接表链接。
在这个示例性实施例中,仅一个读/写操作可以同时发生。为了性能的目的,当向磁盘写聚簇时不允许发生散列分析。而散列分析将由散列管理器作为背景活动而发生。
从日志的写队列读取写请求,并处理以完成写操作。为了保证数据一致性,如果已经有写操作在该聚簇上活动,必须延迟该写操作。在其他聚簇上的操作可以不受阻碍的进行。
除非写整个聚簇,否则写入的数据将需要与现有存储在该聚簇中的数据归并。根据逻辑扇区地址(LSA),定位聚簇的CAT项。从这个记录获得散列关键字、存储区和聚簇偏移信息,然后它们可用于搜索散列表以发现匹配。这就是聚簇。
双重散列该散列表可能是必需的;一旦经由SHA1摘取(digest),然后就通过存储区/聚簇偏移用于改进正确散列项的查找速度。如果已经使用了散列记录,引用计数被递减。如果引用计数现在为零,并且没有由散列项快照引用,该散列项和聚簇可被释放回它们各自的空闲表。
现在归并原来的聚簇数据和聚簇的更新扇区,而且数据要被再散列。新的聚簇从空闲表中被剔除,把归并数据写入该聚簇,向散列表中增加新项,CAT表中的项更新为指向该新聚簇。
作为更新散列表的结果,该项同样添加到用于由背景任务处理的内部队列。这个任务将把新添加的聚簇和散列项与匹配该散列表行地址的其他散列项进行比较,如果它们重复,将结合记录,在适当时释放散列项和CAT表项。这保证了写等待时间不由这个活动负担。如果在这个处理期间发生故障(例如掉电),则可以根据丢失数据删除各种表。各个表应当以这种方式管理,最终的提交是原子的(atomic),或者日志项可以再运行,如果它没有全部完成的话。
下面是写逻辑的伪代码:
While(stuff to do)
WriteRecord=journalMgr.read();
1sa=writeRecord.RetLsa();
catEntry=catMgr.GetCATEntry(1sa);
if(catMgr.writeInProgress(catEntry))delay();
originalCluster=catMgr.readCluster(catEntry);
originalHash=hashMgr.calcHash(originalCluster);
hashRecord=hashMgr.Lookup(originalHash,zone,offset);
if((hashRecord.RefCount==1)&&(hashRecord.snapshot=0))
hashRecord.free();
originalCluster.free();
//注意这里有某种优化,可重用该聚簇而无须释放或重新分配它。
//otherwise,still users of this cluster,so update & leave it alone
hashRecord.RefCount--;
hashRecord.Update(hashRecord);
//现在添加新记录
mergedCluster=mergeCluster(originalCluster,newCluster);
newHash=hashMgr.calcHash(mergedCluster);
newCluster=clusterMgr.AllocateCluster(zone,offset);
clusterMgr.write(cluster,mergedCluster);
zoneMgr.write(cluster,mergedCluster);
...
hashMgr.addHash(newHash,newCluster,zone,offset)
(internal:queue new hash for background processing)
catMgr.Update(1ba,zone,offset,newHash);
//我们已成功完成该日志项。移至下一个。
JournalMgr.next();
读请求同样按每次一个聚簇(相对于“扇区”)来处理。读请求不通过上述的习惯于散列的处理。而是,使用主逻辑扇区地址来引用(reference)CAT并获得存储区编号和聚簇到该存储区的偏移。读请求应当在CAT缓存中查找CAT表项,并且必须在设置了写进行位(write-in-progress bit)时延迟。其他读/写可以不受阻止的进行。为了改进数据完整性检查,当读聚簇时,其将被散列,并且该散列值与存储在散列记录中的SHA1散列值进行比较。这将需要使用该散列、存储区和聚簇偏移作为进入散列表的搜索关键字。
分配聚簇用作尽可能少的存储区。这是因为存储区直接对应于盘驱动器利用率。对每个存储区而言,硬驱动器阵列上有两个或者更多区域。通过最小化存储区数量,物理区域的数量最小化,并由此减少硬盘驱动器阵列上的空间消耗。
聚簇管理器分配来自一组数据存储区的聚簇。使用链接列表保持追踪存储区中的空闲聚簇。但是,空闲聚簇信息在磁盘上存储为位图(32KB每存储区)。该链接列表从位图(bit map)动态地构造。最初,在存储器中创建特定量空闲扇区的链接列表。当分配聚簇时,该列表收缩。在预定最低点,从磁盘上的位图提取表示空闲聚簇的新链接列表节点。这样,为了发现用于分配的空闲聚簇,不需要分析位图。
在这个示例性实施例中,散列表是64K记录表(由散列的低16位索引)并且具有下列格式:
偏移 | 位尺寸 | 名称 | 值/有效范围 | 说明 |
0 | 160 | Sha1散列 | 完整SHA1散列摘取 | |
16 | RefCount | 该散列的实例数;如果超出16位我们该怎么办 | ||
18 | 聚簇偏移 | 存储区中的聚簇偏移 | ||
14 | 存储区# | 包含该聚簇的存储区# | ||
8 | 快照 | 每快照实例一位用于指示该聚簇项由该快照使用。该模型支持8个快照(可能仅7个) |
全零的聚簇可以相当常见,因此全零的情况可以视作特殊情况,例如,使得永远不被删除(因此覆盖计数将不是问题)。
当多个散列具有相同最低有效散列时,或者当两个散列项指向不同数据聚簇时,使用空闲散列记录的链接列表。在两种情况下,空闲散列记录都将从该列表中取出,并经由pNextHash指针链接。
散列管理器将整理全部添加到散列表中的项并将合并该盘上的相同聚簇。随着新的散列记录增加到该散列表中,消息将被传递到散列管理器。这可由散列管理器自动执行。作为背景活动,散列管理器即将处理其队列上的项。将比较全部散列值以发现其是否匹配任何现有散列记录。如果是,将同样比较完整聚簇数据。如果聚簇匹配,则新散列记录可以被废除回空闲队列,散列记录计数递增,并且重复的聚簇将被返回聚簇空闲队列。当合并记录时,散列管理器必须注意向前传播快照位。
聚簇存取表(CAT)包含间接指针。该指针指向存储区中的数据聚簇(0是第一数据聚簇)。一个CAT项引用单个数据聚簇(暂定4KB大小)。使用CAT(连同散列)使得当存在大量重复的数据时减少盘使用需求。单个CAT通常表示连续存储块。CAT包含在非数据存储区中。每个CAT项是48位。下表示出每个项如何布局(假定每个数据存储区包含1GB数据):
位0-17 | 位18-31 | 位32-47 | 位48-63[...] |
存储区中数据聚簇的偏移 | 包含数据的存储区# | 散列关键字 | 保留。候选包括垃圾收集器写位;快照位;快照表格散列关键字 |
希望CAT适合64位,但这不是必需的。2TB阵列的CAT表当前是至4GB大小。每个CAT项指向包含该数据和存储区编号的存储区。
图14显示CAT如何用于存取存储区中的数据聚簇。冗余数据通过CAT中的一个以上的项来引用。两个逻辑聚簇包含相同数据,因此它们的CAT项指向相同物理聚簇。
散列关键字包含完整聚簇160位SHA1散列值的16位摘取。这个项用于在写操作期间更新该散列表。
CAT中的每个项有足够的位用于引用16TB的数据。但是,如果每个数据聚簇都彼此不同(根据内容),那么只需要3个存储区的CAT项来引用2TB的数据(每个存储区都是1GB大小,并由此可以存储1GB/大小的CAT项。假定6字节CAT项,则178956970项/存储区,即表引用大约682GB/存储区,如果每个聚簇是4K的话)。
主逻辑扇区转换表用于将主逻辑扇区地址转换成存储区编号。相应于主逻辑扇区地址的CAT部分将驻留在这个存储区中。注意每个CAT项表示4096字节的扇区大小。这是八个512字节扇区。下面显示主逻辑扇区转换表的表示:
启动主逻辑扇区地址 | 结束主逻辑扇区地址 | CAT的存储区# |
0(聚簇#0) | 1431655759(聚簇#178956969) | |
1431655760(聚簇#178956970) | ... |
可以预分配存储区以保持整个CAT。换句话说,存储区可以分配给CAT,如需要更多CAT项。由于CAT把2TB虚拟磁盘映射至主扇区地址空间,因此由主机做硬盘分区或者格式化期间将引用CAT的很大部分。为此,要预分配存储区。
CAT是大的1GB/存储区表。使用的工作聚簇集将是来自这个大表的后备集。为了性能的原因,活动的项(可能暂时)可以在处理器存储器中缓存而不总是从磁盘读取。至少有两个选项用于填充该缓存——来自CAT的个别项,或者来自CAT的整个聚簇。
因为写进行(write-in-progress)与CAT缓存表相组合,所以需要确保该缓存中保持全部未完成的写。因此,需要该缓存至少与未完成写请求的最大数量一样大。
缓存中的项数将是聚簇大小(即4K)。需要知道聚簇上的操作中是否还有写入进行。这个指示可以作为标志存储在该聚簇的缓存项中。下表显示CAT缓存项的格式:
位0-17 | 位18-31 | 位32-47 | 位48-63 |
存储区中数据聚簇的偏移 | 包含数据的存储区# | 散列关键字 | 位48:写进行 |
位49:脏 |
缓存项中的写进行标志有两种含义。首先,它指出写操作正在进行,并且在这个聚簇上的任何读(或者附加写)必须延迟,直到完成该写操作。其次,当设置该位时,绝不能刷新缓存中的这个项。这部分地保护了该位的状态,同时反映了这个聚簇当前被使用的事实。另外,这意味着缓存的尺寸必须至少与未完成的写操作数量一样大。
在聚簇的缓存项中存储写进行指示符的一个优点是它反映了操作正在进行的事实,省去了使用其他表格,并且省去了另外的基于散列的查找,或用于检查该位的表查找。该缓存可以是写延迟缓存。只需要当写操作完成时,将缓存项写回磁盘,虽然将其更早写回可能更好。散列函数或者其他机制可用于增加可散列的未完成的写项。
一种替换方法是缓存整个CAT聚簇(即各项的4K项)。这通常有助于性能,如果有好的访问空间定位的话。需要注意,因为CAT项是48位宽,因此缓存中没有全部的项。下表显示聚簇CAT缓存项的示例:
两个字 | 两个字 | 两个字 | 两个字 | ||
CAT项1(最后两个字的部分项) | CAT项2 | ||||
CAT项3 | AT项4 | ||||
CAT项4 | CAT项5 | ||||
CAT项5 | CAT项6 | ||||
... | |||||
CAT项682 | CAT项683(前两个字的部分项) | ||||
写进行位阵列[682位:位0-255 | |||||
写进行位阵列位256-511 | |||||
写进行位阵列位512-682+备用位 | 脏数 | 保留 |
该表格尺寸可以是4096+96(4192字节)。假定需要具有250项的缓存大小,该缓冲可以占据大约1MB。
通过逻辑CAT项地址的适当屏蔽可以计算首项和末项是否未完成。缓存查找例程应当在加载项之前执行这个过程并且应当加载需要的CAT聚簇。
当主机发送扇区(或者聚簇)读请求时,其通过逻辑扇区地址发送。该逻辑扇区地址用作到CAT的偏移以获得包含主机所请求的实际数据的存储区中的聚簇的偏移。结果是存储区编号和到该存储区的偏移。该信息传递给层2软件,然后其从(多个)驱动器提取原始(多个)聚簇。
为了处理主机从未写过的聚簇,所有CAT项被初始化为指向包含全零的“默认”聚簇。
日志管理器是两级写(bi-level write)日志***。该***的一个目标是保证可以从主机接收写请求并快速向该主机返回指示,数据已经在保证其完整性的同时被接收。另外,该***需要保证在任何盘写入期间的***复位的情况下,不会有块级数据或者***元数据(例如CAT和散列表项)的损坏合丢失。
J1日志管理器尽快缓存所有从主机向磁盘的写请求。一旦写入成功完成(即数据已经被阵列接收),主机就可以发信号指示操作已经完成。日志项允许当从故障恢复时,恢复写请求。日志记录包括要写入磁盘的数据,以及与写事务相关的元数据。
为了减少磁盘读/写,与写入相关的数据将被写入空闲聚簇。这样将自动镜像该数据。将从空闲聚簇列表去除空闲聚簇。一旦写数据,空闲聚簇就必须写回磁盘。
日志记录将被写回非镜像存储区上的日志队列。每个记录都将是扇区大小,并且对齐到扇区边界,以使得减少日志写期间的故障会破坏以前日志项的风险。日志项在记录的末尾包含唯一的、递增的顺序计数,因此可以轻易识别队列的结尾。
日志写操作在主机队列处理线程中同步发生。日志写必须按照它们写入磁盘的次序来排序,因此在任何时候只有一个线程可以写入该日志。J1表中日志项的地址可以用作唯一标识符,因此J1日志项可以与J2日志中的项相关联。一旦写入日志项,将向主完成队列传递事务完成通知。现在可以执行写操作。要保证在完成日志写之前延迟任何后续的对该聚簇的读,这一点很重要。
下表示出了J2日志记录的格式:
大小(位) | 名称 | 细节 |
32 | LBA | 逻辑块地址 |
14 | 存储区 | 相关聚簇的存储区# |
18 | 偏移 | 相关聚簇的聚簇偏移 |
16 | 大小 | 数据大小 |
16 | 顺序号 | 增量顺序号以易于发现队列结束 |
每个日志记录都对齐到扇区边界。日志记录可以包含存储区/偏移/大小的元组的阵列。
图15示出了根据本发明示例性实施例的日志表更新。尤其是当接收到主机写请求时,更新该日志表,分配一个或多个聚簇,并向(多个)聚簇写入数据。
处理主日志请求。这引起聚簇被写入,并同样引起更新元数据结构,所述结构必须投影回磁盘(例如CAT表)。重要的是保证这些元数据结构正确地写回磁盘,即使当***发生复位。为此将使用低级磁盘I/O写(J2)日志。
为了处理主界面日志项,应当确定元数据结构的适当的操作。改变应当发生在存储器并且要产生对各磁盘块改变的记录。这种记录包含在磁盘上应该进行的实际改变。更新的每种数据结构都用J2日志管理器来登记。这种记录应当记录到基于磁盘的日志,并用标识符来加印戳。当记录与J1日志项相连接,标识符就应当被链接。一旦存储该记录,就可以进行磁盘的改变(或者可以经由后台任务执行)。
逻辑上J2日志存在于层3。它用于把那些涉及经存储区管理器的写的元数据更新登记到日志。当发生日志项的再现时,将使用存储区管理器方法。日志本身可以存储在专门区域。由于日志项的短生命期,不对其做镜像。
不是所有的元数据更新都需要经过J2日志,尤其是,如果对结构的更新是原子的。区域管理器结构可不使用J2日志。可检测区域管理器位图中的不一致,例如,使用完整性检测后台线程。
用于J2日志的一种简单方法是包含单个记录。一旦该记录提交给磁盘,就被重放,更新磁盘上的结构。可具有多个J2记录,并使后台任务提交磁盘上的更新记录。这种情况下,需要密切注意日志和与各种数据结构相关的任何缓存算法之间的交互作用。
一旦提交给磁盘,初始方法就将运行日志项。原则上,会有J2的多个并发的用户,但是J2日志会在一个时候锁定到一个用户。即使在这种情况下,一旦提交,也会提交日志项。
重要的是保证在任何更高级的日志活动发生前修复元数据结构。在***重新引导时,分析J2日志,并将重现任何记录。如果日志项与J1日志项相关,则将J1日志项标记为已完成,并可以被删除。一旦完成全部J2日志项,元数据就处于可靠状态,并且可以处理任何剩余J1日志项。
J2日志记录包括下列信息:
·操作号
·每个操作包含:
оJ1记录指示符
о待写入存储区/数据偏移
о待写入数据
о数据大小
о到数据聚簇的偏移
·日志记录标识符
·结束标记
这种模式可以按类似于J1日志的模式来操作,例如,使用顺序号用于识别J2日志项的结尾并将J2日志项置于扇区边界处。
如果设置J1数据指针指示符,那么这个特殊操作会指向J1日志记录。主机提供的写数据不必复制到日志项。操作阵列将可以定义为固定大小,因日志记录中操作的最大数量是已知的。
为了允许从低级写操作期间的扇区损坏(例如由于掉电)恢复,J2日志可以存储被写入的整个扇区,使得如果需要该扇区可以根据这个信息来重写。作为替换或附加,为每个改变的扇区计算的CRC可以存储在J2记录中,并与从磁盘扇区(例如由存储区管理器)计算的CRC进行比较,以确定是否需要写操作的重放。
不同日志可以存储在不同位置,因此提供接口层用于写日志记录到备份存储。该位置应当是非易失的。两种候选是硬盘和NVRAM。如果J1日志存储到硬盘,它将存储在J1日志非镜像存储区中。J1日志是存储在NVRAM的候选。J2日志应当存储在磁盘上,尽管它可以存储在专门区域中(即,不冗余,因为它具有短生命期)。将J2日志存储在磁盘的优点是,如果在内部数据结构更新期间存在***复位,那么该数据结构可以返回到一致状态(即使该单元长时期掉电)。
存储区管理器(ZM)分配更高级软件需要的存储区。向ZM的请求包括:
a.分配存储区
b.解除分配/释放存储区
c.控制数据读/写传递到L1(?)
d.读/写存储区中的聚簇(给出聚簇偏移和存储区号)
ZM管理器管理冗余机制(随驱动器的数量和它们的相关大小而改变)并处理镜像、条带化、以及用于数据读/写的其他冗余模式。
当ZM需要分配存储区时,它将请求两个或者更多区域集合的分配。例如,要为1GB的数据分配存储区,组成这个存储区的区域将可以包含1GB数据,包括冗余数据。对镜像机制,存储区将由各为1GB的两个区域集合构成。另一个示例,3盘条带化机制使用各为1/2GB的3组区域。
ZM使用ZR转换表(6)以发现组成该存储区的每组区域的位置(驱动器号和起始区域号)。假定是1/12GB区域大小,将需要最多24个区域。24个区域组成2×1GB的存储区。因此ZR转换表包含24列,用于提供驱动器/区域数据。
ZM通常工作如下:
a.在SDM的情况下(单个驱动器镜像),使用24列。驱动器号在所有列中都相同。每个项对应于组成该存储区的物理驱动器上的一个物理区域。前12个项指向包含该数据的一个副本的区域。后12个项指向包含该数据的第二个副本的区域。
b.DDM(双驱动器镜像)的情况与SDM的情况相同,只是前12个项的驱动器号与后12个项中的驱动器号不同。
c.在条带化的情况下,可以使用三个或者更多列。例如,如果跨三个驱动器使用条带化,则需要来自三个不同驱动器的六个区域(即使用18个项),前6项包含相同驱动器号,接下来的6项包含另一个驱动器号,以及随后的6项包含第三驱动器号,未使用的项置为0。
下表显示存储区区域转换表的表示法:
存储区# | 存储区大小 | 每个区域大小 | 使用 | 驱动器/区域(1) | 驱动器/区域(2) | ... | 驱动器/区域(23) | 驱动器/区域(24) |
0 | 1GB | 1/12 | SDM | 0,2000 | 0,1000 | ... | 0,10 | 0,2000 |
1 | 1GB | 1/12 | DDM | 0,8000 | 0,3000 | ... | 1,2000 | 1,10 |
2 | 1GB | 1/12 | SD3 | 3,4000 | 3,3000 | 4,2000 | 4,1000 | |
... | ||||||||
N | 空闲 |
当读/写请求到达时,对ZM提供存储区号和到该存储区的偏移。ZM查看ZR转换表中用于解决该存储区的冗余机制,并使用该偏移用于计算哪个驱动器/区域包含必须读/写的扇区。然后该驱动器/区域信息提供给L1层以进行实际的读/写。在“使用(usage)”列中的另外可能项是“空闲”。“空闲”指存储区被定义但当前没有使用。
聚簇管理器分配并再分配数据存储区集合中的聚簇。
布局管理器提供存储区关于其区域的的运行时再布局。这可根据磁盘***/除去或者故障而发生。
层1(L1)软件知道物理驱动器和物理扇区。除了其他,L1软件分配物理驱动器的区域用于存储区管理器来使用。在这个示例性实施例中,每个区域具有用于四驱动器阵列***的1/12GB大小(即174762扇区)。具有更大数量驱动器(8,12或16)的***将具有不同的区域大小。
为了创建包含具有SD3(在三驱动器上条带化;两个数据加奇偶校验)的1GB数据存储区,我们应当使用各在三驱动器中的六个区域(每个驱动器为6×1/12=GB)。
当存储区被移动或者重配置时,例如根据镜像到条带化,使用这种区域模式允许我们提供更好的磁盘空间利用。L1软件利用区域位图(bitmap)跟踪物理驱动器上的可用空间。每个驱动器都有一个位图。每个区域都用位图中的两位表示,用于跟踪该区域是否空闲、使用、或者损坏。当L2软件(ZM)需要创建存储区时,它从L1层获得一组区域。构成存储区的区域不必在磁盘中连续。
向L1的请求包括:
a.数据读/写(到一组区域中的聚簇)
b.控制数据读/写(表格、数据结构、DIC等)
c.分配区域的物理空间(1驱动器内的实际物理扇区)
d.解除分配区域
e.向物理驱动器的物理聚簇的原始读/写(raw read/write)
f.从一个区域向另一个复制数据
g.将区域标记为损坏。
空闲区域位图可以是大型的,因此查找空闲项(最糟的情况是没有空闲的项)的搜索可能缓慢。为了改进性能,部分位图可以预加载到内存中,而且空闲区域的链接列表可以存储在内存中。每个活动存储区都有列表。如果到达列表上的低水位线,可以从磁盘读取更多的空闲项作为背景活动。
磁盘管理器运行在层0。如下表所示,有两个子层,分别是抽象层和与物理存储阵列通信的设备驱动器。
层0a:抽象 |
层0b:OS到一个和多个设备驱动器的接口 |
物理存储阵列硬件 |
设备驱动器层同样可以包含多个层。例如,对使用USB驱动器的存储阵列,在USB输送层顶端有ATA或者SCSI栈。抽象层提供独立于存储阵列中使用的驱动器种类的基本读/写功能。
可使用一个或者多个磁盘存取队列来对盘存取请求进行排队。在我们的***中,盘存取速度将是一个关键的性能瓶颈。我们想要保证磁盘接口尽可能在所有时间保持忙碌,从而减少一般的***延迟并改进性能。请求盘的接口应当具有异步接口,使用回调(callback)处理器用于当已经结束盘操作时来完成操作。一个盘请求的完成将自动启动队列中的下一个请求。每个驱动器有一个队列,或者全部驱动器用一个队列。
层1将按逻辑驱动器号来引用驱动器。层0将逻辑驱动器编号转换为物理驱动器参考(例如/dev/sda或作为open()调用的结果文件设备号)。为灵活起见(经USB扩展),应当每个逻辑驱动器一个队列。
下面是对象定义和数据流的一些示例。
MSG对象:从主机引入
Lba
Length
LUN
Data
REPLY对象:引出到主机
Status
Host
Length
Data
数据读
数据读流程:
rc=lockm.islocked(MSG)
rc=catm.read(MSG,REPLY)
status=zonem.read(zone,offset,length,buffer)
regionm.read(logical_disk,region_number,
region_offset,length,buffer)
diskm.read((logical_disk,offset,length,buffer)
数据写
数据写流程:
diskutildaemon.spaceavailable()
journalm.write(MSG)
lockm.lock(msg)
zonem.write(journal_zone,offset,length,buffer)
regionm.write -日志项
diskm.write
regionm.write -结束标记
diskm.write
catm.write(MSG)
catm.readcluster(1ba,offset,length,buffer)
-如果需要向聚簇归并扇区
-归并
“if(1ba已经分配)”
catm.readhashkey(1ba)
hashm.lookup(hashkey,zone,offset)
“if(refcount=1)”
hashentry.getrefcount()
hashm.remove(hashentry)
hashm.add(shal,zone,offset)
zonem.write(zone,offset,length,buffer) -写数据
“else”
hashentry.removeref()
clusterm.allocate(zone.offset) -分配新聚簇
zonem.createzone(zone)
regionm.unusedregions(logical_disk)
regionm.allocate(logical_disk,number_regions,region_list)
zonem.write(...) -写数据
hashm.add(...) -向散列表增加新项
“endif”
hashdaemon.add(1ba,sha1) -增加到散列新进程Q
catm.writehashkey(1ba,hashkey) -向CAT复制新散列关键字
“else”
catm.update(1ba,zone,offset,hashkey)-用新项更新CAT
“endif”
journalm.complete(MSG)
lockm.unlock(MSG)
-更新r/w指针
下面是物理盘布局的说明。如上所述,每个盘都划分为固定尺寸的区域。在这个示例性实施例中,每个区域具有用于四驱动器阵列***的1/12GB大小(即174763扇区)。具有更大数量驱动器(8,12或16)的***将具有不同的区域大小。开始,保留区域号0和1用于区域管理器并且不用于分配。区域号1是区域号0的镜像。对给定的硬盘,区域管理器所使用的所有内部数据都存储在这个硬盘的区域号0和1中。这个信息并不重复(或镜像)到其他驱动器。如果区域0或1中有错误,可以分配其他区域来保留该数据。盘信息结构指针指向这些区域。
每个盘将包含识别该盘的DIS、它所属于的盘组和该盘的布局信息。该硬盘上的第一扇区被保留。DIS存储在第一扇区后的第一非损坏聚簇中。DIS包含相当1KB的数据。有两个DIS的副本。DIS的副本将存储在其所属于的盘上。另外,该***中的每个盘都将包含该***中盘的全部DIS副本。下表显示DIS格式:
偏移 | 尺寸 | 名称 | 值/有效范围 | 描述 |
0 | 32字节 | DisStartSigniture | “_DISCINFORMATIONCLUSTER START_” | 识别聚簇为可能盘信息聚簇。聚簇必须经CRC以检查其有效。 |
字16 | DisVersion | 二进制非零号 | 识别结构版本。仅当结构布局或内容意思发生实质改变使得其与固件的先前版本不相容时,才改变这个值。 | |
字16 | disClusterSize | 二进制非零号 | 使聚簇在该盘的512字节扇区数 | |
字16 | DisCRC | CRC-32 | DIS结构的CRC | |
字32 | disSize!!! | DIS聚簇的尺寸(字节) | ||
字32 | DisDiskSet | 该盘所属的盘组 | ||
字32 | disDriveNumber | 0至15 | 盘组中的驱动器号 | |
字32 | disSystemUUIN | 该盘属于的机箱的UUIN | ||
字64 | DisDiskSize | 按扇区数的盘尺寸 | ||
字32 | DisRegionSize | 按扇区数的区域尺寸 | ||
字64 | disRegionsStart | 扇区到起始的偏移 | ||
字64 | disCopyOffset | 到存储该DIS副本处的扇区偏移。每个DIS的disCopyOffset互相参考 |
字64 | disDISBackup | 到包含全部盘的DIS副本的表的扇区偏移 | ||
字32 | DisDISBackupSize | DIS备份部分的DIS编号 | ||
字32 | disRIS0Region | 存储首先复制RIS的区域编号 | ||
字32 | disRIS0Offset | 在区域中到该区域信息结构位于的扇区的扇区偏移数 | ||
字32 | disRIS1Region | 用于RIS的副本 | ||
字32 | disRIS1Offset | 用于RIS的副本 | ||
字32 | disZIS0Region | 存储区信息结构所位于区域的区域号。仅当ZTR位于该盘时使用。否则,其为零。 | ||
字32 | disZIS0Offset | 到区域中ZIS的偏移 | ||
字32 | disZIS1Region | ZIS的副本所位于区域的区域号。仅在单驱动器***中使用。其它情况下,这个项为0。 | ||
字32 | disZIS1Offset | 到该区域中ZIS的偏移 |
区域管理器在区域信息结构中存储其内部数据。下表显示该区域信息结构格式:
偏移 | 尺寸 | 名称 | 值/有效范围 | 描述 |
0 | 字64 | risSignature | 指示这个是RIS | |
字32 | risSize | 该结构(字节)的尺寸 | ||
字32 | risChecksum | 校验和 | ||
字32 | risVersion | 该表的版本(和位图) | ||
字32 | risDrive | 逻辑驱动器号 | ||
字64 | risStartSector | 区域利用位图的绝对起始扇区(磁盘中) | ||
字32 | risSectorOffset | 当前区域中区域利用位图的扇区偏移 | ||
字32 | risSizeBitmap | 位图尺寸(位?) | ||
字64 | RisNumberRegions | 该盘上区域号(同样隐含位图尺寸) |
存储区信息结构提供可以发现存储区表的存储区管理器上的信息。下面显示该存储区信息结构格式:
偏移 | 尺寸 | 名称 | 值/有效范围 | 描述 |
0 | 字64 | zisSignature | 指示这是ZIS | |
8 | 字32 | ZisSize | 该结构的尺寸(字节) | |
12 | 字32 | zisChecksum | 校验利 | |
16 | 字32 | zisVersion | 该表的版本(和位图) | |
20 | 字16 | zisFlags | 如果该盘用于包含存储区信息位14-15则位0=1:冗余类型(SDM或者DDM) | |
22 | 字16 | zisOtherDrive | 包含存储区表的其他副本的驱动器的逻辑驱动器号 | |
24 | 字32 | zisNumberRegions | 用于包含存储区表的每个副本的区域号。等于存储区表节点的编号。 | |
28 | 字32 | zisStartOffset | 指向用于包含存储区表的区域链接表开始的字节偏移。该链接列表中的每个项称作‘存储区表节点’ | |
字32 | zisNumberofZones | ***中的存储区编号(存储区表中的项) | ||
字32 | zisZoneSize | 按字节的存储区尺寸 |
高级信息存储区包含存储区表和其他由高级管理者使用的表。这将使用镜像进行保护。
下表显示该存储区表节点格式:
尺寸 | 名称 | 描述 |
字32 | ZtNextEntry | 指向链接列表中的下一个项 |
字32 | ZtCount | 计数这个项 |
字64 | ZtRegion | 区域数 |
下面描述存储区信息布局。存储区表节点的链接列表以如下方式放置在ZIS后:
存储区信息结构 |
首存储区表节点(16字节) |
...末存储区表节点(16字节) |
这种信息存储在存储区表区域中。
图16示出了根据本发明示例性实施例的驱动器布局。前两个区域是互为副本。第三(可选)存储区表区域包含该存储区表。在具有一个以上驱动器的***中,只有两个驱动器包含ZTR。在仅具有一个驱动器的***中,两个区域用于保留该ZTR的两个(镜像)副本。DIS包含有关RIS和ZIS位置的信息。注意RIS的第一副本不必在区域0中(例如,如果区域0包含坏扇区,则可以位于不同区域)。
存储区管理器需要在***启动时加载该存储区表。为此,其从DIS提取区域号和偏移。这将指向ZIS的开头。
特定模块(例如CAT管理器)在存储区中存储它们的控制结构和数据表。层3和更高层中的模块的所有控制结构由存储在存储区0中的结构来引用。这意味着,例如,实际CAT(聚簇分配表)位置由存储区0中存储的数据结构来引用。
下表显示存储区0信息表格式:
偏移 | 尺寸 | 名称 | 值/有效范围 | 描述 |
0 | 字64 | zitSignature | 指示这是ZIT | |
字32 | zitSize | 该结构的尺寸(字节) | ||
字32 | zitChecksum | 该结构的校验和 | ||
字32 | zitVersion | 该结构的版本 | ||
字32 | zitCATLStartOffset | CAT链接列表的起始字节偏移(在该存储区中) | ||
字32 | zitCATSize | CAT链接列表中的节点数。等于包含该CAT的存储区数 | ||
字节64 | zitCATAddressable | CAT所支持的最大LBA。有效CAT尺寸 | ||
字32 | ZitHTStartOffset | 散列表链接列表的起始字节(这个存储区中) | ||
字32 | zitHTNumberNodes | 散列表链接列表中的节点数 | ||
字64 | ZitHTSize | 按字节的散列表数据尺寸 |
CAT链接列表是描述包含CAT的存储区的节点链接列表。下表显示CAT连接列表节点格式:
尺寸 | 名称 | 描述 |
字32 | cat11NextEntry | 指向链接列表中的下一个项 |
字16 | cat11Count | 这个项的计数 |
字16 | cat11Zone | 包含这个CAT部分的存储区数 |
散列表链接列表是描述保持散列表的存储区的节点的链接列表。下表显示该散列表链接列表节点格式:
尺寸 | 名称 | 描述 |
字32 | ht11NextEntry | 指向链接列表中的下一个项 |
字16 | ht11Count | 这个项的计数 |
字16 | ht11Zone | 包含这个散列表部分的存储区数 |
图17示例存储区0的布局以及其他存储区如何被引用,根据本发明示例性实施例。
如上所述,冗余集是为数据集提供冗余的一组扇区/聚簇。备份某个区域包括将一个区域的内容复制到另一个区域。
在数据读取出错的情况下,较低级软件(盘管理器或者设备驱动器)在最初失败尝试之后再做两次读请求的尝试。故障状态传递回存储区管理器。存储区管理器接着尝试根据盘阵列中冗余聚簇来重构所请求(通过读)数据。该冗余数据可以是镜像的聚簇(用于SDM、DDM)或者一组包括奇偶校验的聚簇(条带化实施)。接着重构数据传递回主机。如果ZM不能重构该数据,则将读报错传递回主机。存储区管理器发送差错通知分组给差错管理器。图18示例根据本发明示例性实施例的读报错处理。
在数据写出错的情况下,较低级软件(盘管理器或者设备驱动器)在最初失败尝试之后再两次尝试写请求。故障状态传递回存储区管理器。存储区管理器发送报错通知分组给差错管理器。
当数据写在这个级别执行时,冗余信息同样写入磁盘。这样,只要仅一个聚簇具有写差错,后续的读可以重构该数据。如果有多个盘差错并且冗余信息不能读或者写,则有至少两种可能途径:
a.向主机返回写差错状态。把与该冗余集相关联的所有区域备份至新分配的不包含坏扇区的区域。
b.延迟写。把与该冗余集相关联的所有区域备份至新分配的不包含坏扇区的区域。随后,在新分配区域中的适当聚簇上写(连同全部冗余部分,例如奇偶校验等)。单独的写队列将用于包含已经被延迟的写。
因为写状态可能已经发送到主机作为日志成功写入的结果,所以方法(a)是有问题的,因此主机不可能知道已经有差错。一种替换的是报告读的故障,但是允许写。CAT中的某个位用于跟踪应当返回坏的读的特别LBA。
图19示例根据本发明示例性实施例写差错处理。
差错管理器(EM)检查聚簇以发现其是否真的损坏。如果是,则认为整个区域损坏。该区域中的内容复制到相同盘的新分配区域上。然后标记当前区域损坏。当在区域上复制时,当遇到坏扇区时,差错管理器将在必要时重构数据。如20是示例根据本发明示例性实施例由差错管理器备份坏区域的逻辑流程图。
如果有数据读差错且差错管理器不能重构给定聚簇的数据(例如,由于在整个冗余集的读差错),那么接着使用零代替不能重构的数据。在这种情况下,将同样必须备份其他包含坏扇区的区域(来自相同冗余集)。再次将使用零代替不能重构的数据。
一旦执行了冗余集复制,EM禁用对应于存储区这部分的聚簇的存取。然后更新存储区表以指向新分配区域。随后存取再启用的聚簇。
这个示例性实施例设计支持八个快照(其允许使用一个字节指示特定快照实例是否使用散列/聚簇项)。有两个表涉及快照:
1.需要存在每个快照的CAT表,以捕获逻辑扇区地址与包含用于LSA的数据的盘上的聚簇之间的关系。最终,每快照CAT必须是在快照发生时CAT的副本。
2.***散列表,其在散列值和数据聚簇之间映射。散列函数返回相同结果,无论使用哪个快照实例,并且对全部快照结果都是一样的。这样,这个表必须理解唯一聚簇是否由任何快照使用。散列聚簇项不能被释放,或者被新数据替换,除非没有使用该散列项的快照。
总是有当前和被添加的快照。当散列项创建或者更新时,我们将需要把当前快照号应用到散列项。当制作快照时,将递增当前快照号。
通过查找散列表并且发现任何具有退出快照位设置的散列值并清空该位,由此来释放不再被任何快照需要的聚簇/散列项。如果该快照字节现在是零,则散列项可以从该表中删除,并且可以释放该聚簇。
为了预防与添加到散列树的任何新项的冲突(因为新快照数与退出快照数相同),仅允许批准7个快照,退出最后的(第八个)快照。可以按背景活动来查找散列表。
为了创建快照,无论主CAT何时更新都可以写入第二CAT存储区。这种更新可以被排队,并且影子CAT可以按其他任务来更新。为了快照,影子CAT成为快照CAT。
一旦进行快照,可以离开后台处理以将这个快照表复制到新存储区成为新快照CAT。可以使用队列,使得不处理影子CAT队列,直到CAT复制完成。如果在更新影子CAT之前发生故障(队列中的项可能丢失的情况),则在阵列联机之前可以根据最初CAT表执行再投影。
另外,当需要快照时,“增量”的集合加上最初CAT副本可以组成快照。然后后台任务可根据这些信息重建完整快照CAT。这会需要一点或者不需要停机时间来做此快照。其间,可能要为后续的快照收集另一组“增量”。
如上所述,所谓“垃圾收集器”可用于释放不再被主机文件***使用的聚簇(例如当删除文件时)。一般而言,通过发现空闲块、计算它们的主LSA、并根据该LSA分配它们的CAT项进行垃圾收集。如果没有CAT项用于特定LSA,则该聚簇已经空闲。但是如果CAT项被定位,则递增引用计数,而且如果该计数命中零,该聚簇空闲。
垃圾收集的一个问题是难于将已经由主文件***使用的块与先前已经使用并且在某个点标记为空闲的一个区分开来。当主文件***写入块时,存储设备分配聚簇用于数据,以及CAT项来描述它。从这点上,聚簇将一般的表现为在用(in use),即使主文件***随后停止使用它的块(即,聚簇将仍然通过有效CAT的项处于在用状态)。
例如,特定主文件***使用位图(bitmap)来追踪它的使用盘块。一开始,位图将指示全部的块为空闲,例如,通过将全部位清空。由于使用文件***,因此主文件***将通过使用它的空闲块位图来分配块。存储***将使用通过上述的分配聚簇和CAT项来把这些文件***分配与物理存储相关联。当主文件***把一些块释放回到它的空闲池时,其只需要在其空闲块位图中清空相应的位。在存储***上,这可以设想成写入恰好包含该主机的空闲块位图的聚簇,就像没有I/O到空闲的实际聚簇本身(虽然可能有到空闲聚簇的I/O,例如,如果主文件***以某种增强安全模式运行,其中不像把零或者随机数据的强保密散列写入聚簇以使得减少旧聚簇内容可能被攻击者读取的机会)。另外,当满意新分配请求时,不保证主文件***会重用以前被释放的块。因此,如果主文件***继续分配那些从存储***的视点来看是新的、即以前未使用的块,则该存储***将快速耗尽空闲聚簇,限于无论什么空间都可以经由压缩回收。例如,假定文件***块是4K,如果主机分配文件***块100至500,随后释放块300至500,然后接着分配块1000至1100,整个文件***使用的将是300块,而阵列将有500个聚簇处于在用状态。
在本发明示例性实施例中,存储***可以通过访问主文件***布局来检测主文件***盘资源的释放,分析它的空闲块位图,并使用该信息来识别不再被该文件***使用的聚簇。为了存储***能够以这种方式识别未使用的聚簇,存储***必须能够定位并理解该文件***的空闲块位图。因而,该存储***将通常支持文件***的预定设置,可充分“理解”内部工作以定位并利用这些空闲块位图。对不支持的文件***,该存储***可能不能够执行垃圾收集并将由此仅告之该阵列的实际物理尺寸以便于避免被过量使用。
为了确定该文件***类型(例如NTFS、FAT、ReiserFS、ext3),需要定位该文件***的超块(superblock,或者等同结构)。为了发现该超块,要分析分区表(partition table)以定位OS分区。假定OS分区被定位,则分析OS分区,以试图定位该超块并由此识别该文件***类型。一旦该文件***类型已知,则可以分析布局以查找空闲块位图。
为了便于搜索空闲块,可以保持主文件***位图的历史数据,例如,通过制作可以存储在私有、非冗余存储区的空闲块位图的副本,并执行使用该副本的搜索。给定位图的尺寸,可以每次为较少数量的聚簇保持信息而不是为整个位图保持信息。当执行垃圾收集时,可以把当前空闲块位图与历史副本逐个聚簇地进行比较。可以识别任何从分配转换成空闲的位图项,使得回收操作可准确地定向到作为可利用的良好候选的聚簇。随着处理每个位图聚簇,可以用当前副本替换历史数据以维持位图操作的滚动式历史数据。空闲块位图的副本将随着时间变成时间上不连贯的聚簇的拼凑体,但是由于当前副本总是用于定位空闲项,因此这并不产生任何问题。
在特定条件下,会有关于空闲块位图的竞争条件,例如,如果主文件***使用其空闲块位图来分配盘块,接着写入它的数据块,然后将修变的位图刷新回到盘。在这种情况下,垃圾收集器会释放该聚簇,即使该文件***在使用该聚簇。这会导致文件***被破坏。可实现存储***以避免或者处理这样的条件。
由于垃圾收集是相当昂贵的操作,因即是低强度的回收也将占用后端的I/O带宽,因此不应滥用垃圾收集。垃圾收集器能够按多种方式运行,从低强度的后台惰性回收到非常高强度或者甚高优先级的回收。例如,当使用了百分之三十的空间时,可以按低强度方式运行垃圾收集器,或者至少没星期一次,当使用了50%的空间时,按稍微高强度的方式来运行,而当使用了百分之九十或者更多的磁盘空间时,运行全高优先级的回收。在每次进行收集时,可以限制要回收的目标聚簇数量和最大的可容许I/O计数,从而控制垃圾收集器的回收强度。例如,可配置垃圾收集器,通过使用不超过10000次的I/O来回收1GB。回收请求的完成失败可用作对收集器的反馈,从而在下一次运行时按更高强度的方式。还可以是“回收一切”模式,允许垃圾收集器分析整个主文件***空闲块位图并回收可能的全部块。在阵列(几乎)完全装满时,这可以作为最后的办法来回收聚簇。可以周期性地运行垃圾收集器,对其施加规则,并可决定执行、或者可决定不执行回收操作。还能够明确地从其他模块来请求回收操作,例如区域管理器,当正在寻找用于构建区域的聚簇时,可请求回收操作。
垃圾收集功能可以与状态指示符机制相结合。例如,在某些点,存储***可以处于“红色”条件,尽管正在运行的垃圾收集操作可以释放足够空间以消除“红色”条件。可采用附加指示器状态以显示相关状态信息(例如红色指示器灯光可以闪烁用来指示垃圾收集操作正在进行)。
图21是根据本发明示例性实施例的存储阵列的相关部件的示意性框图。除了其他,存储阵列包括底盘2502,在其上存储管理器2504与多个存储设备25081-2508N通信,这些存储设备分别通过多个插槽25061-2506N耦合到底盘。每个插槽25061-2506N都可以与一个或者多个指示器25071-2507N相关联。除了其他,存储管理器2504典型包括用于实施上述功能的各种硬件和软件组件。硬件组件典型包括存储器用于存储诸如程序代码、数据结构、以及数据的内存,和用于执行该程序代码的微处理器***。
虚拟热后备(virtual hot spare)
如上所述,在许多存储***中,热后备存储设备维持就绪状态,使得在其他存储设备故障的情况下,热后备可以快速被联机。在本发明特定实施例中,不是维持物理上分离的热后备,而是跨多个存储设备由未使用的存储容量来创建虚拟热后备。不同于物理热后备,如果以及当对于根据(多个)其余存储设备恢复的数据的存储发生存储设备故障时,这种未使用存储容量是可用的。
该虚拟热后备特征需要阵列上的足够可用空间,以保证在盘故障情况下,数据可以按冗余方式再布局。因而,根据运行,存储***典型地确定实现虚拟热后备可能需要的未使用存储容量的量(例如,根据存储设备的数量、各存储设备的容量、数据存储的数量、以及以什么方式存储数据),并且,如果需要附加存储容量用于虚拟热后备的话则产生信号(例如,使用绿色/黄色/红色光指示状态和插槽,如上所述)。随着存储区的分配,按每个盘保持记录,多少个区域需要再布局该存储区。下表示例使用四个驱动器的虚拟热后备:
存储区 | 类型 | 存储在盘上 | 注释 | 如果盘故障需要的区域 | |||
盘0 | 盘1 | 盘2 | 盘3 | ||||
2 | 双驱动器镜像 | 0, 1 | 如果0或1故障就在盘2或3上重构 | 12 | 12 | 0 | 0 |
3 | 双驱动器镜像 | 0,3 | 如果1或2故障就在盘1或2上重构 | 12 | 0 | 0 | 12 |
5 | 三驱动器条带 | 1,2,3 | 如果1或2或3故障就在盘0上重构 | 0 | 6 | 6 | 6 |
10 | 四驱动器条带 | 0,1,2,3 | 转换为跨其他三个盘的三驱动器条带 | 2,2,2 | 2,2,2 | 2,2,2 | 2,2,2 |
下表示例具有使用三个驱动器的虚拟热后备:
存储区 | 类型 | 存储在盘上 | 注释 | 如果盘故障需要的区域 | ||
盘0 | 盘1 | 盘2 | ||||
2 | 双驱动器镜像 | 0,1 | 在盘3上重构 | 12 | 12 | 0 |
3 | 双驱动器镜像 | 0,3 | 在盘1上重构 | 12 | 0 | 12 |
5 | 三驱动器条带 | 1,2,3 | 转换为双驱动器镜像 | 6,6 | 6,6 | 6,6 |
在这个示例性实施例中,虚拟热后备并非在仅有1个或者2个驱动器的阵列上可用。根据每个存储区的信息和阵列中盘的数量,该阵列确定每个可能盘故障的再布局情况并保证对每种情况每个驱动器上都有足够的可用空间。产生的信息可以反馈回再布局引擎和存储区管理器,使得数据可以在数据存储和热后备特征之间正确平衡。注意,根据这些由存储区布局数据的计算,热后备特征需要足够备用工作空间区域,使得可发生再布局。
图22是示出根据本发明示例性实施例的管理虚拟热后备的示例性逻辑的逻辑流程图。框2102中,该逻辑确定每个可能盘故障的再布局情形。在框2104中,该逻辑确定最坏情况下冗余数据再布局的每个驱动器需要的空间量。框2106中,该逻辑确定在最坏情况下数据冗余再布局需要的后备工作空间区域的数量。框2108中,该逻辑确定每个驱动器上需要的空间总量,以允许在最坏情况下再布局数据冗余(实际上是再布局所需要的空间和备用工作空间区域的和)。框2110中,该逻辑确定存储***是否包含足够的可用的存储量。如果有足够数量的可用存储(框2112中的是),则该逻辑迭代在框2199终止。但是,如果没有足够量的可用存储(框2112中的否),则该逻辑在框2114中确定哪个驱动器/插槽需要更新。接着在框2116,该逻辑发出信号,指出需要附加存储空间并指示哪个驱动器/插槽需要更新。该逻辑迭代在框2199终止。
图23是示出根据本发明示例性实施例的用于确定每个可能盘故障的布局情形的示例性逻辑的逻辑流程图,如图22的框2102中。框2202中,该逻辑分配存储区。然后,在框2204中,该逻辑确定按每个盘需要多少个存储区用于再布局存储区。该逻辑迭代在框2299终止。
图24是示出根据本发明示例性实施例的包括虚拟热后备功能的示例性逻辑的逻辑流程图。框2302中,该逻辑维持在最坏情况下的充足数量的可用存储以使得可再布局数据冗余。当在框2304确定了驱动器丧失(例如移除或者故障),该逻辑在框2306自动重构一个或者多个其余驱动器,以恢复数据的容错。该逻辑迭代在框2399终止。
图25是示出根据本发明示例性实施例的自动重构一个或者多个其余设备用于恢复数据容错的示例逻辑的逻辑流程图,如图24的框2306。框2402中,该逻辑将跨四个或者更多存储设备的第一条带化模式转换为跨三个或者更多剩余存储设备的第二条带化模式。框2404中,该逻辑可以将跨三个存储设备的条带化模式转换为跨两个剩余存储设备的镜像模式。当然,该逻辑可以按其他方式转换以使得随着驱动器的丧失而再布局数据冗余。该逻辑迭代在框2499终止。
再参考图21,存储管理器2504典型地包括适当部件和逻辑用于实施如上所述的虚拟热后备功能。
动态升级
上述用于处理存储的动态扩展和收缩的逻辑可以被扩充用于提供可动态升级的存储设备,其中,存储设备可根据需要用更大的存储设备来替换,并且现有数据跨各存储设备重新配置,使得冗余得到维持或者增强,并且该更大的存储设备所提供的附加存储空间将包括在跨多个存储空间的可用存储空间的池(pool)中。因而,当用较大存储设备替换较小存储设备时,附加存储空间可用于改进已存储数据和存储附加数据的冗余。无论何时需要更多存储空间,向用户提供适当信号(例如使用如上所述的绿色/黄色/红色灯光),而用户可以简单移除存储设备并用更大存储设备替换它。
图26是示出根据本发明示例性实施例的用于更新存储设备的逻辑流程图。框2602中,该逻辑在第一存储设备上按照存储在其中的数据在其他存储设备上冗余出现的方式来存储数据。框2604中,该逻辑检测用比第一存储设备具有更大存储容量的替换设备来替换第一存储设备的替换。框2606中,该逻辑使用冗余存储在其他设备上的数据将存储在第一设备的数据自动再生到的该替换设备上。框2608中,该逻辑使替换设备上的附加存储空间可用于存储新数据冗余。框2610中,该逻辑可以在替换设备上的附加存储空间中存储新数据冗余,如果没有其他设备具有充足的可用存储容量用于提供新数据的冗余的话。框2612中,如果至少一个其他设备具有充足的可用存储空间用于提供新数据冗余,则该逻辑跨多个存储设备存储新数据冗余。
再参考图21,存储管理器2504典型包括适当部件和逻辑用于实施如上所述的动态更新功能。
其他
本发明的实施例可以用于向主机计算机提供存储容量,例如按美国临时申请第60/625,495所述的方式使用***连接协议,所述申请以Geoffrey S.Barrall的名义于2004年11月5日提交,通过引用全文结合于此以供参考。
应当注意,散列算法可能不产生严格唯一的散列值。因而,可以想到散列算法对具有不相同内容的两个数据块产生相同散列值。散列函数(其通常结合散列算法)典型包括确认唯一性的机制。例如,在上述本发明的示例性实施例中,如果一个块的散列值与另外块的散列值不同,则认为这些块的内容不相同。但是如果一个块的散列值与另一个块的散列值相同,那么散列函数可以比较这两个块的内容或者利用一些其他机制(例如不同散列函数)以确定内容是否相同。
应当注意,这里使用的该逻辑流程图用于示例本发明的各个方面,而不应解释为将本发明限制在任何特殊逻辑流程或者逻辑工具。在不改变总体结果的前提下,或者不以另外的方式背离本发明范围的情况下,所述逻辑可划分为不同的逻辑块(例如程序、模块、函数、或者子程序)。通常,可以增加、改变、省略逻辑部件,可以按不同顺序执行,或者使用不同逻辑结构来实施(例如逻辑门、循环元语、条件逻辑、和其他逻辑机构),而不改变整体结果或者以其他方式脱离本发明的真实范围。
本发明可以按多种不同形式来实施,包括但不限于:使用处理器(例如微处理器、微控制器、数字信号处理器、或者通用计算机)的计算机程序逻辑、使用可编程逻辑设备(例如现场可编程门阵列(FPGA)或者其他PLD)的可编程逻辑、离散组件、集成电路(例如特定用途集成电路(ASIC))、或者包括其任意组合的其他装置。
实施全部或者部分这里前述功能的计算机编程逻辑可以按多种形式实施,包括但不限于:源代码形式、计算机可执行形式、各种中间形式(例如由汇编程序、编译程序、连接程序、或者定位程序等产生的形式)。源代码可以包括按任何各种编程语言实现的计算机程序指令序列(例如对象代码、汇编语言、或者例如Fortran、C、C++、JAVA、或HTML等高级语言),在各种操作***或者操作环境下使用。源代码可以定义并使用各种数据结构和通信消息。源代码可以是计算机可执行形式(例如经由解释程序)、或者源代码可以转换(例如经由转换器、汇编器、或者编译器)为计算机可执行形式。
所述计算机程序可以持久地或者暂时地按任何形式(例如源代码形式、计算机可执行形式、或者中间形式)固定在有形存储介质中,例如半导体存储装置(例如RAM、ROM、PROM、EEPROM、或者可编程闪存RAM)、磁存储设备(例如软盘或者硬盘)、光存储设备(例如CD-ROM)、PC卡(例如PCMCIA卡)、或者其他存储器设备。该计算机程序可以按任何形式固定在信号中,该信号传输给使用各种通信技术的计算机,包括但不限于:模拟技术、数字技术、光技术、无线技术(例如蓝牙)、网络技术、以及互联网技术。该计算机程序可以按任何形式来发布,如使用附带有打印的文档或者电子文档的可移动存储介质(例如压缩包软件)、预装入计算机***(例如在***ROM或者硬盘上)、或者通过通信***(例如因特网或者万维网)从服务器或者电子公告板来发布。
实施全部或者部分这里的上述功能的硬件逻辑(包括用于可编程逻辑设备的可编程逻辑)可以使用传统人工方法设计,或者可以使用各种工具来设计、捕获、模拟、或者建立电子文档,例如计算机辅助设计(CAD)、硬件描述语言(例如VHEL或者AHDL)、或者PLD编程语言(例如PALASM、ABEL、或者CUPL)。
所述可编程逻辑可以永久或者暂时固定在有形存储介质中,例如半导体存储设备(例如RAM、ROM、PROM、EEPROM、或者可编程闪存RAM)、磁存储设备(例如软盘或者硬盘)、光存储设备(例如CD-ROM)、或者其他存储器设备。该可编程逻辑可以按任何形式固定在信号中,该信号传输给使用各种通信技术的计算机,包括但不限于:模拟技术、数字技术、光技术、无线技术(例如蓝牙)、网络技术、以及互联网技术)。该可编程逻辑可以按任何形式来发布,如使用带有打印文档或者电子文档的可移动存储介质(例如压缩包软件)、预装入计算机***(例如在***ROM或者硬盘上)、或者通过通信***(例如因特网或者万维网)从服务器或者电子公告板发布。
本发明涉及下列美国专利申请,通过引用全文并入此处:
代理卷号2950103、名称为Dynamically Expandable andContractible Fault-Tolerant Storage System Permitting Variously SizedStorage Devices and Method;
代理卷号2950104、名称为Dynamically Upgradeable Fault-TolerantStorage System Permitting Variously Sized Storage Devices and Method;and Attorney Docket No.2950/105 entitled Dynamically Expandable;
代理卷号2950105、名称为Dynamically Expandable andContractible Fault-Tolerant Storage System With Virtual Hot Spare。
在不脱离本发明真实范围下,本发明可以实施为其他特殊形式。所述实施例在所有方面都应当认为作为说明而不是限制。
Claims (43)
1.一种在存储装置组中存储数据的方法,该组至少有一个存储装置,所述方法包括:
从多种冗余模式中自动确定混合冗余模式,用于在所述存储装置组中存储数据,以提供容错功能,并且当所述存储装置组正好包含不同存储容量的多个装置时,用于提供改进的存储效率;以及
利用所述混合冗余模式在该存储装置组中存储数据。
2.根据权利要求1的方法,还包括:
自动再配置以前利用第一种冗余模式存储在第一种布置的存储装置上的数据,以利用下述之一进行存储:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置上的第二种冗余模式,(c)不同布置的存储装置上的相同冗余模式,其用于在无数据损失的情况下适应空间的扩展和收缩中的至少一个,所述扩展是通过向该组中添加其它存储装置实现的,而所述收缩是通过从该组中移除存储装置实现的。
3.一种在存储装置组中按允许所述组动态扩展和收缩的方式存储数据的方法,所述组有至少一个存储装置,所述方法包括:
利用第一种冗余模式在所述存储装置组中存储数据;以及
根据所述存储装置组的构成的变化,利用下述之一自动再配置该存储装置组上的数据:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置上的第二种冗余模式,(c)不同布置的存储装置上的相同冗余模式。
4.根据权利要求1、2或3中任意一个的方法,其中从包括下述的组中选择所述冗余模式:镜像、具有奇偶校验的条带化、RAID6、双奇偶校验、对角线奇偶校验、低密度奇偶校验检测码以及turbo码。
5.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨两个存储装置的镜像模式转换为单个存储装置的镜像模式。
6.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨第一对存储装置的镜像模式转换为跨第二对存储装置的镜像模式。
7.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨三个存储装置的条带化模式转换为跨两个存储装置的镜像模式。
8.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨第一组多个存储装置的第一条带化模式转换为跨第二组多个存储装置的第二条带化模式。
9.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨一个存储装置的镜像模式转换为跨两个存储装置的镜像模式。
10.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把在一个存储装置上的镜像模式转换为另一个存储装置上的镜像模式。
11.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨两个存储装置的镜像模式转换为跨三个存储装置的条带化模式。
12.根据权利要求2或3中任意一个的方法,其中再配置数据包括:
把跨第一组多个存储装置的第一条带化模式转换为跨包括添加到所述组的存储装置的第二组多个存储装置的第二条带化模式。
13.根据权利要求1,2或3中任意一个的方法,还包括:
把对象分析为块,每个块都有特定的内容;以及
只在存储***中存储具有唯一性内容的块。
14.根据权利要求13的方法,其中只存储具有唯一性内容的块包括:
根据预定散列函数在存储***中只存储被标识为具有唯一性内容的块。
15.根据权利要求14的方法,其中根据预定散列函数只存储被标识为具有唯一性内容的块包括:
计算每个块的散列号;以及
在存储***中存储用于与所存储的块的散列号相联系的对象的唯一标识符和其位置信息。
16.根据前述15个权利要求中任意一个的方法,其中存储用于对象的唯一标识符包括使用对象表,所述对象表列出了用于每个对象的唯一标识符以及用于所存储的块的散列号。
17.根据前述15个权利要求中任意一个的方法,其中存储位置信息包括,在块表中存储列表,该列表用于每个存于其中的块,包括块在存储***中的物理位置的表示。
18.根据前述13个权利要求中任意一个的方法,还包括:
把存储在存储***中的对象转换为单个存储装置以及文件***和对象存储***中的至少一个的表示。
19.根据前述13个权利要求中任意一个的方法,还包括:
管理存储***中块的物理存储分配,从而提供容错存储,即使当在存储***可能包括不同容量的存储装置时。
20.根据前述15个权利要求中任意一个的方法,还包括:
一旦从存储***中取出特定的块,就根据所存储的块的散列号检验所取出块的内容。
21.根据权利要求20的方法,其中根据所存储的块的散列号检验所取出块的内容包括:
计算取出块的散列号;以及
把计算出的散列号与对应的为所述块存储的散列号进行比较。
22.一种在存储装置组中存储数据的方法,所述方法包括:
利用至少一种冗余模式在所述存储装置组上存储数据;
检测存储装置从所述组中的移除;
利用剩下的存储装置再配置被移除的存储装置中的数据部分;
检测被移除的存储装置是否重新***所述组中;
释放对应于所述部分的重新***的存储装置中的区域;以及
刷新所述重新***的存储装置的可能在移除和重新***之间被更改的任伺剩余部分。
23.一种用于存储数据的***,所述***包括:
存储装置组,该组具有至少一个存储装置;以及
存储管理器,用于利用混合冗余模式在所述存储装置组中存储数据,所述存储管理器自动从多种冗余模式中确定所述混合冗余模式,用于在所述存储装置组中存储数据,以提供容错功能,并且当所述存储装置组正好包含存储容量不同的多个装置时,用于提供改进的存储效率。
24.根据权利要求23所述的***,其中所述存储管理器自动再配置以前利用第一种冗余模式存储在第一种布置的存储装置上的数据,以利用下述之一进行存储:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置上的第二种冗余模式,以及(c)不同布置的存储装置上的相同冗余模式,其用于在无数据损失的情况下适应空间的扩展和收缩中的至少一个,所述扩展是通过向组中添加其它存储装置实现的,而所述收缩是通过从组中移除存储装置实现的。
25.一种用于存储数据的***,所述***包括:
存储装置组,该组具有至少一个存储装置;以及
存储管理器,用于在所述存储装置组中存储数据,所述存储管理器利用第一种冗余模式在所述存储装置组中存储数据;以及根据所述存储装置组的构成的变化,利用下述之一自动再配置该存储装置组上的数据:(a)相同布置的存储装置上的第二种冗余模式,(b)不同布置的存储装置上的第二种冗余模式,(c)不同布置的存储装置上的相同冗余模式。
26.根据权利要求23、24或25中任意一个的***,其中从包括下述的组中选择所述冗余模式:镜像、具有奇偶校验的条带化、RAID6、双奇偶校验、对角线奇偶校验、低密度奇偶校验检测码以及turbo码。
27.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨两个存储装置的镜像模式转换为单个存储装置的镜像模式。
28.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨第一对存储装置的镜像模式转换为跨第二对存储装置的镜像模式。
29.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨三个存储装置的条带化模式转换为跨两个存储装置的镜像模式。
30.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨第一组多个存储装置的第一条带化模式转换为跨第二组多个存储装置的第二条带化模式。
31.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨一个存储装置的镜像模式转换为跨两个存储装置的镜像模式。
32.根据权利要求24或25中任意一个的***,其中所述存储管理器把在一个存储装置上的镜像模式转换为另一个存储装置上的镜像模式。
33.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨两个存储装置的镜像模式转换为跨三个存储装置的条带化模式。
34.根据权利要求24或25中任意一个的***,其中所述存储管理器把跨第一组多个存储装置的第一条带化模式转换为跨包括添加到所述组的存储装置的第二组多个存储装置的第二条带化模式。
35.根据权利要求23,24或25中任意一个的***,还包括:
块分析器,用于把对象分析为块,每个块都有特定的内容,其中所述存储管理器只在存储装置组中存储具有唯一性内容的块。
36.根据权利要求35所述的***,还包括:
散列代码生成器,用于为每个块生成散列号,所述散列代码生成器以及物理存储管理器与对象表存储装置和块表存储装置通信,使得所述对象表列出与所存储的块的散列号相联系的对象的唯一标识符,并且所述块表为每个存于其中的块列出其在所述存储装置组中的物理位置的表示。
37.根据权利要求35所述的***,还包括:
容错管理器,与所述存储管理器通信,用于管理在所述存储装置组中块的物理存储分配,以提供容错存储,即使在所述存储装置组可能包括各种容量的存储装置时。
38.根据权利要求36所述的***,其中一旦从所述存储装置组中取出的特定块,所述物理存储管理器就根据所存储的块的散列号检验所取出块的内容。
39.根据权利要求38所述的***,其中所述物理存储管理器计算所取出块的散列号;以及把计算出的散列号与相应的为所述块存储的散列号进行比较。
40.一种在存储***中释放未使用的存储块的方法,该方法包括:
标识空闲块;
为所述空闲块确定逻辑扇区地址;
根据所述逻辑扇区地址为所述空闲块标识聚簇存取表项;
递减与所述聚簇存取表项相关的引用计数;以及
如果被递减的引用计数为0的话就释放所述块。
41.根据权利要求40所述的方法,其中标识所述空闲块包括:
标识与主机文件***关联的空闲块位图;以及
分析所述空闲块位图以标识不再被文件***使用的聚簇。
42.根据权利要求41所述的方法,其中标识与主机文件***关联的空闲块位图包括:
维持分区表;
分析分区表以定位操作***的分区;
分析该操作***分区以定位超块;以及
根据超块标识主机文件***。
43.根据权利要求41所述的方法,还包括:
制作空闲块位图的工作副本,其中所述空闲块位图的工作副本被分析以标识文件***不再使用的聚簇。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US62549504P | 2004-11-05 | 2004-11-05 | |
US60/625,495 | 2004-11-05 | ||
US60/718,768 | 2005-09-20 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410675211.5A Division CN104699420A (zh) | 2004-11-05 | 2005-11-04 | 允许各种规模存储装置的动态可扩展和可收缩的容错存储***和方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101095116A true CN101095116A (zh) | 2007-12-26 |
Family
ID=38992592
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200580045892 Pending CN101095115A (zh) | 2004-11-05 | 2005-11-04 | 存储***条件指示器和方法 |
CN 200580045895 Pending CN101095116A (zh) | 2004-11-05 | 2005-11-04 | 允许各种规模存储装置的动态可扩展和可收缩的容错存储***和方法 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200580045892 Pending CN101095115A (zh) | 2004-11-05 | 2005-11-04 | 存储***条件指示器和方法 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN101095115A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2009135440A1 (zh) * | 2008-05-08 | 2009-11-12 | 华为技术有限公司 | 数据传输的方法、***及基站子***和移动交换中心 |
CN102023816A (zh) * | 2010-11-04 | 2011-04-20 | 天津曙光计算机产业有限公司 | 一种对象存储***的对象存放策略和访问方法 |
CN102150137A (zh) * | 2008-10-31 | 2011-08-10 | Lsi公司 | 用于改善性能的raid卷和驱动器组之间松耦合 |
CN102200934A (zh) * | 2010-03-26 | 2011-09-28 | Lsi公司 | 不使用奇偶校验和镜像法在raid***中建立高级别的冗余、容错性及性能的方法 |
CN103631535A (zh) * | 2013-11-20 | 2014-03-12 | 华为技术有限公司 | 一种实现存储池内空间分配的方法及装置 |
CN105404560A (zh) * | 2015-11-05 | 2016-03-16 | 华中科技大学 | 一种对象存储***中基于raid5的安全认证方法 |
CN103914403B (zh) * | 2014-04-28 | 2016-11-02 | 中国科学院微电子研究所 | 一种混合内存访问情况的记录方法及其*** |
CN109815169A (zh) * | 2019-01-16 | 2019-05-28 | 浙江大华技术股份有限公司 | 一种存储设备及其存储链路自适应的方法 |
CN110109867A (zh) * | 2018-01-18 | 2019-08-09 | 伊姆西Ip控股有限责任公司 | 改进在线模式检测的方法、装置和计算机程序产品 |
CN110471789A (zh) * | 2019-07-02 | 2019-11-19 | 深圳市金泰克半导体有限公司 | 固态硬盘纠错方法及固态硬盘 |
CN111656339A (zh) * | 2017-12-22 | 2020-09-11 | 阿里巴巴集团控股有限公司 | 存储器装置及其控制方法 |
CN112069535A (zh) * | 2020-08-13 | 2020-12-11 | 中国电子科技集团公司第三十研究所 | 一种基于访问分区物理隔离的双***安全智能终端架构 |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102122284B (zh) | 2010-01-08 | 2014-07-02 | 腾讯科技(深圳)有限公司 | 一种复合文档存储、读写方法和装置 |
CN102402488A (zh) * | 2010-09-16 | 2012-04-04 | 电子科技大学 | 一种适用于基于磁盘的消冗存储***的加密方案(esds) |
US20140297921A1 (en) * | 2013-03-26 | 2014-10-02 | Skymedi Corporation | Method of Partitioning Physical Block and Memory System Thereof |
US9235468B2 (en) * | 2013-04-12 | 2016-01-12 | Qualcomm Incorporated | Systems and methods to improve the reliability and lifespan of flash memory |
CN108628761B (zh) * | 2017-03-16 | 2022-04-22 | 北京忆恒创源科技股份有限公司 | 原子命令执行方法与装置 |
CN115687368B (zh) * | 2023-01-04 | 2023-03-17 | 上海亿铸智能科技有限公司 | 一种数据存储方法、装置、***及存储介质 |
-
2005
- 2005-11-04 CN CN 200580045892 patent/CN101095115A/zh active Pending
- 2005-11-04 CN CN 200580045895 patent/CN101095116A/zh active Pending
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2009135440A1 (zh) * | 2008-05-08 | 2009-11-12 | 华为技术有限公司 | 数据传输的方法、***及基站子***和移动交换中心 |
CN102150137A (zh) * | 2008-10-31 | 2011-08-10 | Lsi公司 | 用于改善性能的raid卷和驱动器组之间松耦合 |
CN102200934A (zh) * | 2010-03-26 | 2011-09-28 | Lsi公司 | 不使用奇偶校验和镜像法在raid***中建立高级别的冗余、容错性及性能的方法 |
CN102023816A (zh) * | 2010-11-04 | 2011-04-20 | 天津曙光计算机产业有限公司 | 一种对象存储***的对象存放策略和访问方法 |
CN103631535A (zh) * | 2013-11-20 | 2014-03-12 | 华为技术有限公司 | 一种实现存储池内空间分配的方法及装置 |
CN103631535B (zh) * | 2013-11-20 | 2016-08-17 | 华为技术有限公司 | 一种实现存储池内空间分配的方法及装置 |
CN103914403B (zh) * | 2014-04-28 | 2016-11-02 | 中国科学院微电子研究所 | 一种混合内存访问情况的记录方法及其*** |
CN105404560B (zh) * | 2015-11-05 | 2019-01-04 | 华中科技大学 | 一种对象存储***中基于raid5的安全认证方法 |
CN105404560A (zh) * | 2015-11-05 | 2016-03-16 | 华中科技大学 | 一种对象存储***中基于raid5的安全认证方法 |
CN111656339A (zh) * | 2017-12-22 | 2020-09-11 | 阿里巴巴集团控股有限公司 | 存储器装置及其控制方法 |
CN111656339B (zh) * | 2017-12-22 | 2023-06-13 | 阿里巴巴集团控股有限公司 | 存储器装置及其控制方法 |
CN110109867A (zh) * | 2018-01-18 | 2019-08-09 | 伊姆西Ip控股有限责任公司 | 改进在线模式检测的方法、装置和计算机程序产品 |
CN110109867B (zh) * | 2018-01-18 | 2023-03-31 | 伊姆西Ip控股有限责任公司 | 改进在线模式检测的方法、装置和计算机程序产品 |
CN109815169A (zh) * | 2019-01-16 | 2019-05-28 | 浙江大华技术股份有限公司 | 一种存储设备及其存储链路自适应的方法 |
CN109815169B (zh) * | 2019-01-16 | 2021-02-02 | 浙江大华技术股份有限公司 | 一种存储设备及其存储链路自适应的方法 |
CN110471789A (zh) * | 2019-07-02 | 2019-11-19 | 深圳市金泰克半导体有限公司 | 固态硬盘纠错方法及固态硬盘 |
CN112069535A (zh) * | 2020-08-13 | 2020-12-11 | 中国电子科技集团公司第三十研究所 | 一种基于访问分区物理隔离的双***安全智能终端架构 |
Also Published As
Publication number | Publication date |
---|---|
CN101095115A (zh) | 2007-12-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101872319A (zh) | 存储***条件指示器及其使用方法 | |
CN101501623B (zh) | 感知文件***的块存储***、装置和方法 | |
CN101095116A (zh) | 允许各种规模存储装置的动态可扩展和可收缩的容错存储***和方法 | |
US7873782B2 (en) | Filesystem-aware block storage system, apparatus, and method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C53 | Correction of patent for invention or patent application | ||
CB02 | Change of applicant information |
Address after: American California Applicant after: Deluobo Corp. Address before: American California Applicant before: Data Robotics Inc. |
|
COR | Change of bibliographic data |
Free format text: CORRECT: APPLICANT; FROM: DATA ROBOTICS INC. TO: DELUOBO CORP. |
|
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20071226 |