EC 编码和 LRC 编码

EC 编码和 LRC 编码

ℹ️
✋🏻😭✋🏻 本小节编辑中 ✍️✍️✍️

理解本文,读者将收获

  • EC/LRC 编码的基本数学原理
  • EC/LRC 编码的优势和缺点
  • EC/LRC 编码成本和性能核算模型

以下内容超出本文范围

  • 如何编写一个工业级的 EC 编解码库

技术背景和动机

在前些篇文章中,我们已经使用了很大篇幅去描述 “复制(增加数据冗余度)” 的重要性。

一种广泛应用且简单的复制方式即副本复制。然而副本复制存在一些问题,使我们不得不寻找更加灵活的编码方式去增加数据冗余度。

单纯使用副本复制,存在以下局限性:

  • 只能以数据整数倍扩增,比如 1 副本、2 副本、3 副本等等。
  • 一般经验上,结合硬件的故障率,至少需要使用 3 副本才能满足数据的安全性保证。
  • 成本因此至少承担 3 倍数据的存储、写带宽。

实际上不是所有的数据都值得使用 3 倍冗余去储存。梳理下就会发现,根本的技术障碍为:整数倍的冗余

一旦能够打破这个限制,我们能够根据实际的硬件损坏概率,灵活地安排冗余度/成本/性能的平衡

因此实际的技术需求变为:我们需要一种编码方式,能够

  • 灵活安排数据和冗余的配比
  • 冗余信息熵逼近故障容忍所需的熵增量
  • 计算相对快速
  • 易于理解和控制

Erasure Code (EC) 因符合上述需求,被分布式存储广泛使用。

Head First EC

关于 EC 编码的简明数学原理和工程经验,可参考 OpenACID Blog 优秀的 EC 系列文章123。笔者强烈建议读者抽时间理解 EC 的数学原理。本文则从系统设计角度出发,考虑 EC 的使用手法,假设读者可以直接使用成熟的编码库,如 isa-l4 等。

EC 编解码:input / output

感性上,我们可将 EC 编解码器想象成一个神奇的黑魔法模块。正常情况下,我们可以输入数据块,得到一些校验块。

不妨想象一个 4MiB 的数据。由于内部是矩阵计算,我们需要确定这次编码的的长度,不妨定为 1MiB。则我们得到 [D1, D2, D3, D4] 共 4 份,每份长度为 1MiB数据块

我们也可以决定要输出多少个校验块出来,不妨设为 2 块。则编码器输出 [P1, P2] 共 2 份,每份长度为 1MiB校验块

最终得到的块序列为 [D1, D2, D3, D4, P1, P2]。我们记为 EC(4,2)

总结下,我们可控的 EC 编码器的参数

  • 块的长度:单个数据块的长度 B
  • 数据块数量:m
  • 校验块数量:n

则编码器的输入输出如下:

  • 编码输入为: m 个 长度为 B 的数据块
  • 编码输出为:n 个 长度为 B 的校验块

图: EC 的编码器

别忘了 EC 的目的是冗余和数据修复。我们因故缺失了一些数据块,则需要解码器修复原始数据。

对于我们上述的 EC(4,2),设序列为 [D1, D2, D3, D4, P1, P2]。假设丢失了 D1 和 D4,则可根据 [D2, D3, P1, P2] 解出 [D1, D4]

图: EC 的解码器

冗余度和信息论

数据组织:stripe / one-by-one

性能模型

成本模型

数据安全性模型

集群修复速度

MTTR

EC 编码小结

Head First LRC

LRC 编解码器

性能模型

成本模型

数据安全性模型

LRC 编码小结

动手做:为用户选择合适的编码策略

小结