5.4. 纠删代码插件
Ceph 支持使用插件架构进行纠删代码,这意味着您可以使用不同类型的算法创建纠删代码池。Ceph 支持:
- Jerasure(默认)
- Local Repairable
- ISA(仅限 Intel)
以下小节更详细地描述了这些插件。
5.4.1. Jerasure Erasure Code 插件
jerasure 插件是最通用且最灵活的插件。它也是 Ceph 纠删代码池的默认方法。
jerasure 插件封装 JerasureH 库。有关参数的详情,请查看 jerasure 文档。
要使用 jerasure 插件创建新的纠删代码 profile,请运行以下命令:
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]
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 ;只要设置 k 和 m 就足够了。cauchy_good 技术可以更快,但您需要仔细选择 数据包化。所有 reed_sol_r6_op、liberation、 blaum_roth、liber8tion 都是等效的 RAID6,它们只能配置 m=2。
- 类型
- 字符串
- 必填
- 否.
- 有效设置
-
reed_sol_van
reed_sol_r6_op
cauchy_orig
cauchy_good
liberation
blaum_roth
liber8tion
- 默认
-
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 纠删代码插件时看到机架之间的带宽使用量降低。
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
$ 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 与丢失的块处于相同的机架时,您才能看到带宽降低。
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
$ 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,请运行以下命令:
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]
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=4 和 m=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 配置集
k 和 m 的总和必须是 l 参数的倍数。低级别配置参数不会实施这样的限制,它可能会更方便用于特定目的。例如,可以定义两个组,一个有 4 个区块,另一个为 3 个区块。也可以递归定义位置集,如数据中心和机架到数据中心。k/m/l 通过生成低级配置来实现。
lrc 纠删代码插件以递归方式应用纠删代码技术,以便从丢失部分块中恢复仅需要部分可用区块(大部分时间)。
例如,当三个编码步骤描述为:
chunk nr 01234567 step 1 _cDD_cDD step 2 cDDD____ step 3 ____cDDD
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
其中 c 是从数据区块 D 计算出的编码区块,则块丢失 7 可使用后四个区块恢复。而且丢失的 chun 2 块可以使用前四个区块来恢复。
MIminal 测试方案严格相当于使用默认的纠删代码 profile。DD 暗示 K=2,c 表示 M=1,并且默认使用 jerasure 插件。
ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=DD_ \ layers='[ [ "DDc", "" ] ]' ceph osd pool create lrcpool 12 12 erasure LRCprofile
$ ceph osd erasure-code-profile set LRCprofile \
plugin=lrc \
mapping=DD_ \
layers='[ [ "DDc", "" ] ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile
lrc 插件对于减少机架间带宽使用量特别有用。虽然当所有主机都连接到同一交换机时,可能不是有趣的用例,但实际上可以观察降低带宽使用量。它等同于 k=4、m=2 和 l=3,但块布局不同:
ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ ceph osd pool create lrcpool 12 12 erasure LRCprofile
$ 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 与丢失的块处于相同的机架时,才会看到降低的带宽:
ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ ceph osd pool create lrcpool 12 12 erasure LRCprofile
$ 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 后端:
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
$ 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:
ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ ceph osd pool create lrcpool 12 12 erasure LRCprofile
$ 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。例如:
chunk nr 01234567 step 1 _cDD_cDD step 2 cDDD____ step 3 ____cDDD
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
需要正好 8 个 OSD,每个区块一个。如果主机位于两个相邻的机架中,则前四个区块可以放在第一个机架中,然后在第二架中排在最后四块中。恢复单一 OSD 丢失不需要在两个机架之间使用带宽。
例如:
crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'
crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'
将创建一条规则,以选择两个类型为 rack 的 crush bucket,并且各自选择四个 OSD,分别位于 主机 类型不同的 bucket 中。
也可以手动创建该规则以进行更精细的控制。