擦除编码

内容

目录

MinIO 在提供数据冗余和可用性方面实现了纠删码作为核心组件。本页面提供了有关 MinIO 纠删码的介绍。

查看可用性和弹性部署架构以获取有关MinIO如何在生产部署中使用纠删码的更多信息。

注意

本部分的图表和内容展示了 MinIO 擦除编码操作的简化视图,不代表 MinIO 完整擦除编码实现的复杂性。

MinIO 将每个服务器池中的驱动器分组为一个或多个相同大小的纠删码集

Diagram of erasure set covering 4 nodes and 16 drives

上述示例部署由每个4个驱动器的4个节点组成。MinIO初始化为一个包含所有16个驱动器的单个纠删码集,跨所有四个节点。

MinIO 在初始化 服务器池 时确定纠删码集的最佳数量和大小。在初始设置完成后,您无法修改这些设置。

对于每个写操作,MinIO 将对象分成数据校验分片。

擦除集条带大小决定了部署的最大可能奇偶校验。确定要生成的数据和奇偶校验分片数量的公式如下:

N(擦除集大小)= K(数据)+ M(校验)

Diagram of possible erasure set parity settings

上面的示例部署具有 16 个驱动器的擦除集。这可以支持 EC:0 和擦除集驱动器的 1/2 之间的奇偶校验,或 EC:8

您可以将奇偶校验值设置在擦除集大小的 0 到 1/2 之间。

Diagram of an object being sharded using MinIO's Reed-Solomon Erasure Coding algorithm.

MinIO 使用了Reed-Solomon纠删码实现,并将对象分区以在纠删码集中进行分发。上面的示例部署具有16个纠删码集大小和EC:4的奇偶校验。

使用特定奇偶校验设置编写的对象,如果稍后更改奇偶校验值,则不会自动更新。

MinIO 需要至少 K 个任意类型的碎片来 读取 一个对象。

这里的值 K 构成了部署的读取法定人数。因此,纠删码集必须至少有 K 个健康驱动器在纠删码集中,以支持读取操作。

Diagram of a 4-node 16-drive deployment with one node offline.

此部署有一个离线节点,导致只剩下 12 个健康驱动器。该对象使用 EC:4 进行写入,读取法定人数为 K=12。因此,该对象保持读取法定人数,MinIO 可以重建它以进行读取操作。

MinIO无法重建丢失读取法定数量的对象。这类对象可以通过其他方式进行恢复,比如复制重新同步

MinIO 需要至少 K 个纠错集驱动器来 写入 一个对象。

这里的值 K 构成了部署的写入法定人数。因此,消除集必须至少有 K 个可用驱动器在线,以支持写入操作。

Diagram of a 4-node 16-drive deployment where one node is offline.

此部署有一个离线节点,导致只剩下 12 个健康驱动器。客户端使用 EC:4 冗余设置写入对象,擦除集具有写入法定人数 K=12。此擦除集保持写入法定人数,MinIO 可以用它进行写入操作。

如果 Parity EC:M 恰好是擦除集大小的 1/2,写入法定人数K+1

这可以防止出现分裂脑的情况,比如网络问题导致刚好一半的擦除集驱动器与其他驱动器隔离开来。

Diagram of an erasure set with where Parity EC:M is 1/2 the set size

由于瞬时网络故障,此部署有两个节点离线。客户端使用EC:8奇偶校验设置写入一个对象,擦除集的写入法定人数为K=9。该擦除集已失去写入法定人数,MinIO 无法将其用于写操作。

通过 K+1 逻辑确保客户端不会将同一对象写入两次 - 分别写入纠删集的每一半。

对于维护读取法定人数的对象,MinIO 可以使用任何数据或奇偶校验碎片来修复受损的碎片。

Diagram of MinIO using parity shards to heal lost data shards on a node.

一个具有EC:4的对象由于驱动器故障丢失了12个数据碎片中的四个。由于对象保持了读取法定人数,MinIO可以使用可用的奇偶校验碎片来修复这些丢失的数据碎片。

使用 MinIO Erasure Coding Calculator 来探索您计划拓扑结构的可能纠删码集大小和分布。在可能的情况下,使用偶数个节点和每个节点的驱动器,以简化拓扑规划和驱动器/纠删码集分布的概念化。

独家访问驱动器

MinIO 需要 独占 访问为对象存储提供的驱动器或卷。不应该有其他进程、软件、脚本或人直接在提供给MinIO的驱动器或卷上执行 任何 操作,或者对MinIO放置在其中的对象或文件执行任何操作。

除非由MinIO工程部门指示,否则不要使用脚本或工具直接修改、删除或移动所提供驱动器上的任何数据碎片、奇偶校验碎片或元数据文件,包括从一个驱动器或节点到另一个驱动器或节点。这样的操作很可能导致广泛的损坏和数据丢失,超出MinIO修复的能力范围。

设置部署的奇偶校验是可用性和总可用存储之间的平衡。更高的奇偶校验值增加了对驱动器或节点故障的弹性,但会以可用存储为代价,而较低的奇偶校验提供了最大存储空间,但对驱动器/节点故障的容忍度降低。使用MinIO Erasure Code Calculator来探索奇偶校验对您计划的集群部署的影响。

以下表格列出了在由1个节点和16个1TB驱动器组成的MinIO部署上变化的纠错码奇偶校验级别的结果:

对16盘MinIO集群中奇偶校验设置的影响

Parity

总存储空间

存储比率

读操作的最小驱动器数

写操作的最小驱动器数

EC: 4 (默认)

12 泰比字节

0.750

12

12

EC: 6

10 泰比字节

0.625

10

10

EC: 8

8 泰比字节

0.500

8

9

位腐败 是由于存储介质层发生随机变化而导致的静默数据损坏。对于数据驱动器来说,通常是由于代表数据的电荷衰减或磁定向的变化所导致。这些来源可以从停电期间的小电流突波到随机宇宙射线导致的位翻转。由此产生的“位腐败”可能会在不触发监控工具或硬件的情况下在数据介质上引起细微错误或损坏。

MinIO 优化了 HighwayHash 算法,确保在运行时捕获和修复损坏的对象。通过在应用程序中进行读取时计算哈希值,并在写入时验证哈希值,从应用程序端到网络端再到内存或驱动器端,确保了端到端的完整性。该实现旨在提高速度,在英特尔 CPU 的单个核心上可以实现超过 10 GB/sec 的哈希速度。

总结
MinIO实现了纠删码作为数据冗余和可用性的核心组件。文章介绍了MinIO纠删码的基本概念和操作流程。MinIO将驱动器分组到一个或多个相同大小的纠删码集中。纠删码集的条带大小决定了部署的最大可能奇偶校验。MinIO使用Reed-Solomon纠删码算法对对象进行分片和分布。对象写入时,MinIO将对象分成数据和奇偶分片。MinIO需要最少K个纠删码集驱动器来读取或写入对象。通过设置奇偶校验值,可以平衡可用性和总可用存储空间。MinIO的实现确保数据完整性,通过HighwayHash算法捕获和修复受损对象。