第 5 章 纠删代码池概述
Ceph 存储策略涉及定义数据持久性要求。数据持久性意味着,在丢失一个或多个 OSD 时可以保持数据不会丢失。
Ceph 在池中存储数据,其中有两种池类型:
- 复制
- erasure-coded
Ceph 默认使用复制池,这意味着 Ceph 将每个对象从 Primary OSD 节点复制到一个或多个次要 OSD。
纠删代码(erasure-coded)池可以减少确保数据持久性所需的磁盘空间量,但它的计算比复制要高得多。
纠删代码是一种在 Ceph 存储群集中存储对象的方法,即:该算法将对象分割为数据区块(k
)和编码区块(m
),并将这些区块存储在不同的 OSD 中。
如果 OSD 失败,Ceph 会从其他 OSD 检索剩余的数据(k
)和编码(m
)块,以及纠删代码算法从这些块中恢复对象。
红帽建议 min_size
用于纠删代码池为 K+1
或更高版本,以防止丢失写入和数据。
纠删代码使用存储容量比复制更高效。n-replication 方法维护对象的 n
个副本(在 Ceph 中默认为 3x),而区块则仅维护 k
+ m
个区块。例如,3 个数据和 2 个编码区块使用 1.5 倍的原始对象的存储空间。
纠删代码使用比复制少的存储开销,但纠删代码池使用的内存比访问或恢复对象时使用的 CPU 数要多。当数据存储需要具有持久性和容错能力,但不需要快速读取性能(如冷存储、历史记录等)时,擦除代码具有优势。
有关纠删代码如何在 Ceph 中工作的信息,请参阅 Red Hat Ceph Storage 6 架构指南中的 Ceph Erasure Coding 部分。
Ceph 在使用 k=2 和 m=2 初始化集群时 会创建一个默认 纠删代码 profile,这意味着 Ceph 将对象数据分散到四个 OSD (k+m == 4),Ceph 可以在不丢失数据的情况下丢失其中一个 OSD。要了解有关纠删代码性能分析的更多信息,请参阅 Erasure Code Profiles 部分。
将 .rgw.buckets
池配置为纠删代码,所有其他 Ceph 对象网关池都复制,否则尝试创建新存储桶失败,并显示以下错误:
set_req_state_err err_no=95 resorting to 500
set_req_state_err err_no=95 resorting to 500
这样做的原因是,纠删代码池不支持 omap
操作,某些 Ceph Object Gateway 元数据池需要 omap
支持。
5.1. 创建纠删代码池示例 复制链接链接已复制到粘贴板!
ceph osd pool create
命令创建一个带有 default 配置集的纠删代码池,除非指定了另一个配置集。配置集通过设置两个参数( k
和 m
)来定义数据的冗余性。这些参数定义数据分割的块数量,并创建编码区块的数量。
最简单的纠删代码池等同于 RAID5,且至少需要三个主机:
示例
ceph osd pool create ecpool 32 32 erasure echo ABCDEFGHI | rados --pool ecpool put NYAN - rados --pool ecpool get NYAN -
$ ceph osd pool create ecpool 32 32 erasure
pool 'ecpool' created
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHI
pool create
中的 32 代表放置组数量。