跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Enterprise Storage 7 文档 / 操作和管理指南 / 在集群中存储数据 / 纠删码存储池
适用范围 SUSE Enterprise Storage 7

19 纠删码存储池

Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。

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

有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值

19.1 纠删码存储池的先决条件

要使用纠删码,您需要:

  • 在 CRUSH 索引中定义纠删码规则。

  • 定义指定要使用的编码算法的纠删码配置。

  • 创建使用上述规则和配置的存储池。

请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。

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

19.2 创建示例纠删码存储池

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

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

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

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

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

    cephuser@adm > rados --pool ecpool get NYAN -
    ABCDEFGHI

19.3 纠删码配置

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

纠删池配置所需的定义:

chunk

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

k

数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_sizek + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。

m

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

crush-failure-domain

定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。

使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。

可使用以下命令显示默认配置的设置:

cephuser@adm > ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van

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

最重要的几个配置参数是 kmcrush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:

cephuser@adm > ceph osd erasure-code-profile set myprofile \
   k=3 \
   m=2 \
   crush-failure-domain=rack

对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:

cephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
cephuser@adm > rados --pool ecpool get NYAN -
ABCDEFGHI

NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。

Image

19.3.1 创建新纠删码配置

以下命令可创建新纠删码配置:

root # ceph osd erasure-code-profile set NAME \
 directory=DIRECTORY \
 plugin=PLUGIN \
 stripe_unit=STRIPE_UNIT \
 KEY=VALUE ... \
 --force
DIRECTORY

可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code

PLUGIN

可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“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”。

KEY=VALUE

专用于选定纠删码插件的选项键/值对。

--force

可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。

19.3.2 删除纠删码配置

以下命令可按 NAME 所标识的纠删码配置删除相应配置:

root # ceph osd erasure-code-profile rm NAME
重要
重要

如果某个存储池引用了该配置,则删除将会失败。

19.3.3 显示纠删码配置的详细信息

以下命令可按 NAME 所标识的纠删码配置显示其详细信息:

root # ceph osd erasure-code-profile get NAME

19.3.4 列出纠删码配置

以下命令可列出所有纠删码配置的名称:

root # ceph osd erasure-code-profile ls

19.4 标记含 RADOS 块设备的纠删码存储池

要将 EC 池标记为 RBD 池,请对其进行相应标记:

cephuser@adm > ceph osd pool application enable rbd ec_pool_name

RBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:

cephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name

您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。