RAID存储结构

问题描述

我有一些与RAID存储结构有关的问题。首先,让我展示一下RAID系统的图片。 [RAID] [1] [1]:https://i.stack.imgur.com/Whd6B.png。根据我的理解,每个磁盘都分为多个条带。沿着条带完成编码或解码,条带是条带的集合。假设每个条带包含k个数据条带和t个奇偶校验条带。如果我使用的是基于GF(2 ^ w)构建的里德-所罗门(RS)代码,则大小为“ q”字节的每个条带将分为q / k个符号,每个符号均由w位组成。>

我的问题:

  1. 当我们谈论RS编码/解码时,我们将每个条带视为RS符号还是将条带中的每个w位都视为RS符号,尽管条带中的每个w位都与相同的w位元素相乘在GF(2 ^ w)中。 说明:
  • 当我从事RAID系统的软件实现时, 我从每篇研究论文中学到的东西,尤其是从这篇论文中学到的东西: “开放源代码擦除的性能评估和检查
    编码存储库”是t奇偶校验带P = [p0,p1,...,p_ {t-1}]作为矩阵乘法计算为P = CxD,其中D = [d0,d1,。 ..,d_ {k-1}],C是txk柯西矩阵(我以基于柯西矩阵的编码为例)。
  • 当我阅读另​​一篇专注于RS编码的硬件实现的论文:“用于高级RAID系统的Reed Solomon码算法的低复杂度设计”时,他们似乎将每个条带都称为RS符号。我是说那怎么可能。假设我们使用的是GF(2 ^ 8),条带的大小可以变成仅8位吗?或者,在硬件实现中,人们只是使用更高阶的有限域来构建RAID系统?
  1. 我有时看到人们将RAID存储系统描述为驱动器,其中“每个驱动器分为多个条带”。那么,术语“驱动器”和“磁盘”之间有什么区别?它们可以互换使用吗?

解决方法

每个条带

每组块都可以视为一个矩阵,令 r =磁盘数,而 c =每个块#个字节,则矩阵为 r 按 c 列矩阵排列。在矩阵的每一列上都执行类似Reed Solomon的编码和解码,其中矩阵的每一列都被视为 r 个字节的数组。

开放源代码擦除

擦除编码可能与Raid编码不同。删除编码可以基于修改后的Vandermonde矩阵,这是维基百科称为原始视图Reed Solomon的系统编码的转置:

https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction#Systematic_encoding_procedure:_The_message_as_an_initial_sequence_of_values

擦除也可以基于柯西矩阵,如您所阅读的论文所示。

对于Raid,与P奇偶校验相对应的编码矩阵行实际上都是1的XOR,Q奇偶校验是2的幂(在GF(2 ^ 8)中),R奇偶校验是4的幂。与标准Reed Solomon会生成奇偶校验(基于生成多项式的余数)不同,Raid会生成校验子。

在所有3种情况下,编码矩阵都是行增加的单位矩阵,以对奇偶校验进行编码,但范德蒙德,柯西和Raid的行增加了。

驱动器或磁盘

在这种情况下,它们的含义相同。

编码

d =每条带的数据行数,而 p =每条带的奇偶校验行数,那么可以使用最后一个 p 行, d p 编码子矩阵乘以 c的 d 数据行矩阵。

解码

清除开源代码分两个步骤。设 e =删除的数据行数。通过取与未擦除的数据行对应的(相同行索引)编码矩阵的前 d 行来重新生成 e 擦除的数据行,将 d 子矩阵> d ,则对应于已擦除数据行的倒置矩阵的 e 行将生成 e d 乘以 d 乘以 c 未擦除的数据行矩阵以重新生成数据。重新生成数据后,可以通过对现在重新生成的数据进行重新编码来重新生成所有奇偶校验行。

RAID解码不同。如果数据或P行中只有一个擦除,则使用XOR来重新生成已擦除的行。如果在Q,R,...行中只有一个擦除,则对擦除的行进行重新编码。对于多行擦除,通常使用GF()代数重新生成擦除的数据。这也可以通过基于被擦除行的索引的2的幂创建 e by e 矩阵,将 e 反转 e 矩阵,然后将倒置的 e 乘以 e 乘以 p 的第一个 e em>编码矩阵的行,然后使用 c 矩阵使用该 e 来重新生成擦除的数据。

请注意,这些解码方法都不是传统的Reed Solomon解码方法,旨在纠正错误和擦除。修改后的Vandermonde矩阵的编码与原始视图系统编码的编码相同,但是擦除解码将与上述相同。

如果编码基于Wiki所谓的“ BCH视图”,则奇偶校验行是实际的奇偶校验(来自生成多项式的余数),并且在解码过程中,生成 e 个校正子行,并且一旦生成了 e 行校正子,就可以完成类似于Raid的擦除数据再生。我不知道基于“ BCH视图”编码的擦除代码。

https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction#Systematic_encoding_procedure


根据评论进行更新。

Raid(标准版)不使用柯西矩阵。 Raid也不使用改良的Vandermonde矩阵。柯西(Cauchy)和修改后的范德蒙德(Vandermonde)矩阵主要用于杰拉苏斯式算法,而不是Raid。突袭编码基于2的幂,{1 1 1 1 1 ... ... {2 4 8 16 ...},{4 16 64 ...}。

RAID是面向字节的,而不是面向比特的。 “条”的每一列都被视为字节数组。

对矩阵的列执行突袭(和擦除)编码和解码,将每一列视为独立的字节数组。

关于在GF(2 ^ 8)中运行的限制,这将Raid限制为255个数据驱动器和255个奇偶校验(综合)驱动器。对于数据和奇偶校验,Jerasure总共限制为255个(BCH视图)或256个(原始视图)驱动器。我不知道有什么实现方式接近这些限制。突袭6(2个奇偶校验,P和Q)最多指定32个驱动器,但这是一个任意选择。常见的jerasure实现将文件拆分为17个逻辑剥离称为碎片的碎片,并添加3个碎片进行奇偶校验,其中每个碎片通常存储在不同的Raid驱动器块上,不同的节点上或不同的服务器上。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...