注意
本文档适用于 Ceph 开发版本。
Locally repairable erasure code plugin
使用是插件,当擦除编码的对象存储在多个 OSD 上时,从单个 OSD 的丢失中恢复需要从k其他读取。例如如果是被配置为k=8和m=4,从单个 OSD 的丢失中恢复需要从八个其他读取。
The lrc擦除码插件创建本地奇偶校验块以使用更少的生存 OSD 进行恢复。例如如果lrc被配置为k=8, m=4和l=4,它将为每四个 OSD 创建一个额外的奇偶校验块。当单个 OSD 失去时,它可以用四个 OSD 而不是八个恢复。
擦除码配置文件示例
减少主机之间的恢复带宽
虽然当所有主机都连接到同一个交换机时,这很可能不是一个有趣的用例,但实际可以观察到带宽使用减少。:
ceph osd erasure-code-profile set LRCprofile \
plugin=lrc \
k=4 m=2 l=3 \
crush-failure-domain=host
ceph osd pool create lrcpool erasure LRCprofile
减少机架之间的恢复带宽
在 Firefly 中,只有当主 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 erasure LRCprofile
创建一个 lrc 配置文件
要创建一个新的 lrc 擦除码配置文件:
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}] \
[crush-device-class={device-class}] \
[directory={directory}] \
[--force]
其中:
k={data chunks}
- 描述:
每个对象被分成数据块部分,每个部分存储在不同的 OSD 上。
- 类型:
整数
- 必需:
是。
- 示例:
4
m={coding-chunks}
- 描述:
对每个对象进行计算并将它们存储在不同的 OSD 上。编码块的数量也是可以同时下线的 OSD 数量,而不会丢失数据。coding chunks for each object and store them on different OSDs. The number of coding chunks is also the number of OSDs that can be down without losing data.
- 类型:
整数
- 必需:
是。
- 示例:
2
l={locality}
- 描述:
将编码和数据块组合成大小为本地性的组。例如,对于k=4和m=2,当本地性=3两个三组被创建。
- 类型:
整数
- 必需:
是。
- 示例:
3
crush-root={root}
- 描述:
用于 CRUSH 规则第一步的 crush bucket 的名称。例如第一步使用默认.
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
default
crush-locality={bucket-type}
- 描述:
每组块存储在l中 CRUSH 桶的类型。例如,如果它被设置为机架,每组块将被放置在不同的机架中。它用于创建一个l chunks will be placed in a different rack. It is used to create a CRUSH rule step such as 步骤选择机架。如果它没有被设置,则不会执行这样的分组。
- 类型:
字符串
- 必需:
否。
crush-failure-domain={bucket-type}
- 描述:
确保没有两个块在同一 bucket 中具有相同的故障域。例如,如果故障域是主机,则不会将两个块存储在同一主机上。它用于创建 CRUSH 规则步骤,例如步骤.
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
主机
crush-device-class={device-class}
- 描述:
限制放置到特定类别的设备(例如,
ssd
或hdd
,使用 CRUSH 映射中的 crush device class 名称。- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
directory={directory}
- 描述:
Set the 目录从其中加载消息码插件的名称。
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
/usr/lib/ceph/erasure-code
--force
- 描述:
通过同名覆盖现有配置文件。
- 类型:
字符串
- 必需:
否。
低级插件配置
的总和k和m必须是l参数的倍数。然而,低级配置参数并不强制执行此限制,并且可能有利于用于特定目的。例如,可以定义两个组,一个有 4 个块,另一个有 3 个块。还可以递归地定义本地性组,例如数据中心和机架到数据中心。通过生成低级配置来实现k/m/l。
The lrc擦除码插件递归地应用擦除码技术,以便从某些块的丢失中恢复只需要可用块的一个子集,大多数时候。
例如,当三个编码步骤被描述为:
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
其中c计算从数据块D的编码块,丢失块7可以用最后的四个块恢复。并且丢失块2块可以用前四个块恢复。
使用低级配置的擦除码配置文件示例
最小测试
它严格等同于使用一个K=2 M=1擦除码配置文件。这意味着DD意味着K=2,c意味着M=1和是插件默认使用。:
ceph osd erasure-code-profile set LRCprofile \
plugin=lrc \
mapping=DD_ \
layers='[ [ "DDc", "" ] ]'
ceph osd pool create lrcpool erasure LRCprofile
减少主机之间的恢复带宽
虽然当所有主机都连接到同一个交换机时,这很可能不是一个有趣的用例,但实际可以观察到带宽使用减少。它等同于k=4, m=2和l=3虽然块的布局不同。警告:提示是可选的
$ ceph osd erasure-code-profile set LRCprofile \
plugin=lrc \
mapping=__DD__DD \
layers='[
[ "_cDD_cDD", "" ],
[ "cDDD____", "" ],
[ "____cDDD", "" ],
]'
$ ceph osd pool create lrcpool erasure LRCprofile
减少机架之间的恢复带宽
在 Firefly 中,只有当主 OSD 与丢失的块在同一机架时,才会观察到带宽减少。警告:提示是可选的
$ 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 erasure LRCprofile
使用不同的擦除码后端进行测试
LRC 现在默认使用 ISA 作为 EC 后端。可以使用低级配置按层指定 EC 后端/算法。在 layers=’[ [ “DDc”, “” ] ]’ 中的第二个参数实际上是用于该层的擦除码配置文件。下面的示例指定了用于 lrcpool 的 Jerasure 后端和 cauchy 技术使用:
ceph osd erasure-code-profile set LRCprofile \
plugin=lrc \
mapping=DD_ \
layers='[ [ "DDc", "plugin=jerasure technique=cauchy" ] ]'
ceph osd pool create lrcpool 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 erasure LRCprofile
擦除编码和解码算法
在层描述中找到的步骤:
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
按顺序应用。例如,如果对 4K 对象进行编码,它将首先通过步骤 1并分成四个 1K 块(四个大写 D)。它们按顺序存储在块 2、3、6 和 7 中。从这些块中计算出两个编码块(两个小写 c)。编码块分别存储在块 1 和 5 中。69faae: 步骤 2
The 步骤 2类似于步骤 1的方式重新使用内容,并以类似的方式存储一个编码块c在位置 0。最后四个块,用下划线 (_) 标记以提高可读性,被忽略。
The 步骤 3存储一个编码块c在位置 4。由步骤 1创建的三个块用于计算此编码块,即来自步骤 1的编码块成为步骤 3.
如果块2失去:
chunk nr 01234567
step 1 _c D_cDD
step 2 cD D____
step 3 __ _cDDD
解码将尝试通过反向遍历步骤来恢复它:步骤 3然后步骤 2最后步骤 1.
The 步骤 3什么也不知道关于块2(即它是下划线)并且被跳过。
来自步骤 2的编码块,存储在块0,允许它恢复块2的内容。没有更多的块要恢复,并且过程停止,不考虑步骤 1.
恢复块2需要读取块0、1、3并写回块2.
如果块2、3、6失去:
chunk nr 01234567
step 1 _c _c D
step 2 cD __ _
step 3 __ cD D
The 步骤 3可以恢复块6:
chunk nr 01234567
step 1 _c _cDD
step 2 cD ____
step 3 __ cDDD
The 步骤 2失败并被跳过,因为有两个块丢失 (2、3) 并且它只能从丢失的一个块中恢复。
来自步骤 1的编码块,存储在块1、5,允许它恢复块2、3:
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
控制 CRUSH 位置
默认 CRUSH 规则提供位于不同主机上的 OSD。例如:
chunk nr 01234567
step 1 _cDD_cDD
step 2 cDDD____
step 3 ____cDDD
需要8OSD,每个块一个。如果主机位于两个相邻的机架中,前四个块可以放置在第一个机架中,最后四个放置在第二个机架中。这样,从单个 OSD 的丢失中恢复就不需要使用两个机架之间的带宽。
例如:
crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'
将创建一个规则,它将选择两个类型为机架的 CRUSH 桶,并为每个桶选择四个 OSD,每个 OSD 都位于不同类型的桶中主机.
CRUSH 规则也可以手动制作以进行更精细的控制。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.