浅谈Ceph纠删码

目  录
第1章 引言 
1.1 文档说明 
1.2 参考文档 
第2章 纠删码概念和原理 
2.1 概念 
2.2 原理 
第3章 CEPH纠删码介绍 
3.1 CEPH纠删码用途 
3.2 CEPH纠删码库 
3.3 CEPH纠删码数据存储 
3.3.1 编码块读写 
3.3.2 间断全写 
3.4 使用范围 
3.4.1 冷数据 
3.4.2 廉价多数据中心存储 
第4章 CEPH纠删码实例 
4.1 数据读写 
4.2 纠删码池不支持部分功能 
4.3 纠删码PROFILE 
4.4 CECHE TIER弥补ERASURE的缺陷 
第5章 CEPH纠删码和CACHE分层

第1章 引言
1.1 文档说明
对Ceph纠删码进行介绍,包含实例。
1.2 参考文档
Ceph官方文档
http://ceph.com/docs/master/architecture/#erasure-coding
http://ceph.com/docs/master/rados/operations/erasure-code/
http://ceph.com/docs/master/dev/erasure-coded-pool/
RedHat的Inktank Ceph存储新增纠删码、分层部署
http://www.searchstorage.com.cn/showcontent_83783.htm
纠删码:确保RAID失效后的数据可用性
http://storage.it168.com/a2011/0816/1233/000001233286_1.shtml
存储系统中的纠删码(Erasure Codes)
http://www.tuicool.com/articles/v6Bjuq

第2章 纠删码概念和原理
2.1 概念
按照误码控制的不同功能,可分为检错码、纠错码和纠删码等。
检错码仅具备识别错码功能 而无纠正错码功能;
纠错码不仅具备识别错码功能,同时具备纠正错码功能;
纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时可把无法纠错的信息删除。
2.2 原理
比如  K=3  M=2  K+M=5
这个意思是:
K原始数据盘个数或恢复数据需要的磁盘个数
M校验盘个数或允许出故障的盘个数
使用编码算法,通过K个原始数据生成K+M个新数据
通过任何K个新数据都能还原出原始的K个数据
即允许M个数据盘出故障,数据仍然不会丢失;

第3章 Ceph纠删码介绍
Ceph纠删码即Ceph Erasure。
3.1 Ceph纠删码用途
用更少的空间实现存储,即节约空间;
纠删码实现了高速的计算,但有2个缺点,一个是速度慢,一个是只支持对象的部分操作(比如:不支持局部写)。纠删码的缺点现在已经有解决办法。
3.2 Ceph纠删码库
Ceph的默认纠删码库是Jerasure,即Jerasure库;
当管理员创建一个erasure-coded后端时,可以指定数据块和代码块参数。
Jerasure库是第三方提供的中间件。
Jerasure库可以在外网上搜索到。
Ceph环境安装时,已经默认安装了Jerasure库。
3.3 Ceph纠删码数据存储
在erasure coded pool中,每个数据对象都被存放在K+M块中。对象被分成K个数据库和M个编码块;erasure coded pool的大小被定义成K+M块,每个块存储在一个OSD中;块的顺序号作为object的属性保存在对象中。
3.3.1 编码块读写
例如:创建5个OSDs (K=3 M=2)的erasure coded pool,允许损坏2个(M = 2);
对象 NYAN 内容是 ABCDEFGHI ;
NYAN写入pool时,纠删码函数把NYAN分3个数据块:第1个是ABC,第2个是DEF,第3个是GHI;如果NYAN的长度不是K的倍数,NYAN会被填充一些内容;
纠删码函数也创建2个编码块:第4个是YXY,第5个是GQC;

每个块都被存储在osd中;对象中的块有相同的名字 (NYAN)但存储在不通的osd中。除了名字外,这些块都有一个序号,需要保存在对象属性中 (shard_t)
比如,块1包含ABC保存在OSD5中;块4包含YXY保存在OSD3中。
当从erasure coded pool中读取对象NYAN时,纠删码函数读取3个块:块1(ABC)/块3(GHI)/块4(YXY);然后重建原始对象内容ABCDEFGHI;
纠删码函数被告知:块2和块5丢失;块5不能读取是因为OSD4损坏了;块3不能读取,是因为OSD2太慢了。

3.3.2 间断全写
在erasure coded pool中,主OSD负责所有的写操作;它负责K+M块的编码,并写到其他OSD中。它还负责维护一个权威的pg log版本。
下图中,一个erasure coded是K=2/M=1,3个OSD节点,2个是K的节点,1个是M的节点;pg分别在OSD1/OSD2/OSD3中;
一个对象被编码保存在这些OSD中:
块D1v1(数据块1,版本1)在OSD1中;
块D2v1(数据块2,版本1)在OSD2中;
块C1v1(编码块1,版本1)在OSD3中;
在每个OSD中的PG log是一致的(1,1 是epoch 1, version 1);

OSD1是主节点,接收客户端的WRITE FULL请求,即全部重写对象,而不是部分的替换;
创建了Version 2 (v2)对象去替换version 1 (v1)对象;
主节点OSD1负责编码写入3个块: 
块D1v2 (数据块1 版本2)在OSD1中;
块D2v2 (数据块2 版本2)在OSD2中;
块C1v2 (编码块1 版本2)在OSD3中;
每个块都被写到目标OSD中,包括主OSD节点;主OSD节点负责存储块,并且负责维护一个权威的PG log版本;
当OSD接到写入块的指令时,它也创建一个PG log作为回应;
例如, 只要OSD3存储C1v2,它就添加一个条目1,2 ( i.e. epoch 1, version 2 )到log中;
因为OSD工作是异步的,一些块可能还在写入 (比如 D2v2 ),但其他块已经写入完成并返回相应了 (比如 C1v1 and D1v1).


如果一切正常,每一个OSD上的块都写入成,则log的last_complete指针从1,1 改为1,2。


最后,保存以前版本块的文件将会被删除: D1v1 on OSD1, D2v1on OSD2 and C1v1 on OSD3。


但是意外有时也会发生。如果OSD1损坏了,而D2v2还在写入,则object的version 2 就是局部写入: OSD3有一个块但是不够恢复其他块。丢失了2个块: D1v2 和D2v2,可是the erasure coding参数是K=2/M=1,要求至少2个块可用才能重建第3个块。 这时,OSD4成为主节点,并发现last_complete log记录是1,1 ,这将是新权威的记录头。


节点OSD3中的Log记录1,2和节点OSD4中新的权威log记录不一致:OSD3中的Log被丢弃,C1v2块被删除。D1v1块被重建(在scrubbing时使用纠删码函数重建)并保存到新的主节点OSD4中。


3.4 使用范围
3.4.1 冷数据
1、主要存储1G以上的对象,比如镜像、映像等,这些数据10%都是每月读取一次;
2、新对象每天添加,但是这些对象添加后不修改;
3、这些数据,平均读1万次,写一次。
4、创建一个replicated pool作为erasure coded pool的ceche分层;当一个对象一周没有访问时,可以把该对象降级(把该对象从replicated pool移动到erasure-coded pool中);当然也可以相反的调整;
5、erasure-coded pool为冷数据设计,适合慢的硬件设备,访问比较少的数据;replicated pool为快速设备和快速访问设计的。
3.4.2 廉价多数据中心存储
十个专用网络链接的数据中心,每个数据中心包含相同大小的存储空间,但没有电源备份和无空气冷却系统。
创建这样一个erasure-coded pool,同时允许3个节点损坏而数据不丢失;数据块为6(K=6),而编码块为3(M=3);其开销是50%
而创建同样的复制池,其开销为400%(4个副本);

第4章 Ceph纠删码实例
Ceph pool要保证部分osd损坏时数据不丢失(一般情况下一个disk设置为一个osd);默认情况下创建pool时rule类型选择replicated,即object在多个disk中拷贝保存;pool的另一种rule类型是erasure,这种pool可以节省空间;
最简单的erasure coded pool等价与RAID5;要求至少3个节点;即k=2 m=1 默认的erasure就是这种情况
$ ceph osd pool create ecpool 18 12 erasure
其中:18是pgp_num 12是pg_num(pgp_num必须大于pg_num)
4.1 数据读写
读写字符串ABCDEFGHI
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
读写文件test.txt
rados -p ecpool put test test.txt
rados -p ecpool get test file.txt
4.2 纠删码池不支持部分功能
比如不支持“部分写”
不支持rbd创建镜像
# rbd create xxx -p ecpool --size 1024
rbd: create error: (95) Operation not supported
librbd: error adding image to directory: (95) Operation not supported
# rbd import secureCRT5.rar secureCRT5 -p ecpool
rbd: image creation failed
Importing image: 0% complete...failed.
librbd: error adding image to directory: (95) Operation not supported
rbd: import failed: (95) Operation not supported
4.3 纠删码profile
1、 默认profile
默认的erasure code profile允许有一个OSD损坏;它等价于2个备份节点的replicated pool;相当于erasure pool用1.5TB代替replicated pool用 2TB存储1TB数据。
$ ceph osd erasure-code-profile ls
$ ceph osd erasure-code-profile get default
结果显示如下,最小的erasure pool 类型
directory=/usr/lib/ceph/erasure-code
k=2
m=1
plugin=jerasure
technique=reed_sol_van
2、 添加profile
创建pool时选择合适的profile是很重要的,因为pool创建后就不能修改了;如果两个pool的profile不同,则创建新pool时,则所有的object都要从旧pool中移动到新pool。
Profile最重要的参数是K/M和ruleset-failure-domain,因为他们定义的存储开销和数据持久性。
例如:我们想构建这样的一种架构,允许2个disk损坏,存储开销损失40%,那么我们可以这样创建profile
$ ceph osd erasure-code-profile set myprofile \
   k=3 \
   m=2 \
   ruleset-failure-domain=rack
注: ruleset-failure-domain有osd, host, chassis, rack, row等选项
ruleset-failure-domain=rack表示:该CRUSH规则确保2个块不存储在同一个机架rack上。 
3、 根据profile创建erasure pool
$ ceph osd pool create ecpool 12 12 erasure myprofile
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
4、 删除profile
$ ceph osd erasure-code-profile rm profile
4.4 Ceche tier弥补erasure的缺陷
和replicated pools相比,erasure pool需要更多的资源,并且缺少一些功能(比如部分写);为了克服这些局限性,建议在erasure pool上添加一个ceche tier层。ceche tier能解决erasure pool缺失功能的问题,也能解决erasure pool性能低的问题。
这就是radhat的ice现在炒作的纠删码、存储分层。
假设hot-storage是一个快速存储池,即是一个快速的replicated pools。具体命令如下:
$ ceph osd pool create ecpool 12 12 erasure (这就是我们的erasure pool k=2 m=1)
$ ceph osd pool create hot-storage 128 (这个就是我们的cache tier,它是高速的)
$ ceph osd tier add ecpool hot-storage
$ ceph osd tier cache-mode hot-storage writeback
$ ceph osd tier set-overlay ecpool hot-storage
以writeback模式把hot-storage pool作为ecpool 的tier,这样对ecpool的读写实际上使用的是hot-storage pool,并且能用到hot-storage pool的灵活性和速度。
由于erasure不支持部分写,故在ecpool中无法创建RBD image;设置了erasure pool的tier分层pool后,就可以创建在ecpool创建RBD image了。(没有添加ceche tier时,无法用rbd创建镜像,前边已经提过)。
rbd --pool ecpool create --size 10 myvolume
rbd import 1.txt 1.txt  -p ecpool
rbd ls -p ecpool
说明:操作ecpool和hot-storage效果一样,但是实际数据存放的位置,根据情况而定:1周以上不使用,则存放在ecpool,经常使用,则存放在hot-storage。

第5章 Ceph纠删码和Cache分层
纠删码和Cache分层是两个紧密联系的功能。这2个功能是redhat收购Ceph后一直重视的功能。
纠删码提高了存储容量,却降低了速度;而Cache分层刚好解决了这个问题;
原理架构如下:

时间: 2024-10-13 18:33:17

浅谈Ceph纠删码的相关文章

Ceph纠删码编码机制调研

1 Ceph简述 Ceph是一种性能优越,可靠性和可扩展性良好的统一的分布式云存储系统,提供对象存储.块存储.文件存储三种存储服务.Ceph文件系统中不区分节点中心,在理论上可以实现系统规模的无限扩展.Ceph文件系统使用了较为简单的数据地址管理方法,通过计算的方式直接得到数据存放的位置.其客户端程序只需要根据数据ID经过简单的计算就可以决定数据存放的位置. 2 存储容错机制简述 2.1 副本冗余容错机制 基于副本冗余的容错机制是将原始数据复制成多份,每一份称为一个副本.将这些副本分别存放在集群

分布式系统下的纠删码技术(一) -- Erasure Code (EC)

近几个月主要参与一个分布式存储系统的纠删码部分(用于数据容错),纠删码在学术界出现比较早,现在ceph,微软的存储系统,Hadoop 3.0等都用了EC.文章会分为多篇,主要将Erasure Code,LRC,  以及相关的数学基础,作为学习总结. 一.纠删码简介 分布式系统需要在硬件失效等故障发生后仍然能继续提供服务.就数据而言,HDFS采用每份数据3副本的方式,保证某些数据损失之后仍能继续使用. 数据的容错除了副本还有另一种做法,就是把丢失的数据计算出来.这就是纠删码的思想了.(PS: Sp

MICS:副本和纠删码混合存储系统

摘要 云存储系统的三个指标: 高可靠性,低存储开销,高读写性能. 这三个指标是没有办法同一时候满足的,许多时候须要进行tradeoff. 副本系统和纠删码是两种在存储系统中广泛使用的策略,它们在保证高可靠性的前提下,选择了不同极端的tradeoff. 副本存储开销大,但性能较好.纠删码存储开销低.但性能较差.本文提出了MICS系统.它将一个对象以两种形式存储,一种採用副本.一种採用分片纠删码,不仅如此.还设计了针对这种hyprid结构的精细的读写协议. 在服务使用者的角度.MICS通过PRAM一

实现高性能纠删码引擎 | 纠删码技术详解(下)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎.柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统. 前言: 在上篇<如何选择纠删码编码引擎>中,我们简单了解了 Reed-Solomon Codes(RS 码)的编/解码过程,以及编码引擎的评判标准.但并没有就具体实现进行展开,本篇作为<纠删码技术详解>的下篇,我们将主要探讨工程实现的问题. 这里先简单提炼一下实现高性能纠删码引擎的要点:首先,根据编码理论将矩阵以及有限域的运算工程化,接下来主

[转]Reed Solomon纠删码

http://peterylh.blog.163.com/blog/static/12033201371375050233/ 纠删码是存储领域常用的数据冗余技术, 相比多副本复制而言, 纠删码能够以更小的数据冗余度获得更高数据可靠性. Reed Solomon Coding是存储领域常用的一种纠删码,它的基本原理如下:  给定n个数据块d1, d2,..., dn,n和一个正整数m, RS根据n个数据块生成m个校验块, c1, c2,..., cm.  对于任意的n和m,  从n个原始数据块和m

Hadoop 3.0 Erasure Coding 纠删码功能预分析

前言 HDFS也可以支持Erasure Coding功能了,将会在Hadoop 3.0中发布,可以凭图为证: 在HDFS-7285中,实现了这个新功能.鉴于此功能还远没有到发布的阶段,可能后面此块相关的代码还会进行进一步的改造,因此只是做一个所谓的预分析,帮助大家提前了解Hadoop社区目前是如何实现这一功能的.本人之前也没有接触过Erasure Coding技术,中间过程也确实有些偶然,相信本文可以带给大家收获. 巧遇Hadoop 3.0 Erasure Coding 第一次主动去了解eras

如何选择纠删码编码引擎 | 纠删码技术详解(上)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎.柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统. 前言:随着数据的存储呈现出集中化(以分布式存储系统为基础的云存储系统)和移动化(互联网移动终端)的趋势,数据可靠性愈发引起大家的重视.集群所承载的数据量大大上升,但存储介质本身的可靠性进步却很小,这要求我们必须以更加经济有效的方式来保障数据安全. 副本与纠删码都是通过增加冗余数据的方式来保证数据在发生部分丢失时,原始数据不发生丢失.但相较于副本,纠删码能以

纠删码简要介绍(与纠错码的区别)

存储领域来看,数据冗余机制其实这几十年来没有太多进展,RAID,副本一直是当仁不让的最终选择.而近几年,尤其是规模较大的应用场景下,纠删码越来越多的出现在选择的视野范围,成为RAID,副本之外的第三种选择,因此也获得了越来越多的关注. 纠删码(Erasure Code)本身是一种编码容错技术,最早是在通信行业解决部分数据在传输中损耗的问题,它的基本原理是把传输的信号分段,加入一定的校验再让各段间发生一定的联系,即使在传输过程中丢失掉部分信号,接收端仍然能通过算法把完整的信息计算出来.如果严格的区

浅谈存储重删压缩之三netapp的逆袭

浅谈存储重删压缩之三netapp的优化 摘要:上一期我们回顾了HDS硬盘压缩以及EMC在老架构上改进的设计,本期我们主要来看看命运多舛的Netapp如何更新自己的重删压缩. 谢谢大家的关注和支持,欢迎转载,转载请注明出处. 欢迎大家关注"new_storage" Netapp重删压缩的历史 Netapp实现重删压缩很早,造2010年之前,netapp的NAS设备已经具备了重删压缩的能力.当时全球市场一直将重心放在HDD存储,而netapp实现重删压缩也很能理解,当时有很多温冷数据存储在