5.2. 纠删代码 profile
Ceph 使用 配置集 定义一个纠删代码池。Ceph 在创建纠删代码池和关联的 CRUSH 规则时使用配置集。
Ceph 在初始化集群时创建默认纠删代码配置集,它提供与复制池中的两个副本相同的冗余级别。此默认配置集定义 k=2 和 m=2,这意味着 Ceph 将对象数据分散到四个 OSD (k+m=4),Ceph 可以在不丢失数据的情况下丢失其中一个 OSD。EC2+2 需要最少部署 4 个节点(推荐 5 个节点),并可以临时丢失 1 个 OSD 节点。
使用以下命令显示默认配置集:
$ ceph osd erasure-code-profile get default k=2 m=2 plugin=jerasure technique=reed_sol_van
您可以创建新配置集来提高冗余,而不增加原始存储要求。例如,一个具有 k=8 和 m=4 的配置集,可以丢失四个(m=4)OSD,这通过在 12 个 (k+m=12) OSD 中分布一个对象实现。Ceph 将对象分成 8 个块,并计算 4 个编码区块来进行恢复。例如,如果对象大小为 8 MB,每个数据块都是 1 MB,每个编码区块的大小也与 1 MB 相同。即使四个 OSD 同时失败,对象也不会丢失。
配置集最重要的参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。
选择正确的配置集非常重要,因为您创建池后无法更改配置集。若要修改配置文件,您必须创建一个具有不同配置文件的新池,并将对象从旧池中迁移到新池中。
例如,如果所需的架构需要可以丢失两个机架,且存储开销为 40% 的开销,则可以定义以下配置集:
$ 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
主 OSD 将 NYAN 对象分成四个 (k=4) 数据块,并创建两个额外的块 (m=2)。m 的值定义可以同时丢失 OSD 的数量,而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则,以确保在同一机架中不会存储两个块。
红帽支持对 k 和 m 的以下 jerasure 编码值:
- k=8 m=3
- k=8 m=4
- k=4 m=2
如果 OSD 数量丢失等于编码区块数(m
),则灾难恢复池中的某些放置组将进入不完整的状态。如果丢失的 OSD 数量小于 m
,则任何放置组将处于不完整的状态。在这两种情况下,不会发生数据丢失。如果放置组处于 incomplete 状态,则暂时减少纠删代码池的 min_size
允许恢复。
5.2.1. 设置 OSD erasure-code-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]
其中:
- 目录
- 描述
- 设置载入 code 插件的目录名称。
- 类型
- 字符串
- 必填
- No.
- 默认
-
/usr/lib/ceph/erasure-code
- plugin
- 描述
- 使用纠删代码插件计算编码区块并恢复缺少的块。详情请查看 Erasure Code 插件 部分。
- 类型
- 字符串
- 必填
- No.
- 默认
-
Jerasure
- stripe_unit
- 描述
-
每个条带的数据块中的数据量。例如,带有 2 个数据块和
stripe_unit=4K
的配置集会将范围 0-4K 置于块 0 中,将 4K-8K 置于块 1 中,8K-12K 再次置于块 0 中。这应该是 4K 的倍数以获得最佳性能。创建池时,从 monitor 配置选项osd_pool_erasure_code_stripe_unit
中获取了默认值。使用这个配置集的池的 stripe_width 将是这个 stripe_unit 的数据区块数乘以这个stripe_unit
。 - 类型
- 字符串
- 必填
- No.
- 默认
-
4K
- crush-device-class
- 描述
-
设备类,如
hdd
或ssd
。 - 类型
- 字符串
- 必填
- 否
- 默认
-
none
,这意味着 CRUSH 使用所有设备,而不需要考虑类型。
- crush-failure-domain
- 描述
-
故障域,如
host
或rack
。 - 类型
- 字符串
- 必填
- 否
- 默认
-
主机
- key
- 描述
- 剩余的键值对的语义由退出代码插件定义。
- 类型
- 字符串
- 必填
- No.
- --force
- 描述
- 按名称覆盖现有配置集。
- 类型
- 字符串
- 必填
- No.
5.2.2. 删除 OSD erasure-code-profile
删除纠删代码 profile:
语法
ceph osd erasure-code-profile rm RULE_NAME
如果池引用配置集,则删除会失败。
使用 osd erasure-code-profile rm
命令删除纠删代码 profile 不会自动删除与纠删代码配置集关联的 CRUSH 规则。红帽建议使用 ceph osd crush rule remove RULE_NAME
命令手动删除关联的 CRUSH 规则,以避免意外行为。
5.2.3. 获取 OSD erasure-code-profile
显示纠删代码池配置集:
语法
ceph osd erasure-code-profile get NAME
5.2.4. 列出 OSD erasure-code-profile
列出所有纠删代码 profile 的名称:
语法
ceph osd erasure-code-profile ls