5.4. 纠删代码插件


Ceph 支持使用插件架构进行纠删代码,这意味着您可以使用不同类型的算法创建纠删代码池。Ceph 支持:

  • Jerasure(默认)
  • Local Repairable
  • ISA(仅限 Intel)

以下小节更详细地描述了这些插件。

5.4.1. Jerasure Erasure Code 插件

jerasure 插件是最通用且最灵活的插件。它也是 Ceph 纠删代码池的默认方法。

jerasure 插件封装 JerasureH 库。有关参数的详情,请查看 jerasure 文档。

要使用 jerasure 插件创建新的纠删代码 profile,请运行以下命令:

Copy to Clipboard Toggle word wrap
ceph osd erasure-code-profile set <name> \
     plugin=jerasure \
     k=<data-chunks> \
     m=<coding-chunks> \
     technique=<reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion> \
     [crush-root=<root>] \
     [crush-failure-domain=<bucket-type>] \
     [directory=<directory>] \
     [--force]

其中:

k
描述
每个对象分割成 数据区块,每个部分 存储在不同的 OSD 上。
类型
整数
必填
可以。
示例
4
m
描述
为每个对象计算 编码区块,并将它们存储在不同的 OSD 上。编码区块的数量也是可以在不丢失数据的情况下停止的 OSD 数量。
类型
整数
必填
可以。
示例
2
技术
描述
更灵活的技术是 reed_sol_van ;只要设置 km 就足够了。cauchy_good 技术可以更快,但您需要仔细选择 数据包化。所有 reed_sol_r6_opliberation、 blaum_rothliber8tion 都是等效的 RAID6,它们只能配置 m=2
类型
字符串
必填
否.
有效设置
reed_sol_vanreed_sol_r6_opcauchy_origcauchy_goodliberationblaum_rothliber8tion
默认
reed_sol_van
packetsize
描述
一次将对 字节 大小的数据包进行编码。很难选择正确的数据包大小。jerasure 文档包含有关此主题的广泛信息。
类型
整数
必填
否.
默认
2048
crush-root
描述
用于规则第一步的 CRUSH bucket 的名称。例如,使用默认步骤
类型
字符串
必填
否.
默认
default
crush-failure-domain
描述
确保 bucket 中没有两个块,且具有相同的故障realm。例如,如果故障域是 主机,则同一主机上不会存储两个区块。它用于创建规则步骤,如 step selectleaf host
类型
字符串
必填
否.
默认
host
目录
描述
设置从其中加载纠删代码插件 的目录 名称。
类型
字符串
必填
否.
默认
/usr/lib/ceph/erasure-code
--force
描述
通过相同名称覆盖现有配置集。
类型
字符串
必填
否.

5.4.2. Local Repairable Erasure Code(LRC)插件

利用 jerasure 插件,Ceph 将纠删代码对象存储在多个 OSD 上时,从丢失的 OSD 中恢复需要从所有其他 OSD 读取。例如,如果您使用 k=8 和 m= 4 配置 jerasure,则丢失一个 OSD 需要从 10 个 OSD 中读取才能修复。

lrc 纠删代码插件创建本地奇偶校验区块,以便能够使用更少的 OSD 恢复。例如,如果您使用 k=8、m= 4 和 l=4 配置 l rc,它将为每四个 OSD 创建一个额外的奇偶校验块。当 Ceph 丢失单个 OSD 时,它可以仅使用四个 OSD 而不是十个 OSD 恢复对象数据。

虽然当所有主机都连接到同一交换机时,可能不是有趣的用例,但实际上您可以在使用 lrc 纠删代码插件时看到机架之间的带宽使用量降低。

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     k=4 m=2 l=3 \
     crush-failure-domain=host
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

在 1.2 版本中,只有Primary OSD 与丢失的块处于相同的机架时,您才能看到带宽降低。

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     k=4 m=2 l=3 \
     crush-locality=rack \
     crush-failure-domain=host
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

5.4.2.1. 创建 LRC 配置文件

要创建新的 LRC 纠删代码 profile,请运行以下命令:

Copy to Clipboard Toggle word wrap
ceph osd erasure-code-profile set <name> \
     plugin=lrc \
     k=<data-chunks> \
     m=<coding-chunks> \
     l=<locality> \
     [crush-root=<root>] \
     [crush-locality=<bucket-type>] \
     [crush-failure-domain=<bucket-type>] \
     [directory=<directory>] \
     [--force]

其中:

k
描述
每个对象分割成 数据区块,每个部分 存储在不同的 OSD 上。
类型
整数
必填
可以。
示例
4
m
描述
为每个对象计算 编码区块,并将它们存储在不同的 OSD 上。编码区块的数量也是可以在不丢失数据的情况下停止的 OSD 数量。
类型
整数
必填
可以。
示例
2
l
描述
将代码和数据区块分组为大小本地化 的集合。例如,对于 k=4m=2,当创建 locality=3 两个组时。每个集合都可以恢复,无需从另一个集合中读取区块。
类型
整数
必填
可以。
示例
3
crush-root
描述
用于规则第一步的 crush bucket 的名称。例如,使用默认步骤
类型
字符串
必填
否.
默认
default
crush-locality
描述
crush bucket 的类型,其中将存储 l 定义的每一组区块。例如,如果设置为 rack,则每个 l 区块将放置在不同的机架中。它用于创建规则步骤,如 步骤选择机架。如果未设置,则不进行此类分组。
类型
字符串
必填
否.
crush-failure-domain
描述
确保 bucket 中没有两个块,且具有相同的故障realm。例如,如果故障域是 主机,则同一主机上不会存储两个区块。它用于创建规则步骤,如 step selectleaf host
类型
字符串
必填
否.
默认
host
目录
描述
设置从其中加载纠删代码插件 的目录 名称。
类型
字符串
必填
否.
默认
/usr/lib/ceph/erasure-code
--force
描述
通过相同名称覆盖现有配置集。
类型
字符串
必填
否.

5.4.2.2. 创建低级 LRC 配置集

km 的总和必须是 l 参数的倍数。低级别配置参数不会实施这样的限制,它可能会更方便用于特定目的。例如,可以定义两个组,一个有 4 个区块,另一个为 3 个区块。也可以递归定义位置集,如数据中心和机架到数据中心。k/m/l 通过生成低级配置来实现。

lrc 纠删代码插件以递归方式应用纠删代码技术,以便从丢失部分块中恢复仅需要部分可用区块(大部分时间)。

例如,当三个编码步骤描述为:

Copy to Clipboard Toggle word wrap
chunk nr    01234567
step 1      _cDD_cDD
step 2      cDDD____
step 3      ____cDDD

其中 c 是从数据区块 D 计算出的编码区块,则块丢失 7 可使用后四个区块恢复。而且丢失的 chun 2 块可以使用前四个区块来恢复。

MIminal 测试方案严格相当于使用默认的纠删代码 profile。DD 暗示 K=2c 表示 M=1,并且默认使用 jerasure 插件。

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=DD_ \
     layers='[ [ "DDc", "" ] ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

lrc 插件对于减少机架间带宽使用量特别有用。虽然当所有主机都连接到同一交换机时,可能不是有趣的用例,但实际上可以观察降低带宽使用量。它等同于 k=4m=2l=3,但块布局不同:

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "" ],
               [ "cDDD____", "" ],
               [ "____cDDD", "" ],
             ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

在 Firefly 中,只有Primary OSD 与丢失的块处于相同的机架时,才会看到降低的带宽:

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "" ],
               [ "cDDD____", "" ],
               [ "____cDDD", "" ],
             ]' \
     crush-steps='[
                     [ "choose", "rack", 2 ],
                     [ "chooseleaf", "host", 4 ],
                    ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

LRC 现在使用 jerasure 作为默认的 EC 后端。可以使用低级配置逐个层指定 EC 后端和算法。tier='[ [ "DDc", "" ] ]' 中的第二个参数实际上是用于此级别的纠删代码 profile。以下示例使用 lrcpool 中要使用的 Cauchy 技术指定 ISA 后端:

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=DD_ \
     layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

您还可以为每个层使用不同的纠删代码 profile:

Copy to Clipboard Toggle word wrap
$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "plugin=isa technique=cauchy" ],
               [ "cDDD____", "plugin=isa" ],
               [ "____cDDD", "plugin=jerasure" ],
             ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

5.4.3. 控制 CRUSH 放置

默认 CRUSH 规则提供位于不同主机上的 OSD。例如:

Copy to Clipboard Toggle word wrap
chunk nr    01234567

step 1      _cDD_cDD
step 2      cDDD____
step 3      ____cDDD

需要正好 8 个 OSD,每个区块一个。如果主机位于两个相邻的机架中,则前四个区块可以放在第一个机架中,然后在第二架中排在最后四块中。恢复单一 OSD 丢失不需要在两个机架之间使用带宽。

例如:

Copy to Clipboard Toggle word wrap
crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'

将创建一条规则,以选择两个类型为 rack 的 crush bucket,并且各自选择四个 OSD,分别位于 主机 类型不同的 bucket 中。

也可以手动创建该规则以进行更精细的控制。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.