搜索

第 5 章 纠删代码池概述

download PDF

Ceph 默认使用复制池,这意味着 Ceph 将每个对象从 Primary OSD 节点复制到一个或多个次要 OSD。纠删代码(erasure-coded)池可以减少确保数据持久性所需的磁盘空间量,但它的计算比复制要高得多。

Ceph 存储策略涉及定义数据持久性要求。数据持久性意味着,在丢失一个或多个 OSD 时可以保持数据不会丢失。

Ceph 在池中存储数据,其中有两种池类型:

  • 复制
  • 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 7 架构指南中的 Ceph Erasure Coding 部分。

Ceph 在使用 k=2m=2 初始化集群时 会创建一个默认 纠删代码配置集,这意味着 Ceph 将通过三个 OSD (k+m == 4)分散对象数据,Ceph 可以在不丢失数据的情况下丢失其中一个 OSD。要了解有关纠删代码性能分析的更多信息,请参阅 Erasure Code Profiles 部分。

重要

.rgw.buckets 池配置为纠删代码,所有其他 Ceph 对象网关池都复制,否则尝试创建新存储桶失败,并显示以下错误:

set_req_state_err err_no=95 resorting to 500

这样做的原因是,纠删代码池不支持 omap 操作,某些 Ceph Object Gateway 元数据池需要 omap 支持。

5.1. 创建纠删代码池示例

创建纠删代码池并指定放置组。ceph osd pool create 命令会创建一个带有 default 配置集的纠删代码池,除非指定了另一个配置集。配置集通过设置两个参数 km 来定义数据的冗余性。这些参数定义数据被分割的区块数量,并创建编码区块数量。

最简单的纠删代码池等同于 RAID5,且至少需要四个主机。您可以创建一个带有 2+2 配置集的纠删代码池。

流程

  1. 在带有 2+2 配置的四个节点上为纠删代码池设置以下配置。

    语法

    ceph config set mon mon_osd_down_out_subtree_limit host
    ceph config set osd osd_async_recovery_min_cost 1099511627776

    重要

    通常不需要纠删代码池。

    重要

    async 恢复成本是副本后面的 PG 日志条目数以及缺失的对象数量。osd_target_pg_log_entries_per_osd30000。因此,具有单个 PG 的 OSD 可能具有 30000 条目。由于 osd_async_recovery_min_cost 是 64 位整数,因此将带有 2+2 配置的 EC 池的 osd_async_recovery_min_cost 的值设置为 1099511627776

    注意

    对于具有四个节点的 EC 集群,K+M 的值为 2+2。如果节点完全失败,它不会恢复为四个块,且只有三个节点可用。当您将 mon_osd_down_out_subtree_limit 的值设置为 host 时,它会在主机停机场景中阻止 OSD 标记为 out,因此防止数据重新平衡,并等待节点再次启动。

  2. 对于带有 2+2 配置的纠删代码池,请设置配置集。

    语法

    ceph osd erasure-code-profile set ec22 k=2 m=2 crush-failure-domain=host

    Example

    [ceph: root@host01 /]# ceph osd erasure-code-profile set ec22 k=2 m=2 crush-failure-domain=host
    
    Pool : ceph osd pool create test-ec-22 erasure ec22

  3. 创建纠删代码池。

    Example

    [ceph: root@host01 /]# ceph osd pool create ecpool 32 32 erasure
    
    pool 'ecpool' created
    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
    $ rados --pool ecpool get NYAN -
    ABCDEFGHI

    32 是放置组的数量。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.