目  录
第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;

浅谈Ceph纠删码-LMLPHP

每个块都被存储在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太慢了。

浅谈Ceph纠删码-LMLPHP

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);

浅谈Ceph纠删码-LMLPHP

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).

浅谈Ceph纠删码-LMLPHP
如果一切正常,每一个OSD上的块都写入成,则log的last_complete指针从1,1 改为1,2。

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

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

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

浅谈Ceph纠删码-LMLPHP
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分层刚好解决了这个问题;
原理架构如下:

浅谈Ceph纠删码-LMLPHP

05-11 11:18