第 5 章 纠删代码池
Ceph 存储策略涉及定义数据持久性要求。数据持久性意味着能够在不丢失数据的情况下持续丢失一个或多个 OSD。
Ceph 将数据存储在池中,池中有两种类型的池:
- 复制
- erasure-coded
Ceph 默认使用复制池,即 Ceph 将Primary OSD 节点的每个对象复制到一个或多个次要 OSD。
纠删代码池减少了确保数据持久性所需的磁盘空间量,但在计算上比复制成本高一些。
纠删代码是一种在 Ceph 存储群集中持久存储对象的方法,其中纠删代码算法会将对象分解为数据区块(k)和编码区块(m),并将这些区块存储在不同的 OSD 中。
如果 OSD 出现故障,Ceph 会从其他 OSD 检索剩余的数据(k)和编码(m)区块,并且纠删代码算法从这些区块中恢复对象。
红帽建议使用 min_size 使纠删代码池为 K+2 或更多,以防止丢失写入和数据。
纠删代码比复制更高效地使用存储容量。n 复制方法维护对象的 n 副本(Ceph 中默认为 3x),而纠删代码仅维护 k + m 块。例如: 4 数据和 2 编码区块使用原始对象的存储空间 1.5x。
虽然纠删代码使用的存储开销比复制少,但纠删代码算法在访问或恢复对象时所用的 RAM 和 CPU 数量要多于复制。当数据存储必须具有持久性和容错能力但不需要快速读取性能(如冷存储和历史记录等)时,纠删代码具有优势。
有关 Ceph 中纠删代码如何工作的数学和详细说明,请参见 《红帽 Ceph 存储 4 架构指南 》中的纠删代码 I/O 部分。
在初始化具有 k=2 和 m=1 的群集时,Ceph 会创建一个 默认的 纠删代码 profile。这意味着 Ceph 会将对象数据分散到三个 OSD(k+m == 3),Ceph 可以在不丢失数据的情况下丢失其中一个 OSD。要了解更多有关纠删代码性能分析的信息,请参阅 Erasure Code Profiles 部分。
仅将 .rgw.buckets 池配置为纠删代码池和所有其他 Ceph 对象网关池复制,否则尝试创建新存储桶会失败并显示以下错误:
set_req_state_err err_no=95 resorting to 500
其原因在于纠删代码池不支持 omap 操作,而某些 Ceph 对象网关元数据池需要支持 omap。
5.1. 创建示例纠删代码池 复制链接链接已复制到粘贴板!
最简单的纠删代码池等同于 RAID5,至少需要三个主机:
$ ceph osd pool create ecpool 50 50 erasure
pool 'ecpool' created
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHI
池 create 中的 50 代表 PG 的数量。