Erasure-Code-擦除码-2-实现篇


一、思路

既然EC的存储过程就是对x取多个不同的值来计算y:

恢复的过程是通过已知点的坐标来确定曲线方程:

而编码和解码的过程都只需要加减乘除的四则运算(不需要开方), 那么,

除了数字之外, 任何对象, 只要能对其进行四则运算, 则都可以使用这种方法来实现冗余存储和备份.

本文中我们就将通过将数字替换成另一种满足四则运算的东西, 来实现计算机上的EC.

我们先从简单的例子开始, 打开新世界的大门.

感谢19世纪伟大数学家 伽罗华.


二、GF(7): 伽罗华域Galois-Field GF(7)

上面我们提到的几个数学公式, 高次曲线, 多元一次方程组等, 他们之所以能正确的工作, 是因为他们依赖于一套底层的基础运算规则, 这就是四则运算: + - * /

这听起来有点废话, 不用四则运算用什么?

其实我们平时熟知的四则运算, 并不是唯一的四则运算法则 例如在有1种四则运算可能是: 5 + 5 = 3 而不是10, 5 * 3 = 1 而不是15.

栗子4: 只有7个数字的新世界: GF(7)

我们来尝试定义一个新的加法规则, 在这个新的世界里只有0~6这7个数字:

其他整数进来时都要被模7, 变成0~6的数字. 在这个模7的新世界里, 四则运算也可以工作:

模7新世界中的 加法

新的加法被表示为 ⊕ (这里原始的加法还是用+来表示):

它定义为: a ⊕ b的结果是 a + b后结果再对7取模. 例如:

1 ⊕ 1 = 2
5 ⊕ 2 = 0 ( 7 % 7 = 0 )
5 ⊕ 5 = 3 ( 10 % 7 = 3 )

在这个新世界里, 0 还是和以前的0很相像, 任何数跟0相加都不变:

0 ⊕ 3 = 3
2 ⊕ 0 = 2

0 在新世界 GF(7) 里被称为加法的单位元.

模7新世界中的 减法

然后我们再在模7的世界里定义减法. 减法的定义也很直接, 就是加法的逆运算了.

自然数里, -2 + 2 = 0, 我们称呼-2是2在加法上的逆元(通常称为相反数). 在模7的世界里,我们也很容易找到每个数的加法逆元,例如: 3 ⊕ 4 = 0 所以 4 和 3 就互为加法的逆元.

减法定义就是:

例如:

3 ⊖ 4 = 3 ⊕ (-4) = 3 ⊕ 3 = 6
2 ⊖ 6 = 2 ⊕ (-6) = 2 ⊕ 1 = 3

模7新世界中的 乘法 和 除法

在模7的新世界里, 我们也可以类似地定义1个乘法:


例如:

1 ⊗ 5 = 5 ( 5 % 7 = 5 )
3 ⊗ 4 = 5 ( 12 % 7 = 5 )
2 ⊗ 5 = 3 ( 10 % 7 = 3 )
0 ⊗ 6 = 6 ⊗ 0 = 0

对于模7新世界的乘法⊗来说, 1 是乘法的单位元, 也就是说1 ⊗ 任何数都是它本身.

我们也可以用类似的方法定义每个数字在乘法⊗的逆元:

a的乘法逆元 a⁻¹ = b, if a ⊗ b = 1.

例如:

除法的定义就是: 乘以它的乘法逆元

栗子5: 模7新世界直线方程-1

现在我们有了新的加法和减法⊕, ⊖ 我们可以像使用旧世界的加减法一样来使用⊕, ⊖. 例如我们可以建立一个简单的, 斜率为1的直线方程:


新世界里这个直线上的点是: (x,y) ∈ [(0,3), (1,4), (2,5), (3,6), (4,0), (5,1), (6,2)] 只有7个.

如果把这条直线画到坐标系里, 它应该是这个样子的:

栗子6: 模7新世界直线方程-2

再加上新世界加减乘除四则运算, 我们可以在新世界里进行基本的代数运算了, 例如我们可以设定1个斜率为2的直线方程:

新世界里这个直线上的点是: (x,y) ∈ [(0,3), (1,5), (2,0), (3,2), (4,4), (5,6), (6,1)] 这7个.

如果把这条直线画到坐标系里, 它应该是这个样子的:

栗子7: 模7新世界中的二次曲线方程

下面我们来建立1个稍微复杂1点的, 二次曲线的方程:


这里 x² 表示 x ⊗ x

新世界里这个抛物线上的点集合是: (x,y) ∈ [(0, 2) (1, 4) (2, 1) (3, 0) (4, 1) (5, 4) (6, 2)]

如果把这条抛物线画到坐标系里, 它应该是这个样子的:


可以看出它的图像也遵循了旧世界抛物线的特性: 这条抛物线是以3为轴对称的: 因为类似旧世界的多项式分解一样, 原方程也可以分解成:

GF(7) 的EC实现

在这个模7的新世界里, 它满足我们旧世界里的四则运算法则, 我们已经可以使用前面(第一篇:原理)提到的 EC 的算法来编码或解码了:

假设模7新世界里我们的数据块 d₁ = 3, d₂ = 2, 对应上面的直线方程: y = 2 ⊗ x ⊕ 3

我们只要记住直线上2个点的位置, 就能把直线的方程恢复出来, 例如:

我们先记录直线上2个点: (1,5) 和 (3,2)

假设丢失的数据是 d₁, d₂ 用 u₁, u₂ 表示, 带入2个点的坐标, 得到一个二元一次方程组:

2个方程左右分别相减消元:

最后得到 u₂ = 3 ⊗ 5⁻¹ = 3 ⊗ 3 = 2.

将 u₂ = 2 带入第1个方程: 5 = 2 ⊗ 1 ⊕ u₁

得到 u₁: u₁ = 5 ⊕ (-2) = 3

是不是跟普通的一次方程组解法完全一样!

至此, 我们用模7新世界的四则运算实现了之前的 EC . 并且我们保证了校验数据的大小是可控的: 不会大于7! 距离我们的目标又接近了1步.

模7下的四则运算构成了1个 伽罗华域 Galois-Field: GF(7). 简单来说, Galois-Field 是一个集合, 集合里的元素满足某种四则运算. 摘自wikipedia上的解释:

A finite field is a set on which the operations of multiplication, addition, subtraction and division are defined

7是1个可选的数来通过取模的方式构造一个Galois-Field, 也可以选择模11或其他质数来构造1个 Galois-Field, 但是不能选择模一个合数(合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。其中,完全数与相亲数是以它为基础的。)来建立新的四则运算规则. 假设使用模6, 模6世界里面的2是6的一个因子, 它没有乘法逆元, 也即是说2 乘以 1~5任何一个数在模6的世界里都不是1.

没有乘法逆元就说明模6的世界里没有和旧世界里一样的除法, 不能构成一个完整的四则运算体系.

为了简化, 四则里还有几个方面没有提到, 例如乘法加法的分配律. 乘法和加法的结合律也必须满足, 才能在新世界里实现上面例子中的曲线方程等元素. 这部分也很容验证,在上面的模7新世界里是可以满足的.

现在我们有了 EC 的算法, 以及很多个可以选择的四则运算来限定数值的范围. 接下来要在计算机上实现,还有1步,就是: 模7虽然可取,但是它没有办法对计算机里的数字有效利用,因为计算机里的数是二进制的. 如果把数值限定到7或其他质数上,没有办法实现256或65536这样的区间的有效利用.

所以接下来我们需要在所有四则运算里选择一个符合计算机的二进制的四则运算, 作为实现 EC 计算的基础代数结构.

从现在开始, 我们要构造一个现实中可用的伽罗华域, 它比上面模7新世界稍微复杂一点, 得到这个域分为2步:

  • 我们首先选择1个基础的, 只包含2个元素的 Galois-Field GF(2): {0, 1}.

  • 再在这个 GF(2) 的基础上建立1个有256个元素的 Galois-Field GF(2⁸).


三、GF(2): 模2的新世界: Galois-Field GF(2)

首先选择了最小的Galois-Field GF(2), 类似于前面模7的例子, GF(2) 里的四则运算的定义为结果模2. 它里面只有2个元素{0,1}:

在这个GF(2)里, 运算的规则也非常简单:

  • 加法(刚好和位运算异或等价):


1的加法逆元就是1 本身.

  • 乘法(刚好和位运算等价):

    1的乘法逆元就是1 本身. 0 没有乘法逆元.

以这个GF(2)为基础, 可以构建一个1-bit的 EC 算法了:)

后面的讨论全部是依赖于GF(2)中的加法和乘法, 为了看起来清楚, 不再使用⊕和⊗了, 直接使用传统的+, *来表示

GF(2) 的EC实现

假设要存储的数据是: d₁ = 1, d₂ = 1

对应直线方程是: y = 1 + x

取2个点: x₁ = 0, x₂ = 1 得到2个校验数据的值:

y₁ = 1 + 0 = 1
y₂ = 1 + 1 = 0

数据丢失后, 通过2个点的坐标找回直线方程系数:

解得 u₁ = 1, u₂ = 1.

下一步, 我们希望构建1个1 byte大小(2⁸ 个元素)的 Galois-Field GF(2⁸), 在这个 GF(2⁸) 里的 EC 中, 每个 dⱼ 和 yᵢ 的取值范围可以是0~255.

但首先我们需要能表示比GF(2)更多的值.

四、GF(2)[X] : GF(2) 作为系数的多项式

类似于我们只需要0~ 9 这10个自然数, 就可以通过增加进位这个概念后, 扩展成能表示任意大小的10进制整数一样(或用0~7表示任意大小的8进制数), 我们通过类似的方法扩展{0,1}这2个数字, 表示更多的信息.

引入多项式:

使用 GF(2) 的元素作为系数, 定义1个多项式:

多项式的加减乘除

系数 aᵢ 的四则运算还是遵循 GF(2) 的规则的, 而多项式的四则运算, 显然是基于它的系数的四则运算建立的.

多项式的加法:
  • 因为 1 + 1 = 0, 所以: (x + 1) + (1) = x

  • x的同指数幂的系数相加遵循系数的Field的加法规则, 1 + 1 = 0:
    (x² + x + 1) + (x) = x² + 1

  • 2个相同的多项式相加肯定是0:
    (x² + x + 1) + (x² + x + 1) = 0

多项式的乘法

多项式的乘法和旧世界的多项式乘法类似, 仍然是通过乘法的分配率展开多项式:

多项式的除法
  • 多项式的除法依旧使用旧世界的多项式长除法法则, 唯一不同仍旧是系数的四则运算是基于GF(2)的, 例如:

多项式的除法的取余计算
  • 多项式的除法的取余计算也类似, 因为 x² + x + 1 = x (x+1) + 1, 所以: (x² + x + 1) = 1 mod (x+1) .

我们看到, 多项式之间也是满足加减乘除四则运算的!

现在我们已经接触到了3种不同的四则运算:
GF(2)中元素的四则运算. GF(7)中元素的四则运算. GF(2) 多项式的四则运算.

也就是说我们可以建议一个备份和恢复多项式的EC:

GF(2)[X]的EC实现

通过一个简单的例子来构建一个存储2个多项式的EC, 将要存储的2个多项式作为系数建议一个直线:


例如要存储的2个多项式 p₁ = x² + 1, p₂ = x, 取直线上2个点, 例如X₁ X₂ 分别取1, x, 代入直线方程得到2个Y的值:

  • 存储过程: 存储 p₁, p₂, Y₁ Y₂; 也就是: (x² + 1, x, x² + x + 1, 1)

  • 恢复过程: 假设 p₁, p₂ 都丢了, 我们可以把Y₁, Y₂代入, 把p₁, p₂作为未知数建立一个方程组:

不太懂

通过消元解方程, 两个方程相减, 恢复出p₂:
(每个元素对加法都有逆元(可以实现减法): 逆元就是它本身( (x+1) + (x+1) = 0 ) )


这样我们就实现了一个基于多项式的EC了.

但多项式的乘法依旧是有越界的问题的, 如果自然数到模7的方法一样, 我们需要把多项式的四则运算通过取模, 约束到一个可控的范围内.

还是取模!


五、GF(2⁸)

GF(2)为系数的多项式的集合还不是一个伽罗华域, 因为缺少除法逆元. 就像整数全集也不是一个伽罗华域, 它也缺少除法逆元.

但在上面我们使用GF(2)的多项式来实现EC时, 没有触碰到没有乘法逆元这个问题. 就像可以用2个整数作为分子分母来表示分数一样, 用这种复合形式表示一个不存在的元素进行中间步骤的计算.
例如½不在整数集合, 但可以用1和2两个整数来表示出来.
而计算的最终结果都是恢复已存在的值, 所以分数形式的多项式最终都会被消去. 但这种分数形式的表示方法在实际使用中会造成很大不便.

现在我们需要找到1个质的多项式(Prime-Polynomial), 来替代GF(7)中7的角色, 最终得到1个有256个元素的多项式的伽罗华域 GF(2⁸).

GF(2⁸) 类似于模7的方式, 将多项式模一个 质的多项式(Prime-Polynomial) 来得到: GF(2)[X]/(P₈(X))

质的多项式(Prime-Polynomial) 简单说就是不可分解的多项式, 例如 x² + 1 在实数域下就是 质多项式, 它无法分解成2个多项式乘积.

GF(2) 下的质多项式

  • 1 是1个质多项式.

  • x + 1 是1个质多项式. 因为它最高次幂是1, 肯定不能再拆分成2个多项式乘积了. 把所有GF(2)下的多项式对x + 1 取模, 只有2个可能的值: 0, 1.

不太懂

  • x² + 1 不是一个质多项式, 它可以分解成(x + 1)².

  • 2次的质多项式是: P₂(x) = x² + x + 1 . 它在GF(2)的域中不能被拆分成2个1次多项式的乘积.

不太懂

我们可以像使用7对所有整数取模那样, 用它对所有多项式取模, 模它而产生的所有 余多项式, 是所有最高次幂小于2的多项式, 共有4个: 0, 1, x, (x + 1).

模P₂(x)的多项式集合里, 同样满足多项式的四则运算.

对于其他j次幂的质多项式 Pⱼ(x), 模Pⱼ(x)的多项式集合里, 也刚好有2ʲ 个元素.

GF(2) 扩张成 GF(2⁸)

为了扩张到 GF(2⁸) 我们选择的8次幂的质多项式是: P₈(x) = x⁸ + x⁴ + x³ + x² + 1

这个8次幂的质多项式,模它的所有余多项式,是所有最高次幂不超过7的多项式, 共256个, 它就是 GF(2) 到 GF(2⁸) 的扩张.

Field-Extension 域的扩张, 简单来说就是通过把一个域(例如GF(2)), 作为系数构建多项式, 再去模一个质多项式(如P₈(x)), 得到的余多项式集合(例如GF(2⁸)).
这里从一个2个数字的集合GF(2), 扩张之后得到的却是一个多项式的集合, 因为在伽罗瓦的理论里, 数字跟多项式是没有区别的, 因为他们都可以进行四则运算. 就像我们前面也可以把多项式作为直线方程的系数一样.

然后我们还发现, 因为多项式的系数是GF(2)下的元素, 只能是0或1. 于是 这些多项式和二进制数是有一一对应关系的, 多项式中指数为i的项的系数就是二进制数第i位的值:


扩张后的元素对应0~255这256个二进制数, P₈(x) 对应:

  • 二进制: 1 0001 1101
  • 16进制: 0x11d

而GF(2⁸)中的四则运算如下:

  • 加法: a ⊕ b 对应多项式加法, 同时它表示的二进制数的加法对应: a ^ b

  • 乘法: a ⊗ b 对应多项式的乘法(模P₈(x)):

总结一下GF(2⁸)能够满足EC运算的几个性质:
  • 加法单位元: 0
  • 乘法单位元: 1
  • 每个元素对加法都有逆元(可以实现减法): 逆元就是它本身( (x+1) + (x+1) = 0 )
  • 每个元素对乘法都有逆元(除了0)(可以实现除法):P₈(x)是不可约的, 因此不存在a和b都不是0但ab=0; 又因为GF(2⁸)只有255个非0元素, 因此对a,总能找到1个x使得 aˣ = a . 所以 aˣ⁻² a = 1. aˣ⁻² 是a的乘法逆元.

PS, 看到 aˣ = a 是不是想起了费马小定理?

Erasure-Code-擦除码-2-实现篇相关推荐

  1. 分布式系统下的纠删码技术(一) -- Erasure Code (EC)

    近几个月主要参与一个分布式存储系统的纠删码部分(用于数据容错),纠删码在学术界出现比较早,现在ceph,微软的存储系统,Hadoop 3.0等都用了EC.文章会分为多篇,主要将Erasure Code ...

  2. Erasure Code - EC纠删码原理

    Erasure Code - EC纠删码原理 查看全文 http://www.taodudu.cc/news/show-3010091.html 相关文章: 楞严咒全文正确注音版_楞严咒全文注音 积分 ...

  3. minio存储之纠删码(Erasure Code)

    纠删码的原理介绍可以参考: https://www.jianshu.com/p/4abf65ad03af 一般上我们如果要保证数据高可用,主流的有两种策略: 多副本 纠删码 副本(Replicatio ...

  4. Ceph 进阶系列(四):Ceph的纠删码特性 EC(Erasure Code)

    从GitHub上Clone Ceph项目,我是基于(ceph version 12.2.11 luminous 版本)的代码来分析的 一.EC(Erasure Code)是什么? Ceph的纠删码特性 ...

  5. 一文读懂 @Decorator 装饰器——理解 VS Code 源码的基础

    作者:easonruan,腾讯 CSIG 前端开发工程师 1. 装饰器的样子 我们先来看看 Decorator 装饰器长什么样子,大家可能没在项目中用过 Decorator 装饰器,但多多少少会看过下 ...

  6. IdentityServer4之Authorization Code(授权码)相对更安全

    前言 接着授权模式聊,这次说说Authorization Code(授权码)模式,熟悉的微博接入.微信接入.QQ接入都是这种方式(这里说的是oauth2.0的授权码模式),从用户体验上来看,交互方式和 ...

  7. 基于柯西矩阵的Erasure Code技术详解

    一.概述 Erasure Code可以应用于分布式存储系统中,替代多份数据拷贝的数据冗余方式,从而可以提高存储空间利用率.此外,Erasure code还可以应用于传统RAID系统中,增加数据冗余度, ...

  8. 开源中国源码学习UI篇(二)之NavigationDrawer+Fragment的使用分析

    前文链接:开源中国源码学习UI篇(一)之FragmentTabHost的使用分析 开源中国2.2版,完整源码地址为:http://git.oschina.net/oschina/android-app ...

  9. Erasure-Code-擦除码-1-原理篇

    前言Permalink 做分布式存储的同学, 一定都知道一个了不地的冗余算法叫作擦除码(Erasure-Code), 它让存储以多副本几分之一的成本来达到同样高的可靠性. 虽然web上有很多介绍EC的 ...

  10. 【MinIO理论】MinIO Erasure Code Quickstart Guide

    什么是擦除码? 擦除码是一种重建丢失数据或损坏数据的数学算法.MinIO使用Reed-Solomon码将对象分成可变数据和奇偶校验块.例如,在12个驱动器的设置中,一个对象会分片成一定数量的数据块和奇 ...

最新文章

  1. python类方法和实例方法syntax errors_Python 实例方法,类方法和静态方法
  2. Python 任意中文文本生成词云 最终版本
  3. HTML特殊字符大全2
  4. Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)
  5. 软件设计师 - 软件工程
  6. python3-pandas 缺失数据的处理
  7. java.lang.IllegalArgumentException: name MUST NOT NULL! at org.nutz.dao.impl.NutDao.fetch
  8. Linux下sdio设备扫描过程,[mmc]Linux下MMC/SD/SDIO的识别与操作
  9. 最新最全 快递公司编码 更新时间2020.07.31
  10. Python实现二维码生成器
  11. 如何屏蔽百度搜索热点
  12. html:用script实现搜索框
  13. 便利店牵手京东到家,多元零售矩阵走向成熟化
  14. Ubuntu登录界面键盘鼠标失灵
  15. “武汉加油”“中国加油”
  16. Centos7-Linux
  17. 淘宝一键下架在售商品步骤
  18. 前后端分离-小项目-1前端布局
  19. ZZULIOJ:1091: 童年生活二三事(多实例测试)
  20. Qt5.4.1播放视频语音文件

热门文章

  1. Parity check(奇偶校验)
  2. 人工智能在各领域的应用
  3. 二、IDEA设置、快捷键和代码模板
  4. Curator——Service Discovery
  5. 信安第二版:第3章密码学基本理论学习笔记
  6. windows 7 安装虚拟光驱Deamon出现蓝屏的解决方法
  7. 嘉定区专利工作示范企业认定条件及流程解读
  8. 字节跳动 前端校招 一二三面+hr面(2020-03)
  9. python初中数学建模培训
  10. RK3399平台开发系列讲解(内核驱动外设篇)6.19、摄像头OV4689模组驱动代码分析