里德-所罗门码(Reed-Solomon Code,RS 码)是一种基于有限域代数结构的纠删码(Erasure Code),因其高效的数据恢复能力和灵活的冗余配置,被广泛应用于多个领域。
卫星通信 处理深空信道中的长延时、高误码率问题(如 NASA 火星探测器使用 RS(255,223)码,纠错能力达 16 字节/码字)。
5G NR 标准 在控制信道采用 RS 码结合 CRC 校验,确保关键信令的可靠传输。
无线传感器网络 解决多跳传输中的累积丢包问题,典型配置 RS(6,2)可容忍 33%的数据丢失。
二维码(QR Code) 使用 RS 码实现容错等级调节(L7%, M15%, Q25%, H30%),即使部分区域污损仍可正确解码。
蓝光光盘 采用 RS(248,216)码组合交叉交织,纠正因划痕导致的连续突发错误。
DNA 数据存储 在合成生物分子链时添加 RS 校验,抵御碱基合成/测序错误(如 Microsoft 实验项目使用 RS(4,2))。
| 方案类型 | 冗余度 | 故障容忍度 |
|---|---|---|
| 3 副本 | 200% | 2 节点 |
| RS(10,4) | 40% | 4 节点 |
纠删码基于有限域(Galois Field,GF)上的线性代数运算。
编码过程:
[C] = [G] × [D]
其中:
- [D] 是 k×1 的数据向量(原始数据块)
- [G] 是 n×k 的生成矩阵
- [C] 是 n×1 的编码向量(编码后的块)
编码过程:
[C₁] [1 0 0] [D₁] [D₁ ]
[C₂] = [0 1 0] × [D₂] = [D₂ ]
[C₃] [0 0 1] [D₃] [D₃ ]
[C₄] [p₁ p₂ p₃] [P₁ = 校验块]
[C₅] [q₁ q₂ q₃] [P₂ = 校验块]
结果:
C₁ = D₁ ← 直接就是原始数据
C₂ = D₂ ← 直接就是原始数据
C₃ = D₃ ← 直接就是原始数据
C₄ = P₁ ← 校验块
C₅ = P₂ ← 校验块
原始数据:100MB
分成 k=6 个数据块,每个约 16.67MB
D1, D2, D3, D4, D5, D6
使用生成矩阵 G(Generator Matrix)(n×k)生成校验块:
[P1] [1 1 1 1 1 1] [D1]
[P2] [1 2 3 4 5 6] [D2]
[P3] = [1 4 9 16 25 36] × [D3]
[P4] [1 8 27 64 125 216] [D4]
[D5]
[D6]
将 6 个数据块 + 4 个校验块 = 10 个块分布到不同节点。
场景:丢失 2 个块
假设丢失 D2 和 P3,剩余 8 个块可用。
步骤 1:构建恢复矩阵
从生成矩阵中提取对应行,形成可逆矩阵。
步骤 2:求解线性方程组
已知:D1, D3, D4, D5, D6, P1, P2, P4 未知:D2, P3通过矩阵运算求解:[D2] = [恢复矩阵]^(-1) × [已知数据]
步骤 3:验证
恢复后验证数据完整性。
计算开销
编码:O(k×m) 复杂度
解码:O(k²) 或更高(取决于丢失块数)
修复开销
修复 1 个块需要读取 k 个块
修复带宽 = k × 块大小
原理
将数据按字节相加,取模或取反。
示例
数据:0x12, 0x34, 0x56
校验和 = (0x12 + 0x34 + 0x56) mod 256 = 0x9C
数据完整性校验:结合校验和(checksum)机制确保对象分片数据在读取时一致,例如 ZFS 会在读取时校验每个数据块的校验和,并在校验失败时进行修复。
RustFS 默认使用 crc32c(CRC-32 Castagnoli)作为校验和算法
Reed-Solomon 纠删码(RS码)
RS码是最常用的纠删码,基于多项式插值。
优点:容错能力强,存储效率高
缺点:计算开销大(特别是解码)
应用:Ceph、HDFS、GlusterFS
LRC(Locally Repairable Code,局部修复码)
特点:局部校验块,修复时只需读取少量块
优势:修复带宽小,速度快
应用:Azure Storage、Windows Storage Spaces
旋转RS码(Rotated RS)
特点:优化修复过程,减少修复时的数据读取量
应用:Facebook 的分布式存储
奇偶校验码(Parity)
最简单的纠删码(k+1 模式)
只能容忍 1 个块丢失
应用:RAID 5