分享

Ceph 纠删码介绍

 waston 2019-03-04
本文由Ceph中国社区-火鸾翻译、小猴子校稿  英文出处:Ceph Erasure Coding Introduction 欢迎加入CCTG

Ceph介绍

Ceph 是一个运行在通用硬件平台上的、拥有高度扩展能力的软件定义存储开源项目。Ceph 可以在单个软件平台上同时支持对象、块、文件系统,并具有自动管理、自动修复、无单点故障等特性。由于其高可扩展性的软件定义存储架构,Ceph 不仅成为了传统存储的理想替代品,而且是云计算环境中的对象、块存储的有力解决方案。

Ceph 起源于 Sage Weil 在 2004 年 6 月份的一篇博士学术论文。虽然目前 Ceph 已经被 Redhat 收购,但其仍然保持开源。并且 Ceph 社区也非常活跃。(Ceph Github

下面是 Ceph 的架构图,其核心为 RADOS(resilient automatic distributed object storage)。基于 RADOS, Ceph 提供了大量的接口:

  • LibRADOS:是 Ceph 的原生 API,包括读、写、追加和截断等。

  • RGW:是 Ceph 对象存储的 RESTful API,兼容 Swift 和 S3。

  • RBD:是 Ceph 的块存储 API,目前它的驱动已经移植到了 linux 内核,它也为 QEMU 提供了驱动支持。

  • CephFS:是 Ceph 文件系统的 API,支持 POSIX 协议。

以上的这些接口都是基于 RADOS 协议实现的,所以它们就相当于 RADOS 的‘客户端’。

rados

纠删码介绍

纠删码理论始于 20 世纪 60 年代。最著名的算法是 Reed-Solomon。随着时间的推移,出现了很多基于其的变化版本,比如 Fountain Codes, Pyramid Codes 和 Local Repairable Codes 等。

纠删码通常需要定义一个磁盘的总数(N),数据盘的数量(K),这样的配置下最多可以容忍 N – K 的磁盘故障。

比如一个典型的 Reed Solomon 方案(8,5),8 是磁盘的总数,5 是数据盘的个数。在这样的场景中,数据在磁盘中的分布大概像这样:

data

RS (8,5) 可以容忍任意 3 块磁盘的故障。如果某些数据块丢失,可以通过剩下的可用数据恢复出原始的内容。

在云存储中,我们通常会使用副本的方式来保证系统的可用性。问题是当存储达到 PB 级别后要求的容量将会非常高。通过使用纠删码技术可以在保证相同可用性的情况下,节省大量存储空间,从而大大的降低 TCO(总体成本)。Ceph 从 Firefly 版本开始支持纠删码。

实现方法

Ceph 通常的读/写流程(副本):

rw01

在使用纠删码的情况下,读/写流程发生了改变:

纠删码写:

数据将在主 OSD 进行编码然后分发到相应的 OSDs 上去。

w02

纠删码读:

从相应的 OSDs 中获取数据后进行解码。

r02

如果此时有数据丢失,Ceph 会自动从存放校验码的 OSD 中读取数据进行解码。

r03

目前建议仅在对象存储模式中使用纠删码。对于文件系统及块存储,由于性能的问题 Ceph 不建议使用纠删码。

现在在 Ceph 中存在各种不同的纠删码插件:Jerasure,ISA-l 和 LRC。

Jerasure 是由 Prof. James Plank 开发的一个开源EC库,它被用于很多的 EC 环境中,并且性能表现不错。

ISA-l 针对使用某些定制化指令集的英特尔平台进行了一些优化,目前也是开源的。

LRC 和 Jerasure、ISA-l 属于不同的层面,因为它可以使用 Jerasure 或 ISA-l 作为后端编码/解码库。

在Ceph中怎样使用纠删码功能

Ceph 在存储池级别使用纠删码。创建存储池时需要设置各种纠删码参数。比如:

1
2
3
4
5
6
7
8
9
10
11
ceph osd pool create poolname test_pool \
  erasure-code-directory=<dir>         \ # mandatory
  erasure-code-plugin=jerasure         \ # mandatory
  erasure-code-m=1                    \ # optional and plugin dependant
  erasure-code-k=2                    \ # optional and plugin dependant
  erasure-code-technique=reed_sol_van  \ # optional and plugin dependant

存储在该池中的所有对象都会参与编码。但是这一切对于客户端是透明的、无法感知的。

目前 Ceph 提供了自己的 EC 插件管理系统,这样在将来增加更多的 EC 插件会变得十分容易。这些接口的定义如:

1
2
3
4
set<int> minimum_to_decode(const set<int> &want_to_read, const set<int> &available_chunks)
set<int> minimum_to_decode_with_cost(const set<int> &want_to_read, const map<int, int> &available)
map<int, buffer> encode(const set<int> &want_to_encode, const buffer &in)
map<int, buffer> decode(const set<int> &want_to_read, const map<int, buffer> &chunks)

如果你的 EC 插件支持以上的接口,你就可以很容易的加载它们。

Ceph 通过一个 EC 配置文件对纠删码的参数进行简单的管理:

1
2
3
4
5
6
7
ceph osd erasure-code-profile set {name} \
        [{k=data-chnks}] \
        [{m=coding-chunks}] \
        [{directory=directory}] \
        [{plugin=plugin}] \
        [{key=value}..] \
        [--force]

通过一个 EC 配置文件可以很容易的创建一个纠删码存储池:

1
ceph osd pool create ecpool PG_NUM PGP_NUM erasure ecprofle

参考文献:

Ceph 官网

Inktank – Ceph 的专业支持服务

Inktank – Ceph 参考架构

Inktank Ceph Enterprise (ICE)

Ceph 官方文档

开始使用 Ceph

Ceph 高级特性

Ceph 概览

Ceph 和 Openstack

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多