第 12 章 纠删代码池概述
Ceph 默认使用复制池,这意味着 Ceph 将每个对象从 Primary OSD 节点复制到一个或多个次要 OSD。纠删代码(erasure-coded)池可以减少确保数据持久性所需的磁盘空间量,但它的计算比复制要高得多。
Ceph 存储策略涉及定义数据持久性要求。数据持久性意味着,在丢失一个或多个 OSD 时可以保持数据不会丢失。
Ceph 在池中存储数据,并且有两种类型的池:
- 复制
- erasure-coded
纠删代码是一种在 Ceph 存储群集中存储对象的方法,即:该算法将对象分割为数据区块(k)和编码区块(m),并将这些区块存储在不同的 OSD 中。
如果 OSD 出现故障,Ceph 会从其他 OSD 检索剩余的数据(k)和编码(m)块,并且纠删代码算法会从这些块中恢复对象。
红帽建议纠删代码池为 K+1 或更多 大小,以防止丢失写入和数据。
纠删代码使用存储容量比复制更高效。n-replication 方法维护对象的 n 个副本(在 Ceph 中默认为 3x),而区块则仅维护 k + m 个区块。例如,3 数据和 2 个编码区块使用原始对象的存储空间 1.5x。
纠删代码使用比复制少的存储开销,但纠删代码池使用的内存比访问或恢复对象时使用的 CPU 数要多。当数据存储需要具有持久性和容错能力,但不需要快速读取性能(如冷存储、历史记录等)时,擦除代码具有优势。
有关纠删代码如何在 Ceph 中工作的信息,请参阅 Red Hat Ceph Storage 8 架构指南中的 Ceph Erasure Coding 部分。
当初始化具有 k=2 和 m=2 的集群时,Ceph 将 创建一个默认的 纠删代码 profile,这意味着 Ceph 会将对象数据分散到三个 OSD 中(k+m == 4),Ceph 可以在不丢失数据的情况下丢失其中一个 OSD。要了解更多有关纠删代码性能分析的信息,请参阅 Erasure Code Profiles 部分。
将 .rgw.buckets 池配置为纠删代码,所有其他 Ceph 对象网关池配置为复制,否则尝试创建新存储桶会失败并显示以下错误:
set_req_state_err err_no=95 resorting to 500
这样做的原因是,纠删代码池不支持 omap 操作,某些 Ceph Object Gateway 元数据池需要 omap 支持。
12.1. 纠删代码配置集 复制链接链接已复制到粘贴板!
Ceph 使用 配置文件 定义纠删代码池。Ceph 在创建纠删代码池和关联的 CRUSH 规则时,使用 profile。
Ceph 在初始化集群时创建默认的纠删代码 profile,并提供与复制池中的两个副本相同的冗余级别。此默认配置集定义 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 规则,确保没有两个块都存储在同一个机架中。下图显示了此纠删代码分类。
下表列出了支持的纠删代码 profile。
| K | M | 最少的节点数量 | 最小 OSD 数量 | 冗余 | 存储开销 |
|---|---|---|---|---|---|
| 2 | 2 | 4 | 4 (每个节点 1) | 最多 1 个节点 + 1 个 OSD 或最多 2 个 OSD | 200% |
| 2 | 2 | 5 个或更多 | 5 (每个节点 1) | 最多 2 个节点或 OSD 丢失 | 200% |
| 4 | 2 | 7 或更多 | 7 (每个节点 1) | 最多 2 个节点或 OSD 丢失 | 150% |
| 8 | 3 | 12 个或更多 | 12 (每个节点 1) | 最多 3 个节点或 OSD 丢失 | 137.50% |
| 8 | 6 | 4 个或更多 | 16 (每个节点 4) | 丢失最多 1 个节点 + 2 个 OSD 或最多 6 个 OSD | 175% |
12.1.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的数据块的数量。 - 类型
- 字符串
- 必填
- No.
- 默认
-
4K
- crush-device-class
- 描述
-
设备类,如
hdd或ssd。 - 类型
- 字符串
- 必填
- 否
- 默认
-
none,这意味着 CRUSH 使用所有设备,而不需要考虑类型。
- crush-failure-domain
- 描述
-
故障域,如
host或rack。 - 类型
- 字符串
- 必填
- 否
- 默认
-
主机
- key
- 描述
- 剩余的键值对的语义由退出代码插件定义。
- 类型
- 字符串
- 必填
- No.
- --force
- 描述
- 根据同一名称覆盖现有配置集。
- 类型
- 字符串
- 必填
- No.
12.1.2. 删除 OSD erasure-code-profile 复制链接链接已复制到粘贴板!
删除纠删代码配置集:
语法
ceph osd erasure-code-profile rm RULE_NAME
如果这个配置集被池引用,删除会失败。
使用 osd erasure-code-profile rm 命令删除纠删代码 profile 不会自动删除与纠删代码 profile 关联的关联的 CRUSH 规则。红帽建议使用 ceph osd crush rule remove RULE_NAME 命令手动删除关联的 CRUSH 规则,以避免意外行为。
12.1.3. 获取 OSD erasure-code-profile 复制链接链接已复制到粘贴板!
显示纠删代码池配置集:
语法
ceph osd erasure-code-profile get NAME
12.1.4. 列出 OSD erasure-code-profile 复制链接链接已复制到粘贴板!
列出所有纠删代码配置集的名称:
语法
ceph osd erasure-code-profile ls