适用于 SUSE Enterprise Storage 5

9 纠删码池

Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删池或纠删码池。纠删池不能提供副本池的所有功能,但所需的原始存储空间更少。能够存储 1 TB 数据的默认纠删池需要 1.5 TB 原始存储空间。从这方面而言比副本池更好,因为后者需要 2 TB 的原始存储空间才能存储相同的数据量。

有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code

注意
注意

使用 FileStore 时,除非已配置快速缓存层,否则无法通过 RBD 接口访问纠删码池。有关详细信息或如何使用 Bluestore,请参见第 9.3 节 “纠删码池和快速缓存层”

注意
注意

确保纠删池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 6.3.2 节 “firstn 和 indep”

9.1 创建示例纠删码池

最简单的纠删码池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。

  1. 命令 ceph osd pool create 用于创建类型为纠删的池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。

    root # ceph osd pool create ecpool 12 12 erasure
    pool 'ecpool' created
  2. 字符串 ABCDEFGHI 将写入名为 NYAN 的对象。

    cephadm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
  3. 为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。

  4. 要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。

    root # rados --pool ecpool get NYAN -
    ABCDEFGHI

9.2 纠删码配置

调用 ceph osd pool create 命令来创建纠删池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 km 的两个参数。k 和 m 定义要将数据片段拆分成多少个,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。

纠删池配置所需的定义:

chunk

如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。

k

数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10KB 对象分割成 k 个各为 5KB 的对象。

m

编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。

crush-failure-domain

定义要将块分布到的设备。其值需要设置为某个桶类型。有关所有的桶类型,请参见第 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

选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池。

最重要的几个配置参数是 kmcrush-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 myprofile
cephadm > 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.3 纠删码池和快速缓存层

纠删码池所需的资源比副本池更多,并且缺少某些功能,例如部分写入。要克服这些限制,建议在纠删码池的前面设置一个快速缓存层。

例如,如果热存储池由高速存储设备构成,则可使用以下命令来加速第 9.2 节 “纠删码配置”中创建的ecpool

root # ceph osd tier add ecpool hot-storage
root # ceph osd tier cache-mode hot-storage writeback
root # ceph osd tier set-overlay ecpool hot-storage

这会将用作 ecpool 层的热存储池置于写回模式,以便每次在 ecpool 中写入和读取时实际使用的都是热存储,并受益于热存储的灵活性和速度。

使用 FileStore 时,无法在纠删码池中创建 RBD 映像,因为此操作需要部分写入。但是,如果将副本池层设置为快速缓存层,则可以在纠删码池中创建 RBD 映像:

root # rbd --pool ecpool create --size 10 myvolume

有关快速缓存层的详细信息,请参见第 10 章 “快速缓存分层

9.4 含 RADOS 块设备的纠删码池

要将 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”池中。

打印此页