第 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=2m=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=2m=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=8m=4 的配置集,可以丢失四个(m=4)OSD,这通过在 12 个 (k+m=12) OSD 中分布一个对象实现。Ceph 将对象分成 8 个块,并计算 4 个编码区块以进行恢复。例如,如果对象大小为 8 MB,每个数据块都是 1 MB,每个编码区块的大小也与 1 MB 相同。即使四个 OSD 同时失败,对象也不会丢失。

配置集的最重要参数是 kmcrush-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。

Expand
表 12.1. 支持的纠删代码配置集
KM最少的节点数量最小 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
描述
设备类,如 hddssd
类型
字符串
必填
默认
none,这意味着 CRUSH 使用所有设备,而不需要考虑类型。
crush-failure-domain
描述
故障域,如 hostrack
类型
字符串
必填
默认
主机
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

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部