提高RAID读取性能的系统及方法
技术领域
本发明涉及一种提高RAID读取性能的系统及方法。
背景技术
独立磁盘冗余阵列(Redundant Array of Independent Disks,RAID)在存储文件时,会将该文件分割成若干个预设大小的有效数据块,并根据分割后的有效数据块计算出相应的多个校验数据块,然后将分割的有效数据块以及校验数据块分别存储到多个(至少三个)磁盘中。在未出现损坏的磁盘时,RAID在读取文件时,会将该文件所分割的所有有效数据块以及所有的校验数据块都读取出来,然后忽略校验数据块,将读取的有效数据块组合成要读取的文件,也即所述文件读取完成。现有的读取文件的方法并没有充分发挥RAID的读取性能。
发明内容
鉴于以上内容,有必要提供一种提高RAID读取性能的系统及方法,使得RAID具有更好的读取性能。
一种提高RAID读取性能的系统,运行于电子装置中,该电子装置与m个磁盘相连接,所述m个磁盘中有n个用于校验的磁盘,该系统包括:读取计算模块,用于当要读取文件时,通过预设的读取算法根据本次要读取的m个有效数据块的第一个数据块在所有有效数据块中的编号、所有磁盘数m以及校验磁盘数n确定本次m个磁盘所分别要读取的有效数据块;读取模块,用于向各个磁盘发送读取相应的有效数据块的命令,并将各个磁盘所读取的有效数据块按照一定顺序拼接起来,及判断所述文件是否被完全读取,并在所述文件被完全读取时,结束读取操作。
一种提高RAID读取性能的方法,应用于电子装置中,该电子装置与m个磁盘相连接,所述m个磁盘中有n个用于校验的磁盘,该方法包括:读取计算步骤,当要读取文件时,通过预设的读取算法根据本次要读取的m个有效数据块的第一个数据块在所有有效数据块中的编号、所有磁盘数m以及校验磁盘数n确定本次m个磁盘所分别要读取的有效数据块;读取步骤,向各个磁盘发送读取相应的有效数据块的命令,并将各个磁盘所读取的有效数据块按照一定顺序拼接起来,及判断所述文件是否被完全读取,并在所述文件被完全读取时,结束读取操作。
相较于现有技术,本发明的提高RAID读取性能的方法在读取文件时不必再读取校验数据块,提高了RAID的读取性能。
附图说明
图1是本发明提高RAID读取性能的系统的较佳实施例的运行环境示意图。
图2是本发明提高RAID读取性能的方法的较佳实施例的流程图。
图3是存储文件时确定数据块与磁盘的对应关系的示意图。
主要元件符号说明
如下具体实施方式将结合上述附图进一步说明本发明。
具体实施方式
参阅图1所示,是本发明提高RAID读取性能的系统的较佳实施例的运行环境示意图。所述提高RAID读取性能的系统10安装并运行于电子装置1中。所电子装置1包括连接装置11。该连接装置11用于与多个磁盘2(下文用m表示所有磁盘的个数,用n表示用于校验的磁盘的个数)通信连接。所述电子装置1还包括,但不限于,处理器12以及存储装置13。所述电子装置1可以是通过硬件实现RAID的RAID控制卡,也可以是通过运行软件实现RAID的计算机等装置。所述连接装置11可以是SATA等接口。所述处理器12用于执行电子装置1中的程序指令段以及控制该电子装置1中的各个装置,其可以是RAID控制卡上的RAID控制芯片,也可以是计算机中的中央处理器。所述存储装置13包括用于存储安装在电子装置1中的各个程序(例如RAID中默认的读取程序以及写入程序)的程序指令段以及数据资料的第一存储装置,还包括用于存储读取以及写入数据的第二存储装置。所述第一存储装置可以是电子装置1中的存储器,例如只读存储器。所述第二存储装置可以是RAID控制卡中的高速缓存,也可以是计算机的内存等设备。
所述提高RAID读取性能的系统10用于在存储文件时,将该文件分割成若干个有效数据块,并根据有效数据块计算出若干个校验数据块,并按照预设的写入算法确定所有有效数据块和校验数据块所分别对应的磁盘,并将各个有效数据块以及校验数据块分别发送到对应的磁盘进行存储。所述提高RAID读取性能的系统10还用于在读取文件时,根据预设的读取算法确定m个磁盘所分别要读取的各个有效数据块的位置,并将读取的有效数据块拼接成要读取的文件。
在本实施例中,本发明所述的提高RAID读取性能的系统10可以被分割成一个或多个模块,所述一个或多个模块均被存储于存储装置13中,并由一个或多个处理器12(本实施例为一个处理器)所执行,已完成本发明。参阅图1所示,本发明所述的提高RAID读取性能的系统10被分割成分割模块101、第一获取模块102、写入计算模块103、写入模块104、第二获取模块105、读取计算模块106以及读取模块107。本发明所称的模块是指能够完成特定功能的一系列计算机程序段,比程序更适合于描述所述提高RAID读取性能的系统10在电子装置1中的执行过程。以下将结合图2的流程图来描述各个模块的具体功能。
参阅图2所示,是本发明提高RAID读取性能的方法的较佳实施例的流程图。在本实施中,根据不同的需求,图2所示的流程图中的步骤的执行顺序可以改变,某些步骤可以省略。
步骤S201,分割模块101在要存储文件时,获取该文件并将该文件分割成若干个预设大小的有效数据块。在本实施例中,所述的预设大小是64KB,也即将文件分割成若干个64KB大小的有效数据块。所述文件被分割到最后一块时,若剩余的数据不足64KB,则补充预设格式的数据(例如补充全是0的数据),使得有效数据块的大小是64KB。
步骤S202,第一获取模块102从所述文件分割出的所有未被存储的有效数据块中按照一定顺序获取m-n个有效数据块。
在本实施例中,所述第一获取模块102在获取前,先判断所述文件的未被存储的有效数据块的个数是否小于m-n。若所述文件的未被存储的有效数据块的个数不小于m-n,则所述第一获取模块102按照未被存储的有效数据块被分割出的先后顺序依次获取m-n个有效数据块。若所述文件的未被存储的有效数据块的个数小于m-n,则获取剩余的有效数据块,并补充若干个指定格式的数据块充当有效数据块,使得获取的有效数据块的个数为m-n。在本实例中,所述指定格式的数据块是全是0的数据块。
步骤S203,写入计算模块103根据获取的m-n个有效数据块计算出n个校验数据块。所述写入计算模块103按照默认的算法根据m-n个有效数据块计算出n个校验数据块。
步骤S204,写入计算模块103通过预设的写入算法根据本次所要写入的m-n个有效数据块的第一个有效数据块在所有有效数据块中的编号、所有磁盘数m以及校验磁盘数n确定各个有效数据块以及校验数据块所分别对应的磁盘。
所述有效数据块的编号指的是该有效数据块在所有分割出的有效数据块中的编号。例如一个文件分割出4个有效数据块:D1、D2、D3以及D4。则有效数据块D1的编号是1,该D1在磁盘中的存储位置也即是该文件的存储位置。有效数据块D2的编号是2,该D2在磁盘中的存储位置与D1的存储位置相差一个预设的数据块大小。故只要知道该文件的存储位置有效数据块在所有有效数据块中的编号,既可以得出该有效数据块在磁盘中的存储位置。
所述预设的写入算法包括如下步骤S2041~S2043。
步骤S2041,写入计算模块103将m-n个有效数据块以及n个校验数据块按照B1,B2,...,Bm-n,P1,P2,...,Pn的形式进行排序,将m个磁盘依次进行编号,并将B1,B2,...,Bm-n,P1,P2,...,Pn与第1磁盘,第2磁盘,...,第m-n磁盘,第m-n+1磁盘,第m-n+2磁盘,...,第m磁盘一一对应。所述B1指的是本次要被存储的m-n个有效数据块中的第1个数据块,其对应于第1磁盘;所述Bm-n指的是第m-n个有效数据块,其对应于第m-n磁盘;所述P1指的是第1个校验数据块,其对应于第m-n+1磁盘;所述Pn指的是第n个校验数据块,其对应于第m磁盘。
步骤S2042,写入计算模块103根据下面的公式(1),计算出本次m个数据块(有效数据块和校验数据块)与m个磁盘的对应关系所要向左偏转的位数L。需要说明的是,第1磁盘左边的磁盘是第m磁盘。
L=((B/(m-n)*n)%(m*n); (1)
所述B指的是本次要被存储的m-n个有效数据块中的第一个有效数据块在所有有效数据块中的编号。所述m指的是所有磁盘数,是个固定值。所述n指的是用于校验的磁盘数,是个固定值。所述“/”是取整的除法函数,例如3/2=1。所述“%”指的是求余函数。
参阅图3所示,是存储文件时确定数据块与磁盘的对应关系的示意图。第一次要写入的有效数据块是D1和D2,校验数据块是P1。根据上述公式(1)计算得出L=((1/(3-1)*1)%(3*1)=0。故每个数据块(有效数据块和校验数据块)与磁盘的对应关系不变,也即第1磁盘存储D1,第2磁盘存储D2,第3磁盘存储P1。第二次要写入的有效数据块是D3和D4,校验数据块是P2。根据上述公式(1)计算得出L=((3/(3-1)*1)%(3*1)=1。本次m个数据块与m个磁盘的对应关系要向左偏转1位,也即第3磁盘存储D3,第1磁盘存储D4,第2磁盘存储P2。同理得出,第三次要写入的数据块所要向左偏转的位数是L==((5/(3-1)*1)%(3*1)=2,故第2磁盘存储D5,第3磁盘存储D6,第1磁盘存储P3。
步骤S2043,写入计算模块103根据所要偏转的位数L重新确定各个数据块与磁盘的对应关系。
步骤S205,写入模块104将m-n个有效数据块和n个校验数据块分别发送到对应的磁盘进行存储操作。
步骤S206,写入模块104判断所述文件是否被完全存储。若所述文件被完全存储,则执行步骤S207;若所述文件未被完全存储,则返回步骤S202。当所述文件分割出的所有未被存储的有效数据块均被存储时,所述写入模块104判断所述文件被完全存储。所述提高RAID读取性能的系统10可以通过一个变量记录所有未被存储的有效数据块的个数,并通过该变量来判断是否还有有效数据块未被存储。
步骤S201~S206是所述提高RAID读取性能的系统将文件存储到多个磁盘的过程,步骤S206与下面的步骤S207并不一定连续。
步骤S207,第二获取模块105在要读取文件时,获取该文件的文件的长度。
步骤S208,读取计算模块106通过预设的读取算法根据本次要读取的m个有效数据块的第一个有效数据块在所有有效数据块中的编号、所有磁盘数m以及检验磁盘数n确定本次m个磁盘所分别要读取的有效数据块。
所述读取计算模块106在根据预设的读取算法确定m个磁盘所分别要读取的有效数据块前,先判断未被读取的有效数据块的个数是否小于m。若未被读取的有效数据块的个数不小于m,则根据预设的读取算法确定m个磁盘所分别要读取的有效数据块。若未被读取的有效数据块的个数小于m,则分配若干个数据块给未被分到读取有效数据块的磁盘。所述若干个数据块可以是指定位置的数据块,例如磁盘的第一个数据块,也可以是随机的一个数据块,例如磁盘的磁头当前所指的数据块。
在本实施例中,所述预设的算法是按照下面的公式(2)分别计算出m个磁盘所要读取的有效数据块的编号Addr。
Addrx=(B+x-1)/(m-n)+(B+x-1)%(m-n); (2)
所述x指的是本次读取操作中第x个磁盘,故x是小于等于m的正整数。所述m指的是所有磁盘数,是个固定值。所述n指的是用于校验的磁盘数,是个固定值。所述B指的是本次要读取操作中要读取的第一个有效数据块在所有有效数据块中的编号。所述“/”是取整的除法函数。所述“%”指的是求余函数。
例如,本次要读取的有效数据块是D4、D5以及D6,则所述B=4。第1磁盘所有读取的有效数据块的编号Addr1=(4+1-1)/(3-1)+(4+1-1)%(3-1)=2+2=4,也即D4。相应的可以计算出第2磁盘所要读取的有效数据块的编号Addr2=(4+2-1)/(3-1)+(4+2-1)%(3-1)=2+3=5,也即D5,第3磁盘所要读取的有效数据块的编号Addr3=(4+3-1)/(3-1)+(4+3-1)%(3-1)=3+3=6,也即D6。
在其他实施例中,所述预设的算法也可以是其他算法,使得读取计算模块106能够确定m个磁盘所分别要读取的有效数据块。
步骤S209,读取模块107将读取的有效数据块案一定顺序拼接起来。所述读取模块107在读取到有效数据块后,就立即按照一定顺序将该有效数据块拼接到相应的有效数据块的后面。
在本实施例中,所述读取模块107在将读取的有效数据块拼接到相应的有效数据块的后面前,还会判断已经拼接的有效数据块的长度是否小于所要读取的文件的长度。并当已经拼接的有效数据块的长度小于所要读取的文件的长度时,才将读取的有效数据块拼接到已经拼接的有效数据块的后面。例如,已经拼接的有效数据块有D1、D2、D3以及D4,则当读取到D5时,判断已经拼接的有效数据块的长度是否小于所要读取的文件的长度,并在已经拼接的有效数据块的长度小于所要读取的文件的长度时,将D5拼接到D4的后面,此时已经拼接的数据块是D1、D2、D3、D4以及D5。
步骤S210,读取模块107判断所述文件是否被完全读取。若所述文件未被完全读取,则返回步骤S208;若所述文件被完全读取,则流程结束。
在本实施例中,当已经拼接的有效数据块的长度不小于所要读取的文件的长度时,所述读取模块107判断所述文件被完全读取,且所述读取模块107还通过从已经拼接的有效数据块的尾部删除部分数据的方法,使得已经拼接的有效数据块的长度与所要读取的文件的长度相同,也即已经拼接的有效数据块即是所要读取的文件。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。