共计 1493 个字符,预计需要花费 4 分钟才能阅读完成。
这篇文章给大家分享的是有关 Ceph 分布式存储纠删码之 EC 的示例分析的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
1. 副本 orEC?
把一个文件放进磁盘很难吗?不难,放进去就是了。
那么如果是特别重要的文件呢?也不难,多放几份就是了。
还记得怎么对待毕业论文的吗,电脑里存一份,U 盘里存一份,网盘里再存一份,甚至好几个网盘里都存一份。内心战战兢兢,生怕几个月的努力(并没有。。。)付诸东流。这,就是副本存储。
假设我们的存储是以三副本方式进行的话,我们可以计算出实际利用率是一个很低很低的值,33.3%。那么有没有什么更好的办法呢,有,就是纠删码的方案。
利用纠删码储存文件,一共分三步:
把一个文件均分为 K 个数据块
将这 K 个数据块通过一定的方式联系起来生成 M 个校验块
当某几个数据块丢失时,利用校验块重新计算出丢失的数据块
以 K,M 取值为 5、3 为例,可以得出纠删码方案的利用率达到了 5 /8,62.5。在同样可以容忍丢失三个数据块的情况下,纠删码方案比副本方案容量利用率高出了近一倍!
可以看到重点就在于,如何计算出校验块以及如何利用其进行数据恢复,接下来就讲重点介绍这两部分,这,也就是 EC 的原理。
如果怕 d1,d2,d3 的某一个数据可能会丢失,那么我们就需要利用这三个数据通过计算来生成一个新的校验数据。说白了,一个最简单的方式就是,
直接保存一个三者相加的值,那么当其中一个数据丢失,就可以通过 c1 减去另外两个数据来进行恢复。
到此,一个最简单的可以允许一个数据丢失的 EC 算法就构造成功了。
可以丢失两个数据的 EC 算法
与丢失一个数据类似,我们会很容易想到,直接再构造一个校验块,比如,
但是这样真的可以吗,仔细想来,这是个非常蠢的做法,如果真的丢失了两个数据,这两个一模一样的方程根本无法解出两个未知数,因为有两个未知数但只有一个有效的方程。那么这两个方程的系数向量有什么关系呢,这里引入一个线性代数的定义,它们线性相关。也就是说其中一个可以被另外一个线性表示。
知识点:线性相关。还不懂的同学自己回炉~
于是,我们可以改变 c2 方程的系数,随便取一个,让它和另一个线性无关,比如:
显然,我们可以用初中一年级学到的解二元一次方程的方法轻易地将丢失的两份数据恢复(就是解出来了那俩值)。
EC 算法推广
如果,我们把上面的方程写成矩阵乘法的形式,如下,
通过上文的分析,我们可以用非常朴素(low)的数学思想总结,当生成矩阵(就是校验公式的系数矩阵)的行向量两两不相关时,生成的校验数据可以在丢失数据时将其恢复。此时,如果我们回忆下大一的线性代数的知识,其实这就是要求生成矩阵可逆。
知识点:逆矩阵。
两个矩阵相乘等于单位矩阵,就称它们互为逆矩阵。
刚才我随便取了 c2 的系数为 7 6 3(其实是我的 UM 帐号后缀。。。),它恰巧是可行的,但是在有多个的情况下,需要有一个规律性的生成矩阵的取值,且保证这个矩阵可逆。比如,我们可以用下面这个规律,
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
可以看到,丢失的数据得到了完美的还原。
感谢各位的阅读!关于“Ceph 分布式存储纠删码之 EC 的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!