可动态调整条带深度的raid0的实现方法及系统的制作方法

文档序号:6375551阅读:220来源:国知局
专利名称:可动态调整条带深度的raid 0的实现方法及系统的制作方法
技术领域
本发明涉及信息存储领域,尤其涉及一种可动态调整条带深度的RAID O的实现方法及系统。
背景技术
RAID是英文Redundant Array of Independent Disks 的缩写,翻译成中文即为独立磁盘冗余阵列,或简称磁盘阵列。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据冗余的技术。RAID通过对硬盘上的数据进行条带化,可以让很多磁盘驱动器同时 传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可以达到单个磁盘驱动器几倍的性能。RAID O是其中的一种,其特点是条带在RAID创建时同时被创建,且同一个RAID中,每个条带的深度都是一致的。一般的我们尽量的将Stripe Size设置为等于上层应用I/O块大小,这样一个I/O的读写尽可能分布到RAID O中所有的磁盘上,同时进行,从而获得最佳的并行效果。但是,上层应用I/O的块大小可能是变化的,或者需要在RAID O上同时运行多种应用,不同应用所需的最优Stripe Size又是不一样的。例如,对于视频应用,也许IMB的Stripe Size是最佳的,但是对于数据库可能16KB的Stripe Size是最佳的。因此固定的条带深度在实际应用中并不能在各种应用场合都能获得最佳的并行效果。固态硬盘(Solid State Disk, SSD)是一种建立在标准NAND Flash等非挥发存储介质基础上的新一代存储设备,完全半导体化,无机械结构,具有低功耗、无噪音、抗震动、低热量等特点,不存在磁盘寻道时间,数据存取速度快,数据吞吐量能和IOPS能达到传统硬盘的数千倍。随着NAND Flash制程技术不断提高及成本的降低,有效地降低了 SSD的成本,推进SSD的应用普及。NAND Flash存储器的特点是由Block (块)构成,block的基本单元是Page(页),每个Page的存储区又包含Data area (数据存储区)和Spare area (备用区域)。不同厂商,不同规格的Nand Flash的Page, Block及Spare area的大小可能会有区别。以美光的一款Nand Flash为例,一个Page的大小为8KB, Spare area的大小为448B, —个Block包含256个Page。但不管是哪个厂商的都包含Spare area区域,实际上用户可见的存储空间都是指Data area区,而每个Page中Spare area区处理较多的用于存储ECC数据外,剩余部分区域都是空闲的,浪费了,而过去的RAID O信息都需要额外占用用户的存储空间。因此,现有的固定条带深度的RAID O存在不能在不同应用1/0块大小的场景下都获得最佳的并发处理,且RAID O的条带信息还需额外消耗系统存储空间的缺陷。

发明内容
针对以上缺陷,本发明目的在于提出了一种可动态调整条带深度的RAID O的实现方法及系统,以解决在不同的应用I/o块大小的场景中都可获得最佳的并发效果,整体上提高存储器的访问速度且不额外占用用户的存储空间。为了实现上述目的,本发明提供了一种可动态调整条带深度的RAID O的实现方法及系统,所述方法包括
步骤I. I,接收到应用访问RAID O的I/O命令,在条带地址映射表中查找I/O命令要读写的数据是否覆盖已存在的条带,如果存在则直接根据检索到的条带的条带表项信息跳到步骤I. 4开始执行,否则继续执行步骤I. 2 ;
步骤I. 2,动态创建RAID O的条带,其中条带深度StripeDepth根据I/O命令要读写数据的大小动态计算,保证StripeDepth为StripeDepthmin的整数倍,其中StripeDepthmin为最小条带深度,等于区块的大小;并创建该条带的条带表项信息;其中条带表项信息包括开始条带的逻辑区块地址StripeStartLBA,结束逻辑区块地址StripeEndLBA和条带深度 StripeDepth 信息; 步骤I. 3,将步骤I. 2创建的条带表项信息添加到条带地址映射表中,条带表项信息的集合构成条带地址映射表;
步骤I. 4,根据步骤I. I检索到的或步骤I. 2新创建的条带的条带表项信息计算出各个FLASH盘中的数据的物理区块地址PBA ;
步骤I. 5,根据步骤I. 4计算得到的地址信息PBA,拆分I/O命令为多个子命令到各个成员FLASH盘中,实现并发数据访问。可动态调整条带深度的RAID O的实现方法,在于所述条带表项信息按如下方法计算获得
步骤 2. I, StripeStartLBA = StartLBA/N X N ;
步骤 2. 2, Len = Len + StartLBA - StripeStartLBA ;
步骤2. 3,计算条带深度StripeDepth,
当 Len%N 等于 O 时,取 StripeDepth 为 Len / N,
当 Len%N 不等于 O 时,取 StripeDepth 为 Len / N +1 ;
步骤 2. 4,计算 StripeEndLBA = StartLBA + StripeDepthXN -I其中,StartLBA为I/O读写的开始逻辑区块地址,FLASH盘数目为N,I/O命令读写的数据块长度为Len。可动态调整条带深度的RAID O的实现方法,在于所述PBA按如下方法计算获得
步骤 3. I,计算 DiskID :DiskID = (LBA - StripeStartLBA) /StripeDepth ;
步骤 3. 2,计算 StripeStartPBA
StripeStartPBA = (StripeStartLBA /StripeSizemin) X StripeDepthmin
= StripeStartLBA / N
步骤3. 3,计算PBA
PBA = StripeStartPBA + LBA - (StripeStartLBA + DiskIDXStripeDepth);
其中,LBA为要访问的逻辑区块地址,DiskID为所要读写的LBA所在的FLASH盘ID,最小区块大小StripeSizemin =N。可动态调整条带深度的RAID O的实现方法,在于所述的FLASH盘为NAND FLASH盘;所述的方法还包括,在创建新的条带表项信息时,在NAND FLASH的每个Page的Sparearea中增加存储如下元数据
((StripeStartPBA , StripeEndPBA), StripeStartLBA);具有相同的 StripeStartLBA的Page数据区属于同一个条带;
其中
StripeStart PBA = (StripeStartLBA /StripeSizemin) X StripeDepthmin=StripeStartLBA / NStripeEndPBA = (StripeEndLBA /StripeSizemin) X StripeDepthmin
=StripeEndLBA / N。
可动态调整条带深度的RAID O的实现方法,在于所述的条带地址映射表在系统重新启动时,通过按照PBA顺序扫描NAND FLASH的所有Page的Spare area区域中的元数据,根据该信息构建出整个RAID O的条带地址映射表。可动态调整条带深度的RAID O系统,所述系统包括
I/O处理模块,用于接收到系统访问RAIDO的I/O命令,及拆分I/O命令;
地址映射模块,用于动态创建RAID O的条带,其中条带深度StripeD^th根据I/O命令的数据块的大小动态计算,保证StripeDepth为StripeDepthmin的整数倍,其中StripeDepthmin为最小条带深度StripeDepthmin,等于区块的大小;并创建该条带的条带表项信息;将创建的条带表项信息添加到条带地址映射表中,并根据条带表项信息计算出各个FLASH盘中的数据的物理区块地址PBA ;
Flash读写模块,负责与Flash控制器交互,根据地址映射模块计算出的用户请求的PBA地址实现读写用户数据。可动态调整条带深度的RAID O系统,在于所述的条带表项信息包括开始条带的逻辑区块地址StripeStartLBA,结束逻辑区块地址StripeEndLBA和条带深度StripeDepth信息,其中
StripeStartLBA = StartLBA/N X N ;
Len = Len + StartLBA - StripeStartLBA ;
当 Len%N 等于 O 时,取 StripeDepth 为 Len / N,
当 Len%N 不等于 O 时,取 StripeDepth 为 Len / N +1 ;
StripeEndLBA = StartLBA + StripeDepthXN -I
其中,StartLBA为应用I/O访问的开始逻辑区块地址,N为FLASH盘数目,I/O所需要访问的数据长度为Len。可动态调整条带深度的RAID O系统,在于所述的地址映射模块在计算出该条带表项信息的同时还计算出新创建出来的条带对应的实际NAND FLASH的每个Page的元数据,包括 StripeStartPBA , StripeEndPBA,和 StripeStartLBA ;并可通过 Flash 读写模块在创建条带的同时将这些元数据存储到NAND FLASH每个Page的Spare area区域中。可动态调整条带深度的RAID O系统,在于所述系统还包括条带地址映射表初始化模块,所述模块实现在系统重新启动时,通过按照PBA顺序扫描NAND FLASH的所有Page的Spare area区域中的元数据,根据该信息构建出整个RAID O的条带地址映射表。本发明针对上层不同的应用I/O的块大小是变化的情况,提出了动态根据应用I/O的块大小,来动态创建RAID O的条带,并根据I/O的块大小确定条带的深度,保证应用I/O的请求尽可能的均匀分散到N个存储器上,并充分利用NAND FLASH的特点在NAND FLASH的Spare area区域存储条带相关信息,不额外占用用户存储空间的前提下,获得在不同的应用I/O块大小的场景中都可获得最佳的并发效果,整体上提高存储器的访问速度。


图I是条带深度可变的RAID O示意 图2是RAID O命令处理流程如 图3是命令拆分示意 图4是RAID O系统架构图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本发明中,定义“/”为整除运算,只保留结果的整数部分,“%”为取余数运算。参见图I是条带深度可变的RAID O示意图,图I横向表示有N个Disk,表示RAID O磁盘数目为N;RAID O的纵向表示有多个条带Stripel、Stripe2、Stripe3……,StripeDepthmin为最小条带深度等于区块的大小;图I所示的Stripel的条块深度为2* StripeDepthmin、Stripe2 的条块深度为 I* StripeDepthmin、Stripe3 的条块深度为 4*StripeDepthmin,各个条带的深度是不一样的,但都是StripeDepthmin的整数倍,从而保证了任何一个条带的起始地址一定也是N的整数倍,而具体条带的深度是由I/O读写的大小来决定的,在RAID的条带读写过程中动态创建的和计算决定的。所述的Disk为NAND FLASH构成的硬盘。同时系统内存在系统启动的时候开始维护一份RAID O的条带地址映射表,每个条带对应着映射表中的一表项,因为每个条带的深度可能不一样,因此每个表项都记录了该条带的条带深度。具体到每个表项都记录了如下信息:_
StripeStartLBA StripeEndLBA StripeDepth对应于图I所示的条带Stripel、Stripe2和Stripe3对应的表项为
O |2N-1 下
~2N 3N-1 ~T 3Ν |7Ν-1 ~|4
这样每个条带在每个Disk上的起始StripStartPBA可以通过以下方式计算获得StripeStartPBA = (StripeStartLBA /StripeSizemin) X StripeDepthmin=StripeStart LBA / NStripeEndPBA = (StripeEndLBA /StripeSizemin) X StripeDepthmin=StripeEndLBA / N参见图4是RAID O的系统框架图,整个系统核心部分包含3个模1/0处理模块、地址映射模块和FLASH读写模块。其中I/O处理模块通过系统I/O总线接收应用读写RAID的命令、并将读写的结果反馈给应用和将读写RAID的命令根据地址映射模块解析出的地址信息,将一个读写RAID的命令拆分成几个实际FLASH的读写命令,通过FLASH读写模块实现并行读写多个FLASH的操作。参见图2是RAID O命令处理流程图,
步骤11 当I/O处理模块接收到一个读写命令后,首先在系统的条带地址映射表中查找要读写的数据块是否命中已存在的条带。步骤12 :分三种情况处理。A.完全命中已有条带读写的数据块全部都在已存在的条带中,那么根据命中条带的表项计算出各个Flash盘中数据的PBA,拆分读写命令到成员盘。B.没有命中已有条带读写的数据块完全与已存在的条带没有重合,那么创建新的条带表项。 C.部分命中已有条带读写的数据块部分命中已存在的条带,那么将这个命令拆 分,命中的部分与A情况中的处理流程相同,未命中部分与B情况的处理流程相同。一个命令可能被拆分为两个或者两个以上的子命令。参见图3命令拆分不意图,如图3所不应用I/O发出读写命令C被拆分为5个子命令Stripe A、Stripe B和Stripe C是内存中的地址映射表已记录的在线条带,通过查询内存中的地址映射表发现C命令的部分和Stripe A、Stripe B和Stripe C重合,这3部分可以分别拆成3个子命令分别访问Stripe A、Stripe B和Stripe C;其中C命令还有未命中部分I和未命中部分2,需要创建新的条带,其中未命中部分I将创建一个StripeD印th为I的条带,未命中部分2将创建一个StripeDepth为2的条带。这样实现将命令C拆分为5个子命令。步骤13 :图2中未命中的命令创建条带及条带表项未命中的命令可能就是原始命令C,或者来自从原始命令C拆分得到的多个未命中的子命令,下面具体介绍下创建条带及条带表项的具体过程。假设未命中命令Cl的起始地址为StartLBA,长度为Len。未命中命令Cl的结束EndLBA = StartLBA + Len - I。命令Cl请求的就是读写从StartLBA到EndLBA之间的数据,它不一定正好从条带起始位置开始,也不一定在一个条带的末尾结束。条带表项根据命令Cl的信息动态建立。伪码如下
StripeStartLBA = StartLBA/N X N // 找到 Start LBA 前面最近的条带起始
LBA
Len = Len+ StartLBA - StripeStartLBA //长度加上StartLBA到条带开始的距离。if (Len%N == O) // 长度正好是 StripeSizemin 的整数倍
StripeDepth = Len / N
else
StripeDepth = Len / N +1StripeEndLBA = StartLBA + StripeDepthXN -I可以看出StripeDepth的产生方法保证了读写数据被尽可能的拆分到N个Flash盘上。从StartLBA到EndLBA中的某一个LBA,它所在的Flash盘IDDiskID = (LBA - StripeStartLBA) /StripeDepth
PBA = StripeStartPBA + LBA - (StripeStartLBA + DiskIDXStripeDepth)有了DiskID和PBA便可以知道某块具体的数据对应到RAID中的哪个位置。当创建了新的条带表项时,需要在对应的Nand Flash的每个Page的Spare area中储存相应的元数据。元数据的格式如下
((StripeStartPBA , StripeEndPBA), StripeStartLBA)
具有相同的StripeStartLBA的数据区属于同一个条带。这样当系统重启后,每个Flash盘按照PBA顺序扫描读取元数据,根据获取到的元数据可重新组合得到整个RAID的条带地址映射表。
以上所揭露的仅为本发明一种实施例而已,当然不能以此来限定本之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于本发明所涵盖的范围。
权利要求
1.可动态调整条带深度的RAIDO的实现方法,其特征在于步骤I. 1,接收到应用访问RAID O的I/O命令,在条带地址映射表中查找I/O命令要读写的数据是否覆盖已存在的条带,如果存在则直接根据检索到的条带的条带表项信息跳到步骤I. 4开始执行,否则继续执行步骤I. 2; 步骤I. 2,动态创建RAID O的条带,其中条带深度StripeDepth根据I/O命令要读写数据的大小动态计算,保证StripeDepth为StripeDepthmin的整数倍,其中StripeDepthmin为最小条带深度,等于区块的大小;并创建该条带的条带表项信息;其中条带表项信息包括开始条带的逻辑区块地址StripeStartLBA,结束逻辑区块地址StripeEndLBA和条带深度 StripeDepth 信息; 步骤I. 3,将步骤I. 2创建的条带表项信息添加到条带地址映射表中,条带表项信息的集合构成条带地址映射表; 步骤I. 4,根据步骤I. I检索到的或步骤I. 2新创建的条带的条带表项信息计算出各个FLASH盘中的数据的物理区块地址PBA ; 步骤I. 5,根据步骤I. 4计算得到的地址信息PBA,拆分I/O命令为多个子命令到各个成员FLASH盘中,实现并发数据访问。
2.根据权利要求I所述的方法,其特征在于所述条带表项信息按如下方法计算获得 步骤 2. I, StripeStartLBA = StartLBA/N X N ; 步骤 2. 2, Len = Len + StartLBA - StripeStartLBA ; 步骤2. 3,计算条带深度StripeDepth, 当 Len%N 等于 O 时,取 StripeDepth 为 Len / N,当 Len%N 不等于 O 时,取 StripeDepth 为 Len / N +1 ;步骤 2. 4,计算 StripeEndLBA = StartLBA + StripeDepthXN -I; 其中,StartLBA为I/O读写的开始逻辑区块地址,FLASH盘数目为N,I/O命令读写的数据块长度为Len。
3.根据权利要求2所述的方法,其特征在于所述PBA按如下方法计算获得步骤 3. I,计算 DiskID :DiskID = (LBA - StripeStartLBA) /StripeDepth ;步骤 3. 2,计算 StripeStartPBA StripeStartPBA = (StripeStartLBA /StripeSizemin) X StripeDepthmin= StripeStartLBA / N 步骤3. 3,计算PBA PBA = StripeStartPBA + LBA - (StripeStartLBA + DiskIDX StripeDepth); 其中,LBA为要访问的逻辑区块地址,DiskID为所要读写的LBA所在的FLASH盘ID,最小区块大小StripeSizemin =N。
4.根据权利要求3所述的方法,其特征在于所述的FLASH盘为NANDFLASH盘;所述的方法还包括,在创建新的条带表项信息时,在NAND FLASH的每个Page的Spare area中增加存储如下元数据((StripeStartPBA , StripeEndPBA), StripeStartLBA);具有相同的 StripeStartLBA的Page数据区属于同一个条带;其中 StripeStartPBA = (StripeStartLBA /StripeSizemin) X StripeDepthmin =StripeStartLBA / NStripeEndPBA = (StripeEndLBA /StripeSizemin) X StripeDepthmin =StripeEndLBA / N 。
5.根据权利要求4所述的方法,其特征在于所述的条带地址映射表在系统重新启动时,通过按照PBA顺序扫描NAND FLASH的所有Page的Spare area区域中的元数据,根据该元数据组合构建出整个RAID O的条带地址映射表。
6.可动态调整条带深度的RAIDO系统,其特征在于所述系统包括 I/O处理模块,用于接收到系统访问RAIDO的I/O命令,及拆分I/O命令; 地址映射模块,用于动态创建RAID O的条带,其中条带深度StripeD^th根据I/O命令的数据块的大小动态计算,保证StripeDepth为StripeDepthmin的整数倍,其中StripeDepthmin为最小条带深度Stripe Depthmin,等于区块的大小;并创建该条带的条带表项信息;将创建的条带表项信息添加到条带地址映射表中,并根据条带表项信息计算出各个FLASH盘中的数据的物理区块地址PBA ;Flash读写模块,负责与Flash控制器交互,根据地址映射模块计算出的用户请求的PBA地址实现读写用户数据。
7.根据权利要求6所述的可动态调整条带深度的RAIDO系统,其特征在于所述的条带表项信息包括开始条带的逻辑区块地址StripeStartLBA,结束逻辑区块地址StripeEndLBA和条带深度StripeDepth信息,其中 StripeStartLBA = StartLBA/N X N ; Len = Len + StartLBA - StripeStartLBA ; 当 Len%N 等于 O 时,取 StripeDepth 为 Len / N, 当 Len%N 不等于 O 时,取 StripeDepth 为 Len / N +1 ;StripeEndLBA = StartLBA + StripeDepthXN -I ; 其中,StartLBA为应用I/O访问的开始逻辑区块地址,N为FLASH盘数目,I/O所需要访问的数据长度为Len。
8.根据权利要求7所述的可动态调整条带深度的RAIDO系统,其特征在于所述的地址映射模块在计算出该条带表项信息的同时还计算出新创建出来的条带对应的实际NANDFLASH 的每个 Page 的兀数据,包括 StripeStartPBA , StripeEndPBA,和 StripeStartLBA ;并可通过Flash读写模块在创建条带的同时将这些元数据存储到NAND FLASH每个Page的Spare area 区域中。
9.根据权利要求8所述的可动态调整条带深度的RAIDO系统,其特征在于所述系统还包括条带地址映射表初始化模块,所述模块实现在系统重新启动时,通过按照PBA顺序扫描NAND FLASH的所有Page的Spare area区域中的元数据,根据该信息构建出整个RAIDO的条带地址映射表。
全文摘要
可动态调整条带深度的RAID0的实现方法,本发明通过接收应用访问RAID0的I/O命令,动态创建RAID0的条带,条带深度StripeDepth根据I/O命令要读写数据的大小动态计算,保证为StripeDepthmin的整数倍,StripeDepthmin等于区块的大小,并将记录每个条带信息的元数据存储到NANDFLASH的Sparearea区。并同时设计了实现该可动态调整条带深度的RAID0的实现方法的系统。在不额外占用用户存储空间的前提下,获得在不同的应用I/O块大小的场景中都可获得最佳的并发效果,整体上提高存储器的访问速度。
文档编号G06F3/06GK102819408SQ20121030234
公开日2012年12月12日 申请日期2012年8月24日 优先权日2012年8月24日
发明者夏君扬 申请人:记忆科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1