把一个文件放进磁盘很难吗?不难,放进去就是了。算法
那么若是是特别重要的文件呢?也不难,多放几份就是了。spa
还记得怎么对待毕业论文的吗,电脑里存一份,U盘里存一份,网盘里再存一份,甚至好几个网盘里都存一份。心里战战兢兢,生怕几个月的努力(并无。。。)付诸东流。这,就是副本存储。code
假设咱们的存储是以三副本方式进行的话,咱们能够计算出实际利用率是一个很低很低的值,33.3%。那么有没有什么更好的办法呢,有,就是纠删码的方案。数学
利用纠删码储存文件,一共分三步:原理
把一个文件均分为K个数据块扩展
将这K个数据块经过必定的方式联系起来生成M个校验块方法
当某几个数据块丢失时,利用校验块从新计算出丢失的数据块im
以K,M取值为五、3为例,能够得出纠删码方案的利用率达到了5/8,62.5。在一样能够容忍丢失三个数据块的状况下,纠删码方案比副本方案容量利用率高出了近一倍!d3
能够看到重点就在于,如何计算出校验块以及如何利用其进行数据恢复,接下来就讲重点介绍这两部分,这,也就是EC的原理。总结
注意:这里的文件并非指真实的文件,好比一首歌曲或者一部电影,而是由存储系统对真实文件进行条带化后生成的更小的文件。
能够丢失一个数据的EC算法
一部电影太大了,咱们不妨以一个很简单的例子入手,好比存几个整数,
若是怕d1,d2,d3的某一个数据可能会丢失,那么咱们就须要利用这三个数据经过计算来生成一个新的校验数据。说白了,一个最简单的方式就是,
直接保存一个三者相加的值,那么当其中一个数据丢失,就能够经过c1减去另外两个数据来进行恢复。
到此,一个最简单的能够容许一个数据丢失的EC算法就构形成功了。
能够丢失两个数据的EC算法
与丢失一个数据相似,咱们会很容易想到,直接再构造一个校验块,好比,
可是这样真的能够吗,仔细想来,这是个很是蠢的作法,若是真的丢失了两个数据,这两个如出一辙的方程根本没法解出两个未知数,由于有两个未知数但只有一个有效的方程。那么这两个方程的系数向量有什么关系呢,这里引入一个线性代数的定义,它们线性相关。也就是说其中一个能够被另一个线性表示。
知识点:线性相关。还不懂的同窗本身回炉~
因而,咱们能够改变c2
方程的系数,随便取一个,让它和另外一个线性无关,好比:
显然,咱们能够用初中一年级学到的解二元一次方程的方法轻易地将丢失的两份数据恢复(就是解出来了那俩值)。
EC算法推广
若是,咱们把上面的方程写成矩阵乘法的形式,以下,
经过上文的分析,咱们能够用很是朴素(low)的数学思想总结,当生成矩阵(就是校验公式的系数矩阵)的行向量两两不相关时,生成的校验数据能够在丢失数据时将其恢复。此时,若是咱们回忆下大一的线性代数的知识,其实这就是要求生成矩阵可逆。
知识点:逆矩阵。
两个矩阵相乘等于单位矩阵,就称它们互为逆矩阵。
刚才我随便取了c2的系数为7 6 3(实际上是个人UM账号后缀。。。),它恰巧是可行的,可是在有多个的状况下,须要有一个规律性的生成矩阵的取值,且保证这个矩阵可逆。好比,咱们能够用下面这个规律,
这,就是传说中的范德蒙德矩阵。之因此用这个矩阵最重要的一点是它保证了矩阵的可逆性,也就是保证了求解的惟一性。
上文中,咱们知识讨论了校验数据块的生成,那么,若是在丢失了某个或者某几个数据后,如何经过矩阵计算来进行数据恢复呢?
如今咱们把上文的生成矩阵进行一下扩展,在其上面加一个单位矩阵,这样让数据块和校验块作一个统一,
不妨,咱们举个具体的例子,还以咱们最开始讲的KM比例5/3来算,
其中,5,2,8,7,0
为数据块,22, 61, 197
为范德蒙矩阵生成的校验块。如今咱们来看下,22, 61, 197
这三个校验块到底能不能在丢失数据块的时候将数据恢复出来。
若是非要纠结数据块数字的意义的话,它是个人分机号码。。
假设在一个极端状况下,五个数据块丢失了三个,也就是能够容忍的最大数量,好比,丢失了
5,2,8
,此时把丢失的数据块和其对应的声称矩阵的行去掉,而后用生成矩阵的逆矩阵乘以校验块和剩余的数据块组成的矩阵。
F = [0,0,0,1,0;0,0,0,0,1;1,1,1,1,1;1,2,3,4,5;1,4,9,16,25]; F_INV = inv(F); %求F的逆矩阵 C = [7;0;22;61;197]; D = F_INV*C; D = 5.0000 2.0000 8.0000 7.0000 0
能够看到,丢失的数据获得了完美的还原。