5.2. 纠删代码配置集

Ceph 定义带有 profile 的纠删代码池。Ceph 在创建纠删代码池和关联的 CRUSH 规则时使用 profile。

Ceph 在初始化集群时会创建一个默认的纠删代码 profile,它提供与复制池中两个副本相同的冗余级别。但是,它使用的存储容量要少 25%。默认配置文件定义 k=2m=1,这意味着 Ceph 会将对象数据分散到三个 OSD(k+m=3),Ceph 可能会丢失其中一个 OSD,而不丢失数据。

默认纠删代码 profile 可以持续丢失单个 OSD。它等同于大小为 2 的复制池,但需要 1.5 TB 而不是 2 TB 来存储 1 TB 数据。要显示默认配置集,请使用以下命令:

$ ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van

您可以创建新配置集来提高冗余性,而不增加原始存储要求。例如,具有 k=8 和 m= 4 的配置集可以通过在12(k+m=12)OSD 上分布对象来维持 4(m=4)OSD 丢失。Ceph 将对象划分为 8 个 区块,并计算 4 个 编码区块以进行恢复。例如,如果对象大小为 8 MB,则每个数据区块的大小为 1 MB,每个编码区块的大小与数据区块大小相同,这也是 1 MB。即使四个 OSD 同时出现故障,对象也不会丢失。

配置集最重要的参数是 kmcrush-failure-domain,因为它们定义存储开销和数据持久性。

重要

选择正确的配置集非常重要,因为您创建池后无法更改配置集。若要修改配置文件,您必须创建一个具有不同配置文件的新池,并将对象从旧池中迁移到新池中。

例如,如果所需构架必须维持两个机架的丢失,存储开销为 50%,则可定义以下配置集:

$ ceph osd erasure-code-profile set myprofile \
   k=4 \
   m=2 \
   crush-failure-domain=rack
$ ceph osd pool create ecpool 12 12 erasure *myprofile*
$ echo ABCDEFGHIJKL | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHIJKL

Primary OSD 将 NYAN 对象划分为四个(k=4)数据区块,再创建两个额外的区块(m=2)。m 的值定义可以同时丢失多少个 OSD,而不丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则,确保同一机架中不存储任何两个区块。

纠删代码
重要

红帽支持 km 的以下纠删代码值:

  • k=8 m=3
  • k=8 m=4
  • k=4 m=2
重要

如果丢失的 OSD 数量等于编码区块数(m),纠删代码池中的一些放置组将进入不完整状态。如果丢失的 OSD 数量小于 m,则任何 PG 都不会进入不完整的状态。在这两种情况下,不会发生数据丢失。如果 PG 处于不完整状态,则临时减少纠删代码池的 min_size 将允许恢复。

5.2.1. OSD erasure-code-profile 设置

创建新纠删代码 profile:

ceph osd erasure-code-profile set <name> \
         [<directory=directory>] \
         [<plugin=plugin>] \
         [<stripe_unit=stripe_unit>] \
         [<crush-device-class>]\
         [<crush-failure-domain>]\
         [<key=value> ...] \
         [--force]

其中:

目录
描述
设置从其中加载纠删代码插件 的目录 名称。
类型
字符串
必填
否.
默认
/usr/lib/ceph/erasure-code
plugin
描述
使用纠删代码插件计算编码区块并恢复缺少的区块。详情请查看 纠删代码插件 部分。
类型
字符串
必填
否.
默认
jerasure
stripe_unit
描述
数据区块中的数据量,每个分条.例如:带有 2 个数据块和 stripe_unit=4K 的配置集会将 0-4K 范围放在块 0 中,4K-8K 放在块 1 中,然后再次以块 0 为 8K-12K。为了获得最佳性能,这应该是 4K 的倍数。创建池时,从 monitor config 选项 osd_pool_erasure_code_stripe_unit 获取默认值。使用此配置集的池的 stripe_width 将是此 stripe_unit 乘以的数据区块数。
类型
字符串
必填
否.
默认
4K
crush-device-class
描述
设备类,如 hdd 或 ssd。仅适用于 RHCS 3 及更高版本.
类型
字符串
必填
默认
,这意味着 CRUSH 都使用所有设备,无论类如何.
crush-failure-domain
描述
故障域,如 host 或 rack
类型
字符串
必填
默认
host
key
描述
剩余的键值对的语义由纠删代码插件定义。
类型
字符串
必填
否.
--force
描述
通过相同名称覆盖现有配置集。
类型
字符串
必填
否.

5.2.2. OSD erasure-code-profile Remove

删除纠删代码 profile:

ceph osd erasure-code-profile rm <name>

如果配置集被池引用,则删除会失败。

5.2.3. OSD erasure-code-profile Get

显示纠删代码 profile:

ceph osd erasure-code-profile get <name>

5.2.4. OSD erasure-code-profile List

列出所有纠删代码配置集的名称:

ceph osd erasure-code-profile ls