纠删码

Ceph 可以加载许多纠删码算法中的一个。 最早且最常用的是 Reed-Solomon 算法。 纠删码是前向纠错 (FEC) 码。 FEC 代码将 K 块的消息转换为称为 N 块的代码字的较长消息,因此 Ceph 可以从 N 块的子集中恢复原始消息。

更具体地说, N = K+M 其中变量 K 是原始数据块数。 变量 M 表示擦除代码算法添加的额外或冗余块,以提供防止故障的保护。 变量 N 是在擦除编码过程之后创建的块总数。 M 的值为 N-K ,这表示算法从 K 个原始数据块计算 N-K 个冗余块。 此方法确保 Ceph 可以访问所有原始数据。 系统对任意 N-K 故障具有弹性。 例如,在 10 K (共 16 个) N 配置或纠删码 10/16中,纠删码算法会向 10 个基本块添加 6 个额外的块 K。 例如,在 M = K-N16-10 = 6 配置中, Ceph 将在 16 个 OSD 之间分布 16 个区块 N 。 即使 6 个 OSD 出现故障,也可以从 10 个经过验证的 N 块中重建原始文件--确保 IBM Storage Ceph 集群不会丢失数据,从而确保高水平的容错性。

与复制的池一样,在擦除编码的池中,启动集中的主 OSD 接收所有写操作。 在复制的池中, Ceph 会在集合中的辅助 OSD 上的放置组中生成每个对象的深度副本。 对于纠删编码,这个过程有点不同。 擦除编码池将每个对象存储为 K+M 块。 它分为 K 数据块和 M 编码块。 该池配置为具有大小 K+M ,以便 Ceph 将每个区块存储在操作集中的 OSD 中。 Ceph 将区块的排名存储为对象的属性。 主 OSD 负责将有效内容编码到 K+M 块中,并将它们发送到其他 OSD。 主 OSD 还负责维护布置组日志的权威版本。

例如,在典型配置中,系统管理员创建一个纠删码池以使用六个 OSD 并维持其中两个 OSD 的丢失。 即 (K+M = 6) ,即 (M = 2)。

当 Ceph 将包含 ABCDEFGHIJKL 的对象 NYAN 写入池时,擦除编码算法仅通过将内容分为四个部分来将内容分割为四个数据块: ABCDEFGHIJKL。 如果内容长度不是 K的倍数,那么算法将填充内容。 此函数还会创建两个编码块: 第五个使用 YXY ,第六个使用 QGC。 Ceph 使用与操作集位置对应的 shard_id 将每个块存储在操作集中的 OSD 上,其中它将块存储在具有相同名称 NYAN但驻留在不同 OSD 上的对象中。 例如, Chunk 1 包含 ABC , Ceph 将其存储在 OSD5 上,而区块 5 包含 YXY , Ceph 将其存储在 OSD4上。

图 1。 Ceph 客户端对象监视和通知
擦除代码 IO

在恢复方案中,客户机尝试通过读取区块 1 到 6 从纠删码池读取对象 NYAN 。 OSD 通知算法缺少块 2 和 6。 例如,主 OSD 可能未读取区块 6 ,因为 OSD6 已输出,并且可能未读取区块 2 ,因为 OSD2 最慢,并且未考虑其区块。 但是,当算法有四个区块时,它会读取四个区块: 包含 ABC的区块 1 ,包含 GHI的区块 3 ,包含 JKL的区块 4 和包含 YXY的区块 5。 然后,它将重建对象 ABCDEFGHIJKL的原始内容以及包含 QGC的块 6 的原始内容。

将数据分割成块与对象放置无关。 CRUSH 规则集与擦除编码的池概要文件一起确定块在 OSD 上的位置。 例如,如果在擦除代码概要文件中使用 "本地可修复代码" (lrc) 插件,那么会创建额外的块,并且需要较少的 OSD 才能从中恢复。 例如,在 lrc 概要文件配置 K=4 M=2 L=3中,算法会创建六个块 (K+M) ,就像 jerasure 插件一样,但局部性值 (L=3) 要求算法在本地创建 2 个更多块。 此算法将创建其他块,例如 (K+M)/L。 如果包含块 0 的 OSD 失败,那么可以使用块 1 , 2 和第一个本地块来恢复此块。 在这种情况下,算法仅需要 3 块来进行恢复,而不是 5。
注: 使用纠删码池将禁用对象映射。
要点: 对于具有 2 + 2 配置的纠删码池,请将输入字符串从 ABCDEFGHIJKL 替换为 ABCDEF ,并将编码块从 4 替换为 2。

多步重试(MSR)是 Ceph 集群中的一种 CRUSH 规则,它定义了数据在存储设备间的分布方式。 MSR 可确保高效的数据检索、平衡和容错。 更多信息,请参阅创建 CRUSH 规则