发明内容
本发明的目的就是针对现有技术的不足,提供一种服务不间断的高容错磁盘阵列系统,该磁盘阵列系统的容错能力高于传统RAID系统的上限3,能够达到10个以上,使得在发生较小数目(n错误磁盘数<n容错能力-3)磁盘错误时,仍然可以以不低于传统RAID系统的安全性提供不间断的服务,且在服务过程中进行错误磁盘的恢复而不需要专门的错误恢复过程。
为实现上述目的,本发明的技术方案如下:
本发明提出的一种磁盘阵列系统,包括n个磁盘,其中n≥4;n个磁盘中容量最小的为C字节,在允许≤t/2个磁盘出错的情况下仍然能够保证存储数据的安全性并正常提供服务,则所述磁盘阵列系统的有效存储空间为(n-t)×C字节;每个磁盘的存储空间划分为512字节或4k字节大小的扇区,各磁盘上相同编号的扇区编组为一个条带,所述磁盘阵列系统以条带为单位进行数据的读写操作;每个扇区的存储空间均匀分成n个块,前n-t块存储有效信息,作为信息块,后t块存储校验信息,作为校验块;对条带进行写操作时,通过容错编码方法生产校验信息,有效信息存入信息块,校验信息存入校验块;当所述磁盘阵列系统出现磁盘错误时,通过错误磁盘恢复方法在提供不间断服务的同时恢复错误磁盘上的数据。
所述错误磁盘恢复方法,步骤如下:
(A1)预处理
A1a)用新的磁盘替换错误磁盘;
A1b)每个磁盘的每个扇区均匀分成n个块,每个条带上处于第x个磁盘的第y块编号为ay,x,其中0≤x<n,0≤y<n;进行容错译码,当被删除的信息块ay,x能够被恢复时,将参与恢复该信息块的信息块和校验块记录为一个二元组集合
A1c)将前一步骤得到的所有二元组集合按照生成顺序组成一个有序集合;
(A2)磁盘读取的处理
A2a)当系统需要从磁盘阵列系统中读取一个条带时,从各个磁盘读取相应的扇区,依据预处理步骤得到的二元组集合的有序集合依次恢复被删除的信息块;将所有信息块串联提供给系统;
A2b)通过容错编码方法重建被删除的校验块;
A2c)将原存储于出错磁盘的信息块和校验块存入新替换的磁盘中对应的扇区;
(A3)系统空闲的处理
当所述磁盘阵列系统在一段时间之内没有访问请求的时候,按如下步骤恢复出错磁盘上的数据:
A3a)从磁盘阵列系统中随机选取一个条带,从各个磁盘读取相应的扇区,依据预处理步骤得到的二元组集合的有序集合依次恢复被删除的信息块;
A3b)通过容错编码方法重建被删除的校验块;
A3c)将原存储于出错磁盘的信息块和校验块存入新替换的磁盘中对应的扇区;
A3d)重复上述步骤A3a-A3c,直到所有的数据被恢复或者系统不再空闲。
所述磁盘阵列系统以高容错的数据编译码方法为基础设计,从而保证该系统的高可靠性和不间断服务的能力。所述容错编码方法步骤如下:
(B1)n个磁盘,允许≤t/2个磁盘出错,每个磁盘的每个扇区均匀分成n个块,每个条带上处于第x个磁盘的第y块编号为ay,x,其中0≤x<n,0≤y<n;前n-t块存储有效信息,作为信息块,后t块存储校验信息,作为校验块;
(B2)生成一个[n-t,n-1]的矩阵,将其所有元素设为0;
(B3)在第(B2)步骤所得到的矩阵中,随机选择p个元素,将其值设为1;
其中p的取值为(n-t)>p>(n-t)/2;
(B4)将第(B3)步骤得到的矩阵进行均匀化,具体方法是:
a)均衡行重:
i.统计矩阵行重;
ii.如果最大行重减去最小行重大于1,那么最大行重行i和最小行重行j中必存在元素ai,k=1&aj,k=0,则将ai,k设为0,aj,k设为1;
iii.重复前两步骤,直到最大行重减去最小行重不大于1;
b)均衡列重:
i.统计矩阵各列的列重;
ii.如果最大列重减去最小列重大于1,那么最大列重列i和最小列重列j中必存在元素ak,i=1&ak,j=0,则将ak,i设为0,ak,j设为1;
iii.重复前两步骤,直到最大列重减去最小列重不大于1;
c)随机化:对均匀化后的矩阵,随机进行行列变换;
(B5)将步骤(B4)所得到的编码矩阵中所有值为1的元素保存为一个二元组集合A={[b,d]|ab,d=1};
(B6)磁盘阵列系统中第x个磁盘的第y块校验块所存储的校验信息由步骤(B5)所得到的二元组集合所对应的信息块进行“异或和”生成,其中0≤x<n,0≤y<t;具体对应方法是:对于第x个磁盘的第y个校验块,二元组集合A中二元组[b,d]对应的信息块编号为a[(b+y×m)mod(n-t),((d+y×m)mod(n-1)+x)modn],其中m=n+1。该过程用公式表达如下:
所述容错译码步骤如下:
(C1)将未出现删除错的磁盘中所有的校验块的状态标记为“可用”;
(C2)随机选择一个状态为“可用”的校验块,检查它所校验的信息块是否被删除;如果其中没有信息块被删除,那么将此校验块标记为“无用”;如果其中有且仅有一个信息块被删除,此被删除的信息块根据该校验块与该校验块所校验的其他信息块的异或来恢复,恢复公式为:
其中a
i,j表示每个条带上处于第j个磁盘的第i块,[b,d]∈A且i′≠(b+(i-t)×m)mod(n-t),j′≠((d+(i-t)×m)mod(n-1)+j)modn,然后将此校验块标记为“无用”;
(C3)重复第(C2)步,直到未出现删除错的磁盘中所有的校验块的状态标记均为“无用”,或者所有状态为“可用”的校验块都校验了至少两个被删除的信息块;
(C4)未出现删除错的磁盘中所有的校验块的状态标记均为“无用”,则译码过程成功。
上述容错编码方法步骤(B3)中提到在零矩阵中随机选择p个元素将其值设为1。这里的参数p必须满足:(n-t)>p>(n-t)/2。但是在所有满足要求的p中需要选择一个最优的p以及一个最优的随机数种子,使得所生成的冗余编码能够具有最大的译码概率,这需要通过多次的实验进行选取。具体的实验方法是:
(1)设定变量MaxSuccTimes=0;
(2)随机选取参数p和随机数种子i,使用前文所给出的容错编码方法生成容错编码;
(3)设定变量Succtimes=0;
(4)对步骤(2)所生成的容错编码随机删去t/2列,使用前文所给出的容错译码方法进行译码;
(5)如果译码成功,则Succtimes=Succtimes+1,并且重复步骤(4);如果译码失败,则执行if(Succtimes>MaxSuccTimes)then MaxSuccTimes=Succtimes,记录此时的p和i,并重复步骤(2)-(4),直到MaxSuccTimes足够大。
至此,我们就得到了能够产生最大译码概率的p和随机数序列。可据此产生编码矩阵进行容错编码。在实施例一、二、三中的编码矩阵均可使得容错编码的成功译码概率超过99.99%。
在系统组织结构方面,本发明可以基于普通的加载了多块硬盘的PC机,使用软件进行磁盘阵列系统的实现,也可基于专门的存储服务器,使用RAID卡进行硬件实现。在数据组织方面,本发明对阵列中多块硬盘,以扇区为单位进行编组;将不同硬盘上对应位置的扇区编组为一个条带,并且系统以条带为单位进行数据的读写。扇区的大小按照目前的硬盘标准取值为512字节,如果系统中包含n个硬盘,则单个条带的存储空间为512*n字节;近年来国际磁盘驱动器设备和材料协会(IDEMA)建议用4096字节扇区代替现有的512字节扇区标准,本发明也可基于4k字节大小的扇区进行构建,但是该标准尚未普及,当系统服务为大量的连续读写时,较大的条带空间可以提高数据的吞吐量,但如果系统服务为大量的随机读写时,条带空间过大可能会增加系统的开销。
在数据容错方面,本发明对条带内数据进行编码。对一个条带内的n个扇区,将每个扇区划分为n等份,每一份称为一个块;如果我们希望系统能够容忍小于等于t/2个磁盘错误,则将每个扇区的前n-t块设置为信息块,存储有效信息,后t块设置为校验块,存储校验信息。校验信息由一种类似于阵列码的容错编码方法生成。当有部分硬盘出现故障时,系统可以使用余下的完好硬盘上对应扇区的数据译码恢复出故障硬盘扇区上的有效数据,并且在整个编译码过程中仅仅需要异或操作,使得系统复杂度较低。
在数据I/O方面,本发明能够提供较好的I/O性能。当需要读取一个条带的数据时,系统分别对各个硬盘发送读取相应扇区的命令,当有n-t/2个硬盘响应该请求并成功读取后,即可译码恢复出全部数据。相对于传统方法,本发明避免了由于等待少数硬盘完成I/O操作而造成的系统瓶颈。
在数据恢复和服务提供方面,本发明能够在恢复错误磁盘的同时提供不间断的读取服务。当系统中出现磁盘故障时,管理员用全新的硬盘替换错误的硬盘,并启动数据恢复过程。之后当系统接收到数据读取请求时,则仅读取未出错的旧硬盘上相应数据,进行译码恢复数据并提供服务之后,重新编码得到丢失的部分校验信息,并将存储于错误硬盘上的数据存储到新硬盘上,这样就可以在提供服务的同时进行出错数据的恢复。而当系统空闲一段时间之后,也可单独进行错误磁盘的恢复。
本发明要利用的基本设备是:一台普通PC计算机、多块硬磁盘。所述磁盘阵列系统的构成非常简单,可利用现有的成熟技术产品组成一套完整的系统。
与现有技术相比,本发明的有益效果是:提供一种服务不间断的高可靠性、高容错磁盘阵列系统,提高现有存储系统的容错能力和提供不间断服务的能力,在发生较少磁盘错误时能够提供不间断服务,发生较多磁盘错误时能够恢复出全部数据。
具体实施方式
下面结合附图,具体描述一下本发明系统的构造方法和服务提供。
如图3所示,本发明所述磁盘阵列系统可由一台PC机、若干硬磁盘和接口卡所构成。
如图1、图2所示,系统构造的具体方法如下:
a.硬盘分扇区,条带化:对硬盘按照扇区为单位进行划分,每个扇区为512字节或4k字节。对系统中多块硬盘,以扇区为单位进行编组,将不同硬盘上对应位置的扇区编组为一个条带,系统以条带为单位进行数据的读写。
b.扇区分块:对每个扇区分为n个大小相同的块,其中n为磁盘阵列系统中的硬盘数目。如果扇区大小为512字节,那么当n取值为2
m且m<9时才能被512整除,这时每个块的大小为2
9-m字节;当n取值不为2的整数次方时,每个块的大小为
字节,另有
字节空间无法被利用。
c.编码:如果我们希望系统能够容忍小于等于t/2个硬盘错误,即在系统中有t/2个硬盘出错时仍然能够恢复出其中的全部信息,则在对硬盘扇区进行分块后,用每个扇区的前n-t个块存储有效信息,称为信息块,后t个块存储校验信息,称为校验块。每个条带内所有的信息块串联作为有效信息的存储空间,而校验信息则通过前述发明内容中的容错编码方法,由有效信息进行编码生成。一个条带内的有效存储空间为512×(n-t)字节,而存储校验信息的存储空间为512×t字节。
如图4、图5、图6、图7、图8所示,系统的服务提供如下:
a.无磁盘出错时的I/O读写:系统的I/O操作都是以条带为单位进行。当系统需要写入512×(n-t)字节信息时,将这些信息分为512/n大小的n×(n-t)块;在内存中请求设置512×n字节大小的存储空间,划分为n×n块,于一个条带中n×n块一一对应;分别依次将n×(n-t)块有效信息存储到内存空间中的块0,0,块0,1,块0,2......块0,n-1,块1,0.....块n-t-1,0.....块n-t-1,n-2,块n-t-1,n-1;按照前述发明内容中的容错编码方法生成校验信息,存入块n-t,0,块n-t,1,块n-t,2......块n-t,n-1,块n-t+1,0......块n-1,0......块n-1-n-2,块n-1,n-1;将块0,i,块1,i,块2,i......块n-1,i存入硬盘i中相应扇区,完成写入信息操作。当系统需要读取512×(n-t)字节信息时,则分别从各硬盘中读取相应的扇区,将其中的信息块串联,存入请求地址,完成信息读取操作。
b.有磁盘出错时的I/O读写:当有磁盘出错,系统收到写入请求时,操作与无磁盘出错时的写入操作基本相同,只是无须向错误磁盘写入数据。当有磁盘出错,系统收到读取请求时,将完好硬盘的对应扇区读入内存,按照前述发明内容中的容错译码得到出错磁盘上的信息块,再将所有的信息块串联,存入请求地址,完成信息读取操作。
c.错误磁盘恢复时的I/O读写:当系统中有硬盘出错,管理员用新硬盘替换出错硬盘,并启动错误恢复过程。当系统收到写入请求时,操作与无磁盘出错时的写入操作相同。当系统收到读取请求时,将完好硬盘的对应扇区读入内存,按照前述发明内容中的容错译码得到出错磁盘上的信息块,再将所有的信息块串联,存入请求地址;然后按照前述发明内容中的容错编码方法编码得到出错磁盘上的校验块,再将出错磁盘上的信息块和校验块一并写入替换该出错磁盘的新磁盘上。
下面对本发明的优选实施例作进一步的描述。
实施例一
构造一个包含n=32个磁盘,最大能够容错t/2=6个磁盘的磁盘阵列系统。所有磁盘中容量最小的为80G字节,则该磁盘阵列系统的总容量为20*80G字节。每个磁盘的存储空间划分为512字节大小的扇区,各磁盘上相同编号的扇区编组为一个条带,所述磁盘阵列系统以条带为单位进行数据的读写操作;每个条带的存储空间,即每个磁盘的每个扇区均匀分成32个块,前20块存储有效信息,作为信息块,后12块存储校验信息,作为校验块;对条带进行写操作时,通过容错编码方法生产校验信息,有效信息存入信息块,校验信息存入校验块;当所述磁盘阵列系统出现磁盘错误时,通过错误磁盘恢复方法在提供不间断服务的同时恢复错误磁盘上的数据。
所述容错编码方法如下:
构造一个[20,31]的矩阵,将其所有元素设为0
在上述矩阵上随机选取p=15个元素,将其值设为1。
对该矩阵进行行、列均匀化,并随机进行行列变换。结果如下:
将上述矩阵中所有值为1的元素保存为一个二元组集合:
{[0,13],[1,1],[2,15],[3,9],[4,14],[7,10],[9,0],[11,2],[10,11],[13,4],[14,16],[15,7],[16,3],[18,19],[19,18]}
由该二元组集合所对应的信息块,对校验块a20,0,a21,0,a22,0,……,a31,31进行编码,具体方法如下:
…………
具体到磁盘上,校验块a20,0的生成如图9所示。
至此编码过程完成。
容错译码步骤如下:当出现6个磁盘错误时,假设编号为2,14,16,18,27,31的磁盘出错,按以下顺序译码:
将未出现删除错的磁盘中所有的校验块的状态标记为“可用”;随机选择一个状态为“可用”的校验块,检查它所校验的信息块是否被删除;如果其中没有信息块被删除,那么将此校验块标记为“无用”;如果其中有且仅有一个信息块被删除,此被删除的信息块根据该校验块与该校验块所校验的其他信息块的异或来恢复,然后将此校验块标记为“无用”;
由
其中只有a
7,16一个信息块处于出错磁盘上,所以可由
求出其中所存储数据;
由
其中只有a
13,14一个信息块处于出错磁盘上,所以可由
求出其中所存储数据;
同理,依次由校验块:
a20,18,a20,21,a20,15,
a21,3,a21,7,a21,16,a21,19,a21,23,
a22,1,a22,5,a22,14,a22,15,a22,17,a22,21,a22,31,
a23,3,a23,12,a23,13,a23,15,a23,18,a23,19,a23,29,a23,31,
a24,1,a24,10,a24,11,a24,13,a24,14,a24,16,a24,17,a24,20,a24,27,a24,29,a24,31,
a25,8,a25,9,a25,11,a25,12,a25,14,a25,15,a25,18,a25,22,a25,23,a25,25,a25,27,a25,29,a25,31,
a26,6,a26,9,a26,10,a26,12,a26,20,a26,21,a26,23,a26,25,a26,27,a26,29,
a27,1,a27,4,a27,7,a27,8,a27,10,a27,13,a27,16,a27,17,a27,18,a27,19,a27,21,a27,23,a27,25,a27,26,a27,27,a27,30,
a28,0,a28,3,a28,6,a28,9,a28,15,a28,16,a28,19,a28,21,a28,23,a28,24,a28,25,a28,26,a28,27,a28,28,
a29,2,a29,10,a29,11,a29,14,a29,17,a29,19,a29,21,a29,22,a29,23,a29,31,
a30,0,a30,6,a30,9,a30,20,a30,21,a30,22,a30,23,a30,26,a30,27,
a31,5,a31,8,a31,10,a31,19,a31,21,a31,23,a31,24,a31,26,a31,29,a31,30,
a20,31,a21,6,
可求出信息块:
a2,2,a3,31,a1,27,
a0,16,a6,14,a15,2,a16,31,a14,27,
a13,16,a19,14,a8,2,a10,2,a9,31,a7,27,a7,27,a10,18,
a12,14,a1,2,a3,2,a2,31,a10,27,a0,27,a3,18,a6,16,
a5,14,a14,2,a16,2,a15,31,a5,27,a3,27,a13,27,a10,16,a16,18,a19,16,a19,18,
a7,2,a9,2,a8,31,a18,27,a16,27,a6,27,a3,16,a6,2,a9,15,a9,18,a12,16,a12,18,a18,14,
a0,2,a1,31,a11,27,a9,27,a19,2,a2,16,a2,18,a5,16,a5,18,a11,14,
a13,31,a13,2,a14,31,a4,27,a2,27,a7,31,a0,31,a15,14,a12,2,a15,16,a15,18,a18,16,a18,18,a14,18,a4,14,a15,27,
a18,2,a19,27,a17,27,a2,14,a8,14,a5,2,a8,18,a11,16,a11,18,a7,18,a17,14,a0,14,a17,16,a8,27,
a4,31,a16,16,a18,31,a1,16,a17,18,a4,16,a4,18,a0,18,a10,14,a6,18,
a17,31,a9,14,a11,31,a13,18,a3,14,a12,27,a1,14,a12,31,a1,18,
a19,31,a4,2,a16,14,a14,14,a14,16,a5,31,a17,2,a10,31,a6,31,
a11,2,a8,16,
直到未出现删除错的磁盘中所有的校验块的状态标记均为“无用”,至此所有信息块都已恢复,则译码过程成功。
当所述磁盘阵列系统出现磁盘错误时,通过错误磁盘恢复方法在提供不间断服务的同时恢复错误磁盘上的数据。所述错误磁盘恢复方法,步骤如下:
(1)预处理
a)用新的磁盘替换错误磁盘;
b)进行容错译码,当被删除的信息块ay,x能够被恢复时,将参与恢复该信息块的信息块和校验块记录为一个二元组集合
c)将前一步骤得到的所有二元组集合按照生成顺序组成一个有序集合;
(2)磁盘读取的处理
a)当系统需要从磁盘阵列系统中读取一个条带时,从各个磁盘读取相应的扇区,依据预处理步骤得到的二元组集合的有序集合依次恢复被删除的信息块;将所有信息块串联提供给系统;
b)通过容错编码方法重建被删除的校验块;
c)将原存储于出错磁盘的信息块和校验块存入新替换的磁盘中对应的扇区;
(3)系统空闲的处理
当所述磁盘阵列系统在一段时间之内没有访问请求的时候,按如下步骤恢复出错磁盘上的数据:
a)从磁盘阵列系统中随机选取一个条带,从各个磁盘读取相应的扇区,依据预处理步骤得到的二元组集合的有序集合依次恢复被删除的信息块;
b)通过容错编码方法重建被删除的校验块;
c)将原存储于出错磁盘的信息块和校验块存入新替换的磁盘中对应的扇区;
d)重复上述步骤a-c,直到所有的数据被恢复或者系统不再空闲。
实施例二
与实施例一相同的地方不再重复叙述,不同之处在于:
构造一个包含n=32个磁盘,最大能够容错t/2=10个磁盘的磁盘阵列系统。所有磁盘中容量最小的为40G字节,则该磁盘阵列系统的总容量为12*40G字节。每个磁盘的每个扇区均匀分成32个块,前12块存储有效信息,作为信息块,后20块存储校验信息,作为校验块。
所述容错编码方法如下:
构造一个[12,31]的矩阵,将其所有元素设为0
在上述矩阵上随机选取p=7个元素,将其值设为1。
对该矩阵进行行、列均匀化,并随机进行行列变换。结果如下:
将上述矩阵中所有值为1的元素保存为一个二元组集合:
{[0,9],[2,0],[4,2],[7,4],[8,11],[9,8],[11,7]}
由该二元组集合所对应的信息块,对校验块a12,0,a13,0,a14,0,……,a31,31进行编码,具体方法如下:
…………
至此编码过程完成。
容错译码步骤如下:当出现10个磁盘错误时,假设编号为0,5,9,14,15,16,19,25,28,31的磁盘出错,按以下顺序译码:
依次由校验块:
a12,1,a12,3,a12,12,a12,17,a12,21,a12,26,a12,30,
a13,1,a13,6,a13,8,a13,10,a13,15,a13,19,a13,22,a13,24,a13,28,a13,31,
……
a26,9,a26,10,a28,3,a28,4
可求出信息块:
a11,9,a8,15,a4,15,a11,25,a0,31,a7,31,a2,31,
a5,15,a8,16,a6,19,a1,15,a8,25,a9,31,a8,0,a4,31,a11,31,a8,9,
……
a3,15,a10,9,a7,9,a0,15
直到未出现删除错的磁盘中所有的校验块的状态标记均为“无用”,至此所有信息块都已恢复,则译码过程成功。
实施例三
与实施例一相同的地方不再重复叙述,不同之处在于:
构造一个包含n=4个磁盘,最大能够容错t/2=1个磁盘的磁盘阵列系统。所有磁盘中容量最小的为120G字节,则该磁盘阵列系统的总容量为2*120G字节。每个磁盘的每个扇区均匀分成4个块,前2块存储有效信息,作为信息块,后2块存储校验信息,作为校验块。
所述容错编码方法如下:
构造一个[2,3]的矩阵,将其所有元素设为0
在上述矩阵上随机选取p=2个元素,将其值设为1。
对该矩阵进行行、列均匀化,并随机进行行列变换。结果如下:
将上述矩阵中所有值为1的元素保存为一个二元组集合:
{[0,1],[1,0]}
由该二元组集合所对应的信息块,对校验块a2,0,a3,0,a2,1,……,a3,3进行编码,具体方法如下:
…………
至此编码过程完成。
容错译码步骤如下:当出现1个磁盘错误时,假设编号为2的磁盘出错,按以下顺序译码:
依次由校验块:
a2,0,a2,1
可求出信息块:
a0,2,a1,2
至此所有信息块都已恢复,译码过程成功。