超级计算机的一个必要组件是存储系统。小型超算用到的数据较少,磁盘阵列就够了,而大中型超算就要配备容量巨大的分布式存储系统。
分布式存储中经常遇到纠删码的概念:当冗余级别为n+m时,从n个源数据块中计算出m个的校验块,将这n+m个数据块分别存放在n+m个硬盘上,就能容忍任意m个硬盘故障;硬盘故障时,只需任意选取n个正常的数据块就能计算得到所有的源数据。如果将n+m个数据块分散在不同的存储节点上,那么就能容忍m个节点故障。
图1
图1中的D、C的长度均为一个字(word),例如1个字节、1个bit。D为源数据,C为校验数据。
那么问题来了: 纠删码是如何计算校验数据的呢?又是如何恢复源数据的呢?
纠删码有很多种,这里介绍广泛应用:
Reed-Solomon纠删码
以冗余级别为5+3的纠删码为例说明。将n个源数据块D1~Dn按列排成向量D,再构造一个(n+m)*n矩阵B (图2),B称为分布矩阵。对矩阵B有一个要求:它的任意n个行向量都是相互独立的,即这n个行向量组成的n*n矩阵可逆。矩阵B的前n行是单位矩阵I,后m行的构造方法放在最后一段介绍,这里先掠过。
图2
执行矩阵向量乘B*D,得到m个校验块C1~ Cm(图3)。
图3
数据恢复算法
假设m个硬盘发生了故障,即图4中的数据块D1、D4、C2丢失,需要从剩下的n个数据块中恢复出来源数据D1~Dn。
图4
从矩阵B中将剩余数据块对应的行向量挑出来,组成新矩阵B’,B’乘以向量D的结果恰好是未故障的数据块(图5)。
图5
因为B的任意n行组成的矩阵都可逆,所以矩阵B’存在逆矩阵,记为B’-1,显然有B’-1*B’=I。
将图5中等式的左右两边同时左乘矩阵B’-1,就得到了n个源数据块D1~Dn,完成数据恢复。
Vandermonde矩阵
分布矩阵B的构造方式有很多种,这里介绍一种常用方法。
由线性代数知道,对互不相等的实数a1,a2,…,ak(k≥n),矩阵V的任意n行组成的矩阵都可逆。
从Vandermonde矩阵V中取出m行,用做分布矩阵B的下部m行,恰好满足对B的要求:任意n行都相互独立。例如冗余级别为6+3纠删码的分布矩阵B可以采用如下形式。
简单总结: 纠删码和大家熟悉的RAID技术看起来是有些类似,一个条带(Stripe)是由多个数据块(Strip)构成,分为数据块和校验块。但与RAID5、RAID6不同的是纠删码从功能上来看最大的区分特点是校验和数据的比例按N+M可调整,并且校验块数量不再受限于2个(RAID最多2个,比如RAID6),纠删码的M可以是3、4甚至更多。
相对传统RAID技术,系统的容错能力得到大幅度的提高,即可以允许系统内同时损坏的硬盘数量(或者存储节点数)大幅度增加;实现了多对多的快速的数据重构,传统RAID方式需要十几个小时的重构时间,而这种方式磁盘重构时间可以缩短至分钟级的速度。
原文链接: 纠删码的原理竟如此简单
推荐阅读:
温馨提示:
请搜索“ICT_Architect”或“扫一扫”二维码关注公众号,点击原文链接获取电子书详情。
求知若渴, 虚心若愚