返回博客列表
存储架构 · 2026-06-22

EC 的基本原理与主流实现方案

本文使用大模型,基于公开论文、工程文档和存储系统常见实践整理生成。

Erasure Coding,通常简称 EC 或纠删码,是云存储把副本成本降下来的核心技术之一。它把一份数据切成多个数据块,再计算出若干校验块;只要丢失块数不超过设计上限,系统就能用剩余块恢复原始数据。

本文大纲
  1. EC 解决什么问题
  2. Reed-Solomon 的基本原理
  3. 工程实现里的核心难点
  4. 主流 EC 架构方案
  5. 论文和开源系统给出的取舍

1. EC 解决什么问题

最容易理解的数据保护方式是多副本。三副本把每个对象写三份,任意丢一份或两份仍可读,但存储开销是 3x。EC 的目标是在接近甚至高于多副本可靠性的前提下,把空间开销降到 1.2x 到 1.6x 左右。

以常见的 RS(6,3) 为例,系统把对象切成 6 个数据块,再计算 3 个校验块,总共写入 9 个块。任意丢失 3 个块,仍可从剩余 6 个块恢复原始对象。空间开销是 (6+3)/6 = 1.5x,明显低于三副本。

三副本与 EC 的空间开销差异
三副本 A + A + A = 3.0x Replica Replica Replica RS(6,3) 6 data + 3 parity = 1.5x D1 D2 D3 D4 D5 D6 P1 P2 P3

EC 的代价也很明确:写入路径要编码,修复时要读取多个块,覆盖写会牵涉校验更新,小对象需要聚合或补齐。它不是免费午餐,而是在成本、可靠性、恢复带宽和访问延迟之间重新分配预算。

2. Reed-Solomon 的基本原理

工程系统里最经典的 EC 是 Reed-Solomon。可以把它理解成一种线性编码:数据块组成向量,编码矩阵乘以数据向量,得到数据块和校验块。恢复时,只要拿到足够多的块,就能求逆矩阵还原原始数据。

实际实现通常在有限域上做运算,例如 GF(2^8) 或 GF(2^16)。有限域让加法、乘法、求逆都有封闭定义,适合字节级或 word 级 SIMD 优化。Ceph、HDFS、ISA-L、Jerasure 等实现都围绕这类编码和硬件加速展开。

Reed-Solomon 编码和解码模型
Data Vector D1 D2 ... Dk Generator Matrix G identity rows keep data parity rows mix data Encoded Blocks D1..Dk P1 ... Pm decode: select any k surviving rows, invert the matrix, reconstruct missing data

Reed-Solomon 的优势是 MDS 特性。对 RS(k,m) 来说,任意丢失不超过 m 个块都能恢复,这给可靠性建模带来非常清晰的边界。它的弱点是修复一个小块通常要读取 k 个块,这会放大网络和磁盘 IO。

3. 工程实现里的核心难点

EC 在论文里看起来像矩阵运算,在生产系统里则是跨节点的读写协议。一个对象或 stripe 往往横跨多个磁盘、主机、机架甚至可用区;编码选择会影响正常读写、降级读、后台恢复和容量均衡。

难点 原因 常见工程处理
小对象 对象小于 stripe 时,直接 EC 会产生 padding、元数据和随机写放大。 小对象走副本、日志聚合或 pack,再在后台转 EC。
覆盖写 改一个数据块会影响校验块,read-modify-write 成本高。 采用 append-only、版本化对象、后台合并或全 stripe 写。
降级读 块不可用时,要读多个幸存块并解码,尾延迟容易升高。 热点数据保留副本,EC 用于冷数据或温数据。
修复带宽 RS 修一个块常要读取 k 个块,集群故障时容易挤占前台 IO。 使用 LRC、分层 EC、限速修复和机架感知调度。
放置策略 同一 stripe 的块必须避开相关故障域。 按磁盘、主机、机架、AZ 设置 failure domain。
EC 写入、读取和修复路径
Object / File split into stripes EC Encoder data + parity chunks Placement different failure domains D1 D2 D3 P1 P2 Normal read read the needed data chunks Degraded read / repair read surviving chunks, decode missing chunks

4. 主流 EC 架构方案

业内方案大体可以分成四类:传统 Reed-Solomon、带本地校验的 LRC、层级或跨地域 EC,以及副本到 EC 的生命周期转换。它们不是互斥关系,真实系统通常会按数据温度、对象大小和故障域组合使用。

方案 代表系统 优势 代价
RS / MDS EC Ceph、MinIO、HDFS EC、对象存储后端。 可靠性边界清晰,空间效率高,生态成熟。 单块修复读放大高,降级读尾延迟明显。
LRC Azure Storage LRC、Xorbas、部分云存储内部实现。 常见单块故障只读本地 group,修复带宽更低。 额外本地校验增加空间开销,编码布局更复杂。
分层 EC 跨机架、跨 AZ、跨 region 的云存储布局。 把机架故障和区域故障分层处理,恢复路径更可控。 放置、调度、容量均衡和故障建模更复杂。
副本转 EC Facebook f4、HDFS-RAID、冷数据对象存储。 热写阶段低延迟,冷却后节省容量。 需要后台迁移、校验、索引和生命周期管理。
LRC 通过本地校验降低单块修复成本
Local group A D1 D2 D3 L1 repair D2 by reading D1, D3, L1 Local group B D4 D5 D6 L2 most single failures stay local Global parity P1 / P2 keeps tolerance for wider failure combinations

LRC 的关键洞察是:生产里最常见的是单盘、单节点、单块故障,不必每次都动用完整的 RS 解码。通过增加本地校验块,系统可以用更少幸存块完成大多数修复,同时保留全局校验应对更大范围故障。Azure Storage 和 Xorbas 相关论文都围绕这个方向展开。

5. 论文和开源系统给出的取舍

Azure Storage 论文展示了强一致云存储如何同时使用三副本、EC 和地理复制。它在单 region 内使用 LRC 来降低修复带宽,同时保留跨故障域的数据耐久性。这个方向后来成为许多云存储 EC 设计的重要参考。

Facebook f4 论文强调生命周期转换:热数据先在 Haystack 里保留副本,等访问温度下降后迁移到 f4,用 EC 降低冷数据成本。这个实践说明 EC 不一定要出现在每一次前台写入路径上,后台转码也可以是非常有效的架构选择。

HDFS-RAID 和后来的 HDFS Erasure Coding 则代表了大数据文件系统路径。它们关注大文件、顺序读写、块级修复和 NameNode 元数据扩展。与对象存储相比,HDFS 更容易通过大 block 和批量任务摊薄 EC 成本。

Ceph 和 MinIO 更接近通用对象存储产品化形态。Ceph 通过 erasure-code profile、failure domain 和 CRUSH 放置规则让用户选择编码插件与故障域;MinIO 则以对象级 EC 和 parity set 简化部署模型,强调在标准硬件上的容量效率和容错。

系统 / 论文 核心方案 可借鉴点
Azure Storage / LRC 本地校验 + 全局校验,降低常见修复的网络开销。 把恢复带宽作为一等设计目标,而不只看空间开销。
Xorbas 使用 locally repairable codes 改善云存储单块修复。 在 MDS 最优空间效率之外,为修复性能引入新的优化维度。
Facebook f4 热数据副本,温冷数据迁移到 EC blob store。 用生命周期管理把延迟敏感路径和容量优化路径分开。
HDFS-RAID / HDFS EC 对大文件和 block group 做 EC,适合批量数据场景。 大 block、批处理和后台修复能显著降低 EC 管理成本。
Ceph / MinIO 面向对象存储的 EC profile、parity set 和故障域放置。 产品化系统必须暴露足够清晰的编码参数和恢复策略。

对 KyteStore 这类系统的启发

  • 不要只比较空间开销。EC 方案还必须比较修复读放大、降级读延迟、后台恢复对前台流量的影响。
  • 数据温度要参与决策。热数据可以保留副本或缓存,温冷数据再转 EC,避免把编码成本放到最敏感路径。
  • 故障域必须进入编码布局。一个 stripe 的块不能集中在同一主机、机架或 AZ,否则数学可靠性会被相关故障抵消。
  • 小对象需要单独策略。直接 EC 小对象通常不划算,应考虑 pack、日志聚合、阈值转换或副本保护。
  • 恢复调度和验证同样关键。EC 不只是编码库,还包括 scrub、repair、限速、校验、重平衡和故障演练。

参考资料

本文聚焦 EC 架构和工程取舍。具体编码库、SIMD 优化、可靠性计算和 KyteStore 的落地设计可在后续文章中继续展开。