发明内容
本发明实施例提出一种存储系统、从存储系统读取数据的方法及写入数据的方法,以降低存储系统的复杂度。
本发明实施例提供了一种存储系统,包括控制器及划分有廉价磁盘阵列条带的第一硬盘,其中,还包括:
固态硬盘组,所述固态硬盘组被分配给所述第一硬盘的逻辑单元编号对应的存储空间;所述固态硬盘组被划分为廉价磁盘阵列条带的集合;所述固态硬盘组的廉价磁盘阵列条带与所述第一硬盘的廉价磁盘阵列条带具有相同的条带深度及条带尺寸;
所述控制器保存有用于表示所述存储空间与所述固态硬盘组映射关系的哈希映射表;所述哈希映射表的表项包含索引、指针域及位图域;
所述控制器还保存有解析函数,所述解析函数用于将读写请求中的起始地址解析为所述哈希映射表的索引。
本发明实施例还提供了一种从存储系统读取数据的方法,包括:
接收读请求;
以第一硬盘的廉价磁盘阵列条带为单位对所述读请求中的地址进行划分,得到廉价磁盘阵列条带地址;
解析所述廉价磁盘阵列条带地址中的起始地址,获得相应的哈希映射表的表项的索引;所述哈希映射表的表项包含索引、指针域及位图域;
当所述索引所在的哈希映射表的表项中的指针域非空时,将所述起始地址与所述表项中的指针域的值进行比较;
当所述起始地址与所述表项中指针域的值之差小于所述廉价磁盘阵列条带的尺寸时,从所述表项的位图域对应的固态硬盘组的条带单元中读出数据;所述固态硬盘组被分配给所述第一硬盘的逻辑单元编号对应的存储空间。
本发明实施例还提供了一种向存储系统写入数据的方法,包括:
接收写请求;
以第一硬盘的廉价磁盘阵列条带为单位对所述写请求中的地址进行划分,得到廉价磁盘阵列条带地址;
解析所述廉价磁盘阵列条带地址中的起始地址,得到相应的哈希映射表的表项的索引,所述哈希映射表的表项包含索引、指针域及位图域;
将所述廉价磁盘阵列条带地址对应的数据写入所述索引所在表项对应的固态硬盘组的条带单元;所述固态硬盘组被分配给所述第一硬盘的逻辑单元编号对应的存储空间;
更新所述哈希映射表的表项。
上述实施例中,存储系统通过哈希映射表将SSD组作为缓存,使得存储系统对于访问请求的处理无需考虑所访问数据的冷热情况,降低了存储系统的复杂度。并且,对于一段时间内频繁访问和更新的数据能够直接命中硬盘缓存(DISK CACHE)即SSD组,提高了存储系统的响应能力。同时,由于硬盘缓存是非易失性存储介质,掉电后数据不会丢失,因而存储系统不用再具备备用电池,节约了成本。且由于硬盘缓存的有效空间比RAM大很多,进一步增加了访问数据在缓存中的停留时间,增大了合并的可能性。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的存储系统的结构示意图。该系统可包括:控制器11、第一硬盘12及为第一硬盘12的LUN对应的存储空间分配的固态硬盘即SSD组13。第一硬盘12可为RAID 5硬盘、RAID0硬盘、RAID1硬盘等。假设第一硬盘12被分区,则每个分区都有自己的LUN,LUN对应的存储空间也即LUN分区。如为第一硬盘12中的某一个分区分配SSD组13,作为第一硬盘12的缓存。则SSD组13被划分为RAID条带如RAID1+0条带、RAID0条带的集合;且SSD组13的RAID条带与所述第一硬盘12的R
AID条带具有相同的条带深度及条带尺寸。当SSD组13被划分为RAID1+0条带时,SSD组13的RAID1+0条带中还可包含预留的校验数据的条带单元即校验单元,以及各条带单元的镜像。则校验单元及其镜像统称为校验单元镜像对,其他条带单元及其镜像统称为条带单元镜像对。
控制器11保存有用于表示所述存储空间也即第一硬盘12中的某一LUN分区与所述SSD组13映射关系的哈希映射表。所述哈希映射表的表项包含索引、指针域及位图域;所述索引用于区分所述哈希映射表的不同表项;所述指针域指向所述磁盘中的RAID条带;所述位图域用于表示SSD组13中对应的条带单元是否存储有所述指针域指向的RAID条带。
例如,当从RAID5硬盘中创建一个LUN分区时,为该LUN分区分配由SSD构建的磁盘阵列即SSD组作为缓存。其中,RAID5硬盘可以采用左对齐等格式设置校验单元。
该SSD组可按RAID1+0级别构建,即可被划分为RAID1+0条带,成为RAID1+0条带的集合。这些RAID1+0条带与LUN中的RAID5条带具有相同的分条深度和条带尺寸。并且每个RAID1+0条带包含一个预留的校验单元镜像对,用于解决写洞(write-hole)问题。如图2、图3所示。图2为本发明实施例提供的存储系统中按RAID 5级别构建的磁盘阵列示意图。图3为本发明实施例提供的存储系统中SSD按RAID1+0级别构建的磁盘阵列示意图。图2中第一硬盘由硬盘0~硬盘3按RAID5级别构建而成,RAID5条带格式为3D+1P。对应地,图3中LUN分区的SSD组由SSD0、SSD1及SSD2按RAID1+0级别构建而成,各RAID1+0条带包含3个条带单元镜像对。各RAID1+0条带还可进一步包含一个校验单元镜像对(Pre-P)。图4为本发明实施例提供的存储系统中哈希映射表的映射示意图。如图4所示,每个哈希映射表表项对应一个RAID1+0物理条带。哈希映射表表项中的指针域指向当前被缓存的RAID5条带,另一个域是用于指示RAID5条带中被缓存的条带单元的位图。如索引为0的哈希映射表表项对应0号RAID1+0物理条带。由于图3中映射表表项的位图域为16bit,因此,每个哈希映射表表项中的位图最多可描述SSD组中的16个条带单元。读写RAID5条带时,利用哈希映射表找到该RAID5条带的缓存RAID1+0条带。
当磁盘阵列中创建有多个LUN分区时,可为每个LUN分区的关联SSD组缓存分配一个哈希映射表。哈希映射表里的内容对磁盘阵列控制器是可见的,所以在更新SSD组RAID条带中的数据时,必须同步进行哈希映射表数据的更新。
所述控制器11还保存有解析函数,所述解析函数用于将读写请求中的起始地址解析为所述哈希映射表索引。该解析函数可为哈希函数,将主机的读写请求的起始地址解析为哈希映射表表项的索引,比如可以使用求余数的方法。
主机向磁盘阵列控制器发出读写请求时,控制器通过输入输出(IO)模块接收该读写请求,并将该读写请求的数据读出或写入上述方法实施例实现的缓存中。
本实施例中,存储系统通过哈希映射表将SSD组作为缓存,使得存储系统对于访问请求的处理无需考虑所访问数据的冷热情况,降低了存储系统的复杂度。进一步地,对于RAID5硬盘存储系统,能够直接利用哈希表决定每个RAID5条带在SSD组中的缓存位置,并利用哈希表缓存于SSD组中的条带写回RAID5硬盘或阵列中,而不需要统计数据的冷热程度,对于一段时间内频繁访问和更新的数据能够直接命中硬盘缓存(DISK CACHE)即SSD组,从而提高了存储系统的响应能力。同时,由于硬盘缓存是非易失性存储介质,掉电后数据不会丢失,所以存储系统不用再具备备用电池。并且,由于硬盘缓存的有效空间比RAM大很多,进一步增加了访问数据在缓存中的停留时间,增大了合并的可能性。
图5为本发明实施例提供的一种从存储系统读取数据的方法的流程图。本实施例中,上述存储系统采用SSD组作为硬盘缓存的读操作过程包括:
步骤51、接收读请求;该动作可由控制器执行。控制器接收主机发送的读请求。
步骤52、以第一硬盘的RAID条带为单位对读请求中的地址进行划分,得到的RAID条带地址。如对以RAID5级别构建的第一硬盘,则以RAID5条带为单位对读请求中的地址进行划分,得到的RAID5条带地址。当读请求中的起始地址与末尾地址与第一硬盘RAID条带尺寸边界没有对齐时,划分得到的第一个RAID5条带地址和最后一个RAID5条带地址不足一个条带尺寸,则系统将其视作读满一个条带,进行读操作预取。读操作时,读取的每个RAID5条带地址所在的RIAD5条带的起始地址与条带尺寸边界对齐,并且每个RAID5条带的长度都为一个条带尺寸,即对读请求划分得到的RAID5条带长度与LUN分区中的RAID 5条带长度相同。假设读请求要求读取地址4~25中的数据,且一个RAID5条带尺寸为8,则对地址4~25划分后,得到四个RAID5条带地址。其中,第一个RAID5条带地址包括地址4~7,第二个RAID5条带地址包括地址8~15,第三个RAID5条带地址包括地址16~23,第四个RAID5条带地址包括地址24~25。此时,将第一个RAID5条带地址视为地址0~7,将第四个RAID5条带地址为地址24~31。第一个RAID5条带地址的起始地址为地址4,第一个RAID5条带地址所在的RAID5条带的起始地址为0。而第二个RAID5条带地址、第三个RAID5条带地址及第四个RAID5条带地址的起始地址与各自所在的RAID5条带地址的起始地址相同,分别为地址8、地址16、地址24。
步骤53、利用所述RAID条带地址中的起始地址得到相应的哈希映射表表项的索引。该动作可由控制器11通过解析函数对各个RAID条带地址中的起始地址进行解析得到相应的哈希映射表表项的索引。假设上述第一个RAID5条带地址的首地址4经解析函数解析得到哈希映射表表项的索引为0,上述第一个RAID5条带地址的起始地址经解析函数解析得到哈希映射表表项的索引为0;上述第二个RAID5条带地址的起始地址8经解析函数解析得到哈希映射表表项的索引为1;上述第三个RAID5条带地址的起始地址16经解析函数解析得到哈希映射表表项的索引为2,上述第四个RAID5条带地址的起始地址24经解析函数解析得到哈希映射表表项的索引为3。从而得到:哈希映射表表项0、1、2、3分别对应第一个RAID5条带地址所在的RAID5条带、第二个RAID5条带地址所在的RAID5条带、第三个RAID5条带地址所在的RAID5条带、第四个RAID5条带地址所在的RAID5条带。假设SSD组按RAID1+0构建,则同时也表示哈希映射表表项0、1、2、3分别对应SSD组中的第一个RAID1+0条带、第二个RAID1+0条带、第三个RAID1+0条带、第四个RAID1+0条带。这样,通过表项0中的指针域便可获知地址4~7上的数据在RAID5硬盘中的物理位置,通过表项0中的位图域便可获知地址4~7上的数据是否被缓存在SSD组的对应条带单元中。类似地,也可获知地址8~25上的数据的存储情况。
步骤54、在得到的索引所在的表项中的指针域非空的情况下,将所述起始地址与所述表项中的指针域的值进行比较,判断比较结果即所述起始地址与所述表项中的指针域的值之差是否小于条带尺寸。
该动作可由控制器执行。当得到的索引所在的表项中的指针域为空时,说明未命中SSD组中的RAID条带,控制器可执行步骤56。若划分读请求地址得到的所有RAID条带地址均未命中SSD组中的RAID条带,则控制器通过执行步骤56读取所有RAID条带地址上的数据。
假设上述表项1中的指针域非空,则控制器将上述第二个RAID5条带地址中的起始地址8与表项1中的指针域的值进行比较。若比较结果小于RAID5条带的尺寸8,说明第二个RAID5条带地址上的数据正被缓存在SSD组中,也即命中了SSD组中的RAID1+0条带,则执行步骤55;否则,执行步骤56。
若划分读请求地址得到的所有RAID条带地址均命中SSD组中的RAID条带,则控制器通过执行步骤55读取所有RAID条带地址上的数据。例如,控制器对第一个RAID5条带地址、第二个RAID5条带地址、第三个RAID5条带地址、第四个RAID5条带地址分别执行步骤55读取数据。
步骤55、当所述起始地址与所述表项中指针域的值之差小于所述第一硬盘的RAID条带尺寸时,从所述表项的位图域对应的条带单元中读出数据;所述对应的条带单元位于SSD组中。
该动作可由控制器执行。具体地,控制器可根据哈希映射表表项中的已缓存条带单元位图,决定是否需要从LUN分区中获取数据。
如果位图中相应的比特位均为“1”,则将该RAID5条带缓存于SSD组中的条带单元数据直接从SSD的相应地址中读出,执行步骤57。
如果位图中相应的比特位部分为“1”,则将该RAID5条带缓存于SSD组中的条带单元数据直接从与比特位为“1”的对应SSD组条带单元中读出,再将剩下的条带单元即在位图中的比特位为“0”的对应条带单元数据从LUN分区中读出,然后执行步骤57,用合并后的数据响应主机请求,最后将从LUN分区中读出的数据写入SSD组中RAID1+0条带对应条带单元镜像对中,即将从LUN分区中读出的数据写入SSD组中与位图中比特位为“0”对应的条带单元中,其中位图与该RAID5条带对应,并且更新内存中哈希映射表相应表项中的位图域,即,将SSD组中新写入的条带单元镜像对对应的比特位置1。
若存储系统为双控系统,还需要通过镜像空间的方式将哈希映射表的更新备份于另一个控制器的镜像缓存中。当存储系统为双控系统时,只有LUN分区的归属控制器可以修改该映射表;存储系统掉电后,可将该哈希映射表写入保险箱。
步骤56、从第一硬盘的LUN分区中将数据读出。
步骤57、直至读出所有RAID条带地址上的数据后,响应主机的读请求,完成数据读取。
本实施例中,存储系统直接通过哈希映射表命中读请求所要获得的数据,提高了读取数据的处理速度。
图6为本发明实施例提供的一种向存储系统写入数据的方法的流程图。本实施例中,采用SSD组作为硬盘缓存的写操作过程包括:
步骤61、接收写请求。该动作可由控制器执行。控制器接收主机发送的写请求。
步骤62、以第一硬盘的RAID条带为单位对读请求中的地址进行划分,得到的RAID条带地址。详见上述步骤52的说明。
步骤63、利用所述RAID条带地址中的起始地址得到相应的哈希映射表表项的索引;哈希映射表的指针域指向第一硬盘中的LUN分区,位图域对应SSD组中的RAID1+0条带,具体详见上述步骤53的说明。
步骤64、将所述RAID条带地址对应的数据写入所述索引所在的表项对应的条带单元;所述对应的条带单元位于SSD组中,详见上述系统实施例的说明。
该动作可由控制器执行。控制器利用求出的哈希映射表索引获得对应表项中的正被缓存RAID条带指针域的值。如果该指针域的值为空,说明目前SSD组中相应RAID0或RAID1+0条带并没有缓存第一硬盘中的条带,因此,可直接将当前RAID条带地址的数据写入SSD组中。如,假设利用上述第一个RAID5条带地址的起始地址得到的哈希映射表索引0所在的表项中,指针域的值为空,则说明SSD组中对应的RAID条带没有存储数据,因而,可直接将上述第一个RAID5条带地址即地址4~7的数据写入SSD组中对应的RAID条带。具体可执行步骤67;否则,执行步骤65。
步骤65、将正被缓存RAID条带指针域的值与条带地址中的起始地址作比较。假设利用上述第二个RAID5条带地址计算得到表项1的索引,则此时将表项1的指针域的值与上述第二个RAID5条带地址的起始地址8进行比较。如果两者之差小于条带尺寸,则说明命中了SSD组中的RAID条带,即SSD组中对应RAID0或RAID1+0条带缓存的条带与当前RAID条带地址所在的RAID条带一致,这时直接将当前条带地址的数据写入SSD组对应的条带中。假设上述第二个RAID5条带地址的起始地址与表项1的指针域的值之差小于RAID5条带尺寸,说明SSD组中对应的RAID0或RAID1+0条带正缓存着第二个RAID5条带地址所在的RAID5条带,也即第二个RAID5条带地址8~15的数据缓存在SSD组中对应的RAID0或RAID1+0条带中,则直接将第二个RAID5条带地址8~15的数据写入表项1对应的RAID0或RAID1+0条带。具体可执行步骤67。如果两者间的差距大于一个条带尺寸即跨越了条带,则说明此时哈希映射表表项对应的RAID0或RAID1+0条带正缓存着另外一个条带的数据,这时在写入当前RAID条带地址上的数据之前,必须触发正缓存的另外一个条带数据搬移到第一硬盘的条带中,搬移操作完成后才可将当前RAID条带地址上的数据写入SSD组中,并根据当前RAID条带地址更新位图域和指针域。假设利用上述第三个RAID5条带地址计算得到表项2的索引,且表项2中指针域的值与上述第三个RAID5条带地址的起始地址之差大于1个RAID5条带尺寸,则说明SSD组中对应的RAID0或RAID1+0条带正缓存着另外一个条带的数据,为便于描述,这里称之为旧缓存条带数据,则将该旧缓存条带数据写到第一硬盘后,再将上述第三个RAID5条带地址的数据写入SSD组中对应的RAID0或RAID1+0条带。具体可执行步骤66。
步骤66、触发旧缓存条带数据的写回操作,在哈希映射表表项对应的RAID0或RAID1+0条带写入当前RAID条带地址上的数据,并更新相应的表项。
假设利用上述第三个RAID5条带地址计算得到表项2的索引,而表项2对应的RAID0或RAID1+0条带写入了其他条带数据,即旧缓存条带数据,则将该旧缓存条带数据写回表项2中的指针域指向第一硬盘中的条带,然后将第三个RAID5条带地址16~23的数据写入表项2对应的RAID0或RAID1+0条带。从表项2对应的RAID0或RAID1+0条带读取旧缓存条带数据时,根据表项2中的位图域的比特位进行读取,如,当比特位为1时,说明对应的RAID0或RAID1+0条带单元中存储有数据;当比特位为0时,说明对应的RAID0或RAID1+0条带单元为空,未存储数据。
将第三个RAID5条带地址16~23的数据写入表项2对应的RAID0或RAID1+0条带后,更新表项2,即将表项2指针域的值指向第三个RAID5条带地址所在的RAID5条带的起始地址16。假若表项2指针域的值是指向第一个RAID5条带地址所在的RAID5条带的起始地址,则指向地址0。如果对应的RAID0或RAID1+0条带单元在为空的情况下被写入了数据,则表项2位图域对应的比特位的值也要更新,如由0更新为1。
若SSD组中对应的是RAID1+0条带,则哈希映射表表项对应的RAID1+0条带中还包含校验单元。在哈希映射表表项对应的RAID1+0条带中写入新数据之前,可进一步通过对新旧数据进行异或运算计算出校验数据。如根据旧缓存条带数据的读出方式从第一硬盘中读出表项2指向的条带数据,并将从第一硬盘中读出的条带数据与上述第三RAID5条带地址16~23的数据进行异或运算,得到校验数据。将得到的校验数据存放于表项2对应的RAID1+0条带的预留的校验条带单元镜像对中,同时将该预留的校验单元镜像对在位图中的比特位置1。
当存储系统为双控系统时,还可通过镜像空间的方式将哈希映射表的更新备份于另一个控制器的镜像缓存中。在写回的过程中,如果某一控制器出现故障,切换到另一控制器后,根据哈希映射表重新写回该条带在SSD组中的数据。此时,校验数据已保存在预留校验条带单元镜像对中,且位图中的比特位也标识了该校验单元已计算出。这样,就可以在切换控制器后,从SSD组中将待写回数据和校验数据一起读出,然后下发到第一硬盘的LUN分区中,而不用重新计算校验数据,从而解决了写洞导致的数据不一致问题。
步骤67、将写请求划分得到的RAID条带地址上的数据写入相应表项对应的RAID0或RAID1+0条带,更新当前哈希映射表表项的RAID条带指针域的值,使其指向RAID条带地址所在的RAID条带的起始地址,根据当前缓存的条带单元更新条带单元位图。
假设利用上述第一个RAID5条带地址的起始地址得到的哈希映射表表项0所在的索引,且表项0中的指针域的值为空,此时,可直接将第一个RAID5条带地址上的数据写入表项0对应的RAID0或RAID1+0条带。由于第一个RAID5条带地址的尺寸小于RAID5条带尺寸,因此必须根据第一个RAID5条带地址覆盖的条带单元来更新表项0中的位图域,从而指示目前有哪些条带单元的数据被缓存于SSD组中,最后更新指针域让其指向第一个RAID5条带地址所在RAID5条带的起始地址。
如果待写条带地址上的数据第一次写入RAID0或RAID1+0条带中,且无法完全填满该条带中的某一个或多个条带单元,则触发后台线程将旧数据从LUN分区的对应位置读出,并填满该条带单元。
假设利用上述第二个RAID5条带地址计算得到表项1的索引,且第二个RAID5条带地址的起始地址与表项1的指针域的值之差小于RAID5条带尺寸。第二个RAID5条带地址上的数据写入表项1对应的RAID0或RAID1+0条带时,若第二个RAID5条带地址上的数据没有占满其中某个条带单元,且该条带单元对应比特位为0(说明之前该条带单元没有缓存数据),则从第一硬盘中将数据读出填满SSD中的对应条带单元,并将对应比特位置1,指示该条带单元现在已经缓存数据。
由于存储系统为读操作配置了读缓存(READ RAM CACHE),所以在当前划分后条带写入SSD组后,还应判断当前划分后条带是否命中读缓存;若命中读缓存,为了保证读写数据的一致性,这里需要将划分后的条带的写数据写入读缓存中进行更新。
当存储系统为双控系统时,当前控制器还可通过镜像通道将更新后的哈希映射表传送到另一个控制器的镜像缓存中,然后,响应主机的写请求。
利用上述方法,对各个RAID条带地址中的数据进行写入处理,直至完成所有RAID条带地址中数据的写入操作。
本实施例中,存储系统直接通过哈希映射表将写请求中的数据放入SSD组中,提高了写入数据的处理速度。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。