Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删池或纠删码池。纠删池不能提供副本池的所有功能,但所需的原始存储空间更少。能够存储 1 TB 数据的默认纠删池需要 1.5 TB 原始存储空间。从这方面而言比副本池更好,因为后者需要 2 TB 的原始存储空间才能存储相同的数据量。
有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code。
最简单的纠删码池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。
命令 ceph osd pool create
用于创建类型为纠删的池。12
表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。
root #
ceph osd pool create ecpool 12 12 erasure
pool 'ecpool' created
字符串 ABCDEFGHI
将写入名为 NYAN
的对象。
cephadm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados
命令来访问文件的内容。
root #
rados --pool ecpool get NYAN -
ABCDEFGHI
调用 ceph osd pool create
命令来创建纠删池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k
和 m
的两个参数。k 和 m 定义要将数据片段拆分成多少个块
,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
纠删池配置所需的定义:
如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。
数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2
,则会将一个 10KB 对象分割成 k
个各为 5KB 的对象。
编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。
定义要将块分布到的设备。其值需要设置为某个桶类型。有关所有的桶类型,请参见第 6.2 节 “桶”。如果故障域为机柜
,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。
借助第 9.1 节 “创建示例纠删码池”中所用的默认纠删码配置,当单个 OSD 发生故障时,您将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。这意味着,1 TB 数据需要 1.5 TB 原始存储空间。这相当于常见的 RAID 5 配置。相比之下,副本池需要 2 TB 原始存储空间来存储 1 TB 数据。
可使用以下命令显示默认配置的设置:
root #
ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池。
最重要的几个配置参数是 k
、m
和 crush-failure-domain
,因为它们定义存储开销和数据持久性。例如,如果在丢失两个机柜并且存储开销达到开销的 66% 时,必须能够维系所需的体系结构,您可定义以下配置:
root #
ceph osd erasure-code-profile set myprofile \
k=3 \
m=2 \
crush-failure-domain=rack
对于此新配置,可以重复第 9.1 节 “创建示例纠删码池”中的示例:
root #
ceph osd pool create ecpool 12 12 erasure myprofilecephadm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -root #
rados --pool ecpool get NYAN - ABCDEFGHI
NYAN 对象将分割成三个 (k=3
),并将创建两个额外的块 (m=2
)。m
值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack
将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。
有关纠删码配置的详细信息,请参见 http://docs.ceph.com/docs/master/rados/operations/erasure-code-profile。
纠删码池所需的资源比副本池更多,并且缺少某些功能,例如部分写入。要克服这些限制,建议在纠删码池的前面设置一个快速缓存层。
例如,如果“热存储”池由高速存储设备构成,则可使用以下命令来加速第 9.2 节 “纠删码配置”中创建的“ecpool”:
root #
ceph osd tier add ecpool hot-storageroot #
ceph osd tier cache-mode hot-storage writebackroot #
ceph osd tier set-overlay ecpool hot-storage
这会将用作 ecpool 层的“热存储”池置于写回模式,以便每次在 ecpool 中写入和读取时实际使用的都是热存储,并受益于热存储的灵活性和速度。
使用 FileStore 时,无法在纠删码池中创建 RBD 映像,因为此操作需要部分写入。但是,如果将副本池层设置为快速缓存层,则可以在纠删码池中创建 RBD 映像:
root #
rbd --pool ecpool create --size 10 myvolume
有关快速缓存层的详细信息,请参见第 10 章 “快速缓存分层”。
要将 EC 池标记为 RBD 池,请对其进行相应标记:
root #
ceph osd pool application enable rbd ec_pool_name
RBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本池中。为此,假设您的存储池命名为“rbd”:
root #
rbd create rbd/image_name --size 1T --data-pool ec_pool_name
您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。