Note: Clay Codes: Moulding MDS Codes to Yield an MSR Code

Background

Erasure Code

纠删码:与纠错码、检错码类似,均为线性分组码,通过编码可以在有限损失的前提下恢复丢失的数据。
屏幕快照 2017-06-05 15.49.51

假设每个磁盘存储w比特数据,设\(d_0,\cdots,d_{k-1}\)是存储在k个数据磁盘上的数据,\(c_0,\cdots,c_{m-1}\)是存储在m个编码盘上的编码。编码定义为数据的线性组合:

\(c_0 = a(0,0)d_0 + \cdots + a(0, k-1)d_{k-1} \)
\(c_1 = a(1,0)d_0 + \cdots +a(1,k-1)d_{k-1}\)
\(\cdots \cdots\)
\(c_{m-1} = a(m-1,0)d_0 + \cdots + a(m-1,k-1)d_{k-1}\)

编码只需要乘法和加法(\(w=1\)时加法指模2加/异或、乘法指二进制与运算),解码需要用高斯消除或矩阵求逆求的方法解一组线性方程。

译码准则:最小差错概率译码、最大似然译码

以上计算建立在\(GF(2^w)\)上,这里的w值一般选取2的幂,较为流行的值有\(w=1\)(计算简单)\(w=8\)(一个字节)w值越大,纠删码越丰富,但随w值增大,在伽罗瓦域上的计算复杂度不断提高。

\(GF(2^w)\)扩展域上的计算

加法、减法

假设\(A(x),B(x) \in GF(2^w)\),求和结果为\(C(x)\)。
\[C(x) = A(x) + B(x) = \sum\limits_{i=0}^{w-1}c_i x^i ,\quad c_i \equiv a_i + b_i mod 2 \]

乘法

假设\(A(x),B(x) \in GF(2^w)\),且
\[P(x) = \sum\limits_{i=0}^{w-1}p_i x^i ,\quad p_i \in GF(2)\]
是一个不可约多项式。两个元素的乘法运算定义为:
\[C(x)=A(x)\cdot B(x) mod P(x)\]

求逆

在乘法中定义的\(P(x)\)基础上,任一非零元\(A \in GF(2^w)\)的逆元定义为:
\[A^{-1}(x)\cdot A(x) \equiv 1 mod P(x)\]

Scalar Codes

Screen Shot 2018-05-10 at 20.34.57

让每个数据块由L个字节组成。在标量码的情况下,从k个数据块中的每一个中挑选一个字节,并且以m个不同的方式将k个字节以线性方式组合,以获得m个奇偶校验字节。所得到的\(n = k + m\)个字节的集合称为码字。对数据块中的所有L字节并行重复该操作以获得L个码字。 这个操作也会产生m个奇偶校验块,每个奇偶校验块由L个字节组成。

Vector Codes

Screen Shot 2018-05-10 at 20.40.42

选取\(\alpha \geqslant 1\)个字节组(形成superbyte). 在编码过程中,选取k个数据块中的每个数据块的superbyte,然后以m种不同的方式线性组合k个超级字节,以获得m个奇偶校验超级字节。 所得到的\(n = k + m\)个superbyte称为(矢量)码字。

MDS Codes

一个\((n, n-r, r+1)\)码称为最大距离可分(Maximum Distance Separable, MDS)码。一个MDS码是冗余度为r,最小距离等于r+1的线性码。(实现最佳容错能力)

Reed-Solomon Codes(RS码)

RS码是当且仅当\(n \leqslant 2^w\)时存在的MDS码。例如,存储系统包含256个或更少的磁盘,可以在\(GF(2^8)\)中定义一种计算。有多种方式来定义\(a(i,j)\)系数。

最简单是“Cauchy”结构:在\(GF(2^w)\)中选择n个不同的数字,并将它们分成两组X和Y,使得X具有m个元素,Y具有k个元素。计算纠删码系数:
\[a(i,j) = \frac{1}{x_i \oplus y_j}\]

MSR Codes

矢量性质的MDS码(修复时占用带宽最少)

Screen Shot 2018-05-10 at 20.54.51

Node Repair

节点修复分布式存储系统中对节点修复的需求可能是由于特定的硬件组件出现故障,由节点修复请求引起的流量吞噬可用于服务用户数据请求的带宽。节点修复所花费的时间也直接影响系统可用性。

Sub-chunking through Interleaving

Screen Shot 2018-05-10 at 20.58.16

当分包级别\(\alpha\)很大时,考虑到涉及多个码字的操作是并行执行的,从存储器易于访问的角度考虑,插入字节是有利的, 如图3所示,跨越不同码字的相应字节被连续存储。当块内的超字节的数目N很大时,例如当L = 8KB并且\(\alpha\) = 2时,连续访问N = 4K 字节是可能的。 通过交织,每个数据块被分割成一个子集,称之为子组块。 因此,节点内的每个子块保存存储在该节点中的N个码字中的每一个的一个字节。

 

posted @ 2018-11-06 13:58  tino_ryj  阅读(842)  评论(0编辑  收藏  举报