利用异或校验磁盘阵列写数据的方法及装置 【技术领域】
本发明涉及磁盘阵列的写数据技术,尤其涉及利用异或校验的磁盘阵列写数据的技术。
背景技术
独立磁盘冗余阵列(RAID,Redundant Array of Inexpensive Disks)技术已经广泛地被应用在数据存储备份领域中。可以将现有的RAID级别划分为三类:无冗余、基于镜像的、基于XOR的。RAID0就是无冗余的,它不存在校验数据。基于镜像的磁盘阵列包括RAID1、RAID10等,这种技术使用一个或多个独立的磁盘来备份数据,这些磁盘通常被称为“镜像盘”。而基于XOR校验的磁盘阵列,例如RAID3、RAID5、RAID6等,这种技术将数据以条带(Stripe)的方式存放,条带中分布在每个磁盘上的数据称为条带单元(StripeUnit),也可成为段(Segment)。以RAID5为例,在一个条带中,使用一个条带单元来存放校验数据,校验数据等于该条带中其它条带单元异或的结果。至于条带单元大小视系统而定,一般为64KB。如图1所示,为5个盘的RAID5,其中条带单元大小为4KB,D代表数据块,P代表校验数据。
图2描述的是存储子系统的结构图。存储子系统100包括一个或多个RAID控制器103。RAID控制器103通过通信协议102连接到主机101上。通信协议102包括并行SCSI,SAS(Serial attachedSCSI),FC(Fiber Channel)和一些其它并行接口、高速串行接口等。
RAID控制器103通过通信协议104与磁盘子系统109连接。协议104与协议102类似。磁盘子系统109由一个或多个磁盘108以某种RAID算法组织起来阵列的集合。磁盘子系统108可以包括多种RAID0、RAID1、RAID5等多种RAID算法。
图3描述的是RAID控制器内部结构。在RAID控制器103中,中央处理器(CPU)201通过处理器总线207连接到内存设备、外围设备以及协助处理单元上。RAM 204和NVRAM 205属于内存设备,它们存储操作系统指令、控制器配置信息、buffer空间、cache空间等。主机接口200将主机端传送过来的信号与总线信号相互转换,而磁盘接口206则是将总线信号与磁盘驱动信号相互转换。
DMA 202用于提高RAID控制器的性能。DMA 202可以使数据在RAM 204与主机端口200和磁盘端口206直接进行传输,故而减少了CPU负担。RPA(RAID Parity assist)203提供校验信息计算功能。RAID控制器103接收来自磁盘端口206的数据,然后将数据发送到RPA 203,RPA 203计算数据的校验信息,之后通过磁盘端口206将校验信息传回磁盘子系统。
当向使用异或校验的磁盘阵列中写数据时,必须更新要写数据所在条带的校验数据,这样才能保证在有磁盘失效的情况下,可以通过其它数据以校验数据计算出失效盘的数据。也就是说,在写数据同时,要先预读条带中的数据,这样才能得出正确的校验数据。写数据主要有两种方式:一种叫小写(small write)或读-修改-写(read-modify-write),另一种叫大写(large write)或重建写(reconstrut-write)。这两种方法其目的是要减少在写数据过程中预读的次数。
仍以RAID5为例,数据读写的基本单位是条带。如果想要向0扇区写入数据d′0,按照小写的方式,有以下步骤:
1)首先确定0扇区所在的条带,读出0扇区数据d0以及条带中校验数据p0,存入缓存中;
2)计算新校验,存入缓存;将新数据d′0写入扇区0,新校验p′0写入数据块P0。
按照大写的方式,有以下步骤:
1)首先确定扇区0所在的条带0,读出8号扇区d8、16号扇区d16以及24号扇区d24,存入缓存;
2)然后计算新校验,存入缓存;最后将新数据d′0写入扇区0,新校验p′0写入数据块P0。
上面的例子中,由于rmw要预读2次数据,rcw要预读3次数据,所以选择rmw作为这次写数据的方式。
但是,无论是rmw还是rcw,在写一次数据时都需要预读数据,即在写数据过程中伴随着读数据。有一种特殊情况,在写数据时,条带中每个数据块都有写请求,这时就不需要预读数据,这种情况称为“满条带写”(full stripe write)。仍以图1为例,0号扇区、8号扇区、16号扇区、24号扇区均有新数据写入,分别记为d′0、d′8、d′16、d′24,那么新校验,不需要预读数据,就完成了一次写请求。
文献US5506977中,根据条带中写请求的个数来决定使用rcw或者rmw的方式。这种方法可以有效地减少了预读数据的次数。但是没有提供一种机制来尽量达到满条带写的条件。并且没有区别对待满条带写与部分条带写(partial stripe write),影响了写操作的性能和带宽。
【发明内容】
基于此,本发明的主要目的在于提供一种一次处理较多的写请求的方法,尽量满足满条带写条件,以减少预读的次数,提高了写操作的带宽。同时,该方法优先处理满条带写,并为部分条带写请求设置最后期限,避免了部分条带写请求饿死的情况,从而进一步提高写操作的带宽。
本发明提出了一种利用异或校验磁盘阵列写数据的方法,包括以下步骤:将写请求转换为一个或多个条带请求;将条带请求加入到优先级队列中;以及对优先级队列中的所述条带请求进行处理。
其中,在将写请求转换为一个或多个条带请求的步骤之后,还包括以下步骤:判断条带请求的预读是否被激活,如果没有被激活,则将条带请求延迟一个时间t1,并且在时间t1过去之后,激活条带的预读,执行将条带请求加入到优先级队列中的步骤。
其中,在判断条带请求的预读是否被激活的步骤中,如果判断条带请求的预读是被激活的,则立即处理所述条带请求。
其中,在将条带请求加入到优先级队列中的步骤中,具体包括以下步骤:判断条带请求是否为满条带写,如果为满条带写,则将所述条带请求加入到高优先级队列中。
其中,如果条带请求不为满条带写,则将条带请求加入到低优先级队列中,并为条带请求设置一个最后期限。
其中,在对优先级队列中的条带请求进行处理的步骤中,具体包括以下步骤:判断低优先级队列中是否有超过所述最后期限的条带请求;如果有,则处理低优先级队列中的条带请求。
其中,如果低优先级队列中没有超过最后期限地条带请求,则判断高优先级队列是否为空,如果是,则处理低优先级队列中的条带请求。
其中,如果高优先级队列不为空,则处理高优先级队列中的条带请求。
其中,对优先级队列中的条带请求进行处理的步骤由一个单独的线程来完成。
本发明还提出了一种利用异或校验磁盘阵列写数据的装置,包括:条带请求转换单元,用于将写请求转换为一个或多个条带请求;存储单元,用于以优先级队列的形式存储条带请求;以及处理单元,用于对优先级队列中的条带请求进行处理。
与现有技术相比,本发明引入了条带延迟机制,这有利于一次处理更多的写请求,减少了在写操作中预读数据的次数,提高了写操作的带宽。此外,本发明又引入了优先级队列,使得满条带写请求优先处理,并为部分条带写请求设置了最后期限值,保证了低优先级队列中的请求不会被饿死,进一步提高了写请求的带宽及性能。
【附图说明】
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是RAID5磁盘阵列数据分布的示意图;
图2是存储子系统结构示意图;
图3是RAID控制器内部结构示意图;
图4是根据本发明使用异或校验的磁盘子系统结构示意图;
图5是根据本发明引入条带延迟机制后处理写数据的算法流程图;
图6是根据本发明引入优先级队列之后处理写数据的算法流程图。
【具体实施方式】
下面结合附图和具体实施方式对本发明作进一步的说明。
本发明提供一种方法,该方法优先处理满条带写,并为部分条带写请求设置最后期限,避免了部分条带写请求饿死的情况,从而进一步提高写操作的带宽。本发明提高写操作带宽的方法大体上包括以下步骤:
第一步:将写请求加入到相应的条带请求中,记条带请求集合为RA,条带请求为R。
第二步:对于RA每个R,首先判断R的预读是否激活,如果R的预读被激活,且R中有写请求,那么立即处理这个请求。否则转到步骤3。
第三步:R的预读没有被激活,延迟R,将R放到延迟队列中。启动定时器,当定时器到期时,激活R的预读。
第四步:判断R是否为满条带写,如果是的话,则将R加入到高优先级队列中,否则,将R加入到低优先级队列,并为R设置最后期限。
第五步:启动一个线程,该线程首先判断低优先级队列中是否有R超时。如果R超时的话,便优先处理R。否则线程从高优先级队列中取出R进行处理。如果高优先级队列为空,那么则从低优先级队列中取出R。如果两个队列均为空,则线程停止。
第六步:获取与R相关的条带S,对条带S进行处理。根据R的状态(满条带写,小写,大写)执行相应的写处理流程。
第七步:当RA中所有的R均被处理完毕时,返回写命令。
图4描述的是使用异或校验的磁盘子系统结构。请求处理器401负责将控制器传过来的请求转换为条带请求,然后转发到虚拟设备405中。请求处理器401接收请求,然后条带请求转换器402将相应请求转换为条带请求。定时器403负责将条带请求延迟一段时间再进行处理。当定时器到期时,会根据条带请求的状态(大小、小写或满条带写)将条带请求放入相应的队列中。如果请求的状态是满条带写,则将条带请求放入高优先级队列407中。否则,将条带请求放入低优先级队列408中,并设置条带请求最后期限。
请求选择器404首先检查低优先级队列408中是否有条带请求过期。如果没有请求过期,则从高优先级队列407中取出条带请求,然后从条带缓冲区406中为条带请求分配相应的条带资源。由于是满条带写,无需再预读数据,条带中的数据均是最新的,所以直接将条带中的数据发送到RPA 203计算校验信息。校验信息计算完毕后,RPA 203会通知请求处理器401条带校验信息计算完毕,请求处理器401将条带发送到虚拟磁盘405进行写操作。
如果低优先级队列408中有写请求过期,则请求选择器404会优先选择该请求进行处理,以保证该请求不会被饿死。由于低优先级队列408中条带写请求是部分条带写,所以预读条带中的一些数据。请求处理器401从条带缓冲区406中为条带请求分配相应的条带资源,然后将要预读请求发送到虚拟磁盘405。当数据读取完毕之后,虚拟磁盘405会通知请求处理器401预读数据完毕,然后请求处理器401将条带数据发送到RPA 203计算校验信息。计算完毕之后,RPA 203通知请求处理器401校验信息计算完毕,之后请求处理器401将条带发送到虚拟磁盘405进行写操作。
本发明提供使用异或校验的磁盘阵列写数据的方法,该方法在处理写请求过程中引入条带延迟处理机制,其步骤如图5所示:
步骤501:首先将写请求加入到相应的条带请求R中。由控制器发来的写请求可能被加入到多个条带请求中,记为条带请求集合RA。当RA中所有的条带请求R均被处理之后,那么写请求才会被处理完毕。
步骤502:由于由控制器发送过来的不同的写请求可能会加入到相同的条带请求R中,所以要判断条带请求R的预读是否被激活。如果被激活的话,则执行步骤503,否则执行步骤505。
步骤503:条带请求R的预读被激活,为该条带请求R分配相应的条带资源。
步骤504:为条带请求R分配相应的条带资源之后,处理该请求。首先判断该条带请求R使用哪种写方式——RCW、RMW、满条带写。然后根据不同的写方式,执行不同的处理流程。RMW、RCW的处理过程已经在前面讲述,这里不在重复。
当该条带请求执行完毕之后,关闭该条带请求的预读,然后判断该写请求是否被处理完成。如果条带请求集合中所有的条带请求均被处理,则写请求处理完毕。否则转到步骤501。
步骤505:条带请求R的预读没有被激活,延迟处理该条带请求,并启动定时器。该定时器负责在未来的某个时间激活条带的预读。
步骤506:定时器到期,激活条带请求的预读。此时,条带请求可能已经堆积了大量请求,判断条带请求的写数据方式。如果条带请求时满条带写的话,执行步骤508,将该条带请求加入高优先级队列末尾。否则执行步骤507,将条带请求放入到低优先级队列末尾,并设置最后期限值。
将条带请求放入到优先级队列中之后,由另外一个线程负责处理队列中的条带请求。本发明引入优先级队列,目的在于区别对待满条带写于部分条带写的区别,优先处理满条带写。同时,对部分条带写设置一个最后期限值,保证了部分条带写不会被饿死。步骤如图6所示:
步骤601:线程首先判断低优先级队列中是否有条带请求到期,如果有的话,则执行步骤605。否则执行步骤602。
步骤602:判断高优先级队列是否为空。如果为空,则执行步骤603。否则执行步骤604。
步骤603:判断低优先级队列是否为空。如果为空,则不存在待处理的条带请求,结束线程。否则,执行步骤605。
步骤604:高优先级队列不为空,从高优先级队首取出第一个条带请求,作为待处理的条带请求。
步骤605:高优先级队列为空,判断低优先级队列是否为空,如果为空的话,则线程退出。否则从低优先级队首取出第一个条带请求,作为待处理的条带请求。
步骤606:为条带请求分配相应的条带资源,判断使用何种写方式(RCW或RMW)来处理条带请求。然后将条带请求转发到下层,转到步骤601继续处理,直到两个优先级队列均为空时,线程退出。
领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。