5.2. 纠删代码配置集
Ceph 定义带有 profile 的纠删代码池。Ceph 在创建纠删代码池和关联的 CRUSH 规则时使用 profile。
Ceph 在初始化集群时会创建一个默认的纠删代码 profile,它提供与复制池中两个副本相同的冗余级别。但是,它使用的存储容量要少 25%。默认配置文件定义 k=2 和 m=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 同时出现故障,对象也不会丢失。
配置集最重要的参数是 k、m 和 crush-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 规则,确保同一机架中不存储任何两个区块。
红帽支持 k 和 m 的以下纠删代码值:
- 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