浅谈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分层刚好解决了这个问题;
原理架构如下:
浅谈Ceph纠删码的更多相关文章
- Ceph纠删码编码机制
1 Ceph简述 Ceph是一种性能优越,可靠性和可扩展性良好的统一的分布式云存储系统,提供对象存储.块存储.文件存储三种存储服务.Ceph文件系统中不区分节点中心,在理论上可以实现系统规模的无限扩展 ...
- Ceph的正确玩法之Ceph纠删码理论与实践
http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...
- Ceph 纠删码介绍
http://ceph.org.cn/2016/08/01/ceph-%E7%BA%A0%E5%88%A0%E7%A0%81%E4%BB%8B%E7%BB%8D/
- ceph之纠删码
转自:http://m.blog.csdn.net/blog/skdkjxy/45695355 一.概述 按照误码控制的不同功能,可分为检错码.纠错码和纠删码等. 检错码仅具备识别错码功能 而无纠正错 ...
- ceph 004 纠删码池 修改参数 cephx认证
复习ceph003 存储池为逻辑概念,存储池可以占用整个集群的所有空间 [root@ceph01 ~]# ceph osd pool create pool1 pool 'pool1' created ...
- RS(纠删码)技术浅析及Python实现
前言 在Ceph和RAID存储领域,RS纠删码扮演着重要的角色,纠删码是经典的时间换空间的案例,通过更多的CPU计算,降低低频存储数据的存储空间占用. 纠删码原理 纠删码基于范德蒙德矩阵实现,核心公式 ...
- [转]Reed Solomon纠删码
[转]Reed Solomon纠删码 http://peterylh.blog.163.com/blog/static/12033201371375050233/ 纠删码是存储领域常用的 ...
- 应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
本文由云+社区发表 做为大数据生态系统中最重要的底层存储文件系统HDFS,为了保证系统的可靠性,HDFS通过多副本的冗余来防止数据的丢失.通常,HDFS中每一份数据都设置两个副本,这也使得存储利用率仅 ...
- Erasure Coding(纠删码)深入分析
http://blog.sina.com.cn/s/blog_57f61b490102viq9.html 1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是 ...
随机推荐
- Confluence5.6.6安装和破解
1.安装confluence 1. 软件环境说明 # 安装 jdk [root@wiki_5-- jar]# cat /etc/redhat-release CentOS Linux release ...
- 在windowx的Hyper-v 安装CentOS系统
博客写的很少,一方面是因为我觉得目前很多博客都是相互抄袭,或者有很多部分都是重复的内容.而我自己再去写同样的内容的画,有点浪费时间. 所以,如果我要写,我希望是写一些与众不同,或者重复率比较低的内容, ...
- Java 中的字符串(String)与C# 中字符串(string)的异同
1. C# 中比较两个字符串字面量是否相等,可以使用 “==”比较运算符,是因为string 类型重写(override)了“==” 和 “!=” 运算符,在使用“==” 和 “!=” 进行字符串比较 ...
- CSS属性过滤
在前端领域,当我们想在ie6及以下版本和标准浏览器的样式不同我们怎么做呢 此时此刻不得不提到过滤器:即一种对特定浏览器显示和隐藏规则的声明方法 1.下划线属性过滤器 符合标准的浏览器都会忽略这个声明, ...
- flask模板语言 jinja2 以及render_template 深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- 跟我学SpringCloud | 第十三篇:Spring Cloud Gateway服务化和过滤器
SpringCloud系列教程 | 第十三篇:Spring Cloud Gateway服务化和过滤器 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich. ...
- C#中产生SQL语句的几种方式
(1)拼接产生SQL语句: string sql = "insert into czyb(yhm,mm,qx) values('" + txtName.Text + "' ...
- C++学习书籍推荐《Effective C++ 第三版(英文)》下载
百度云及其他网盘下载地址:点我 作者简介 Scott Meyers is one of the world's foremost authorities on C++, providing train ...
- mplayer+ffmpeg 组合截图
mplayer截图的优点:对于一个时长很长的视频,可以任意指定一个时间点截图,mplayer会直接跳到这个时间点开始解码截图: 缺点:由于是直接跳到指定的时间点,也就是直接跳过了之前的帧,这样解码出来 ...
- 【AI】Android Pie中引入的AI功能
前言 “无AI,不未来”,绝对不是一句豪情壮语,AI早已进入到了我们生活当中.去年Google发布的Android Pie系统在AI功能方面就做了重大革新,本文就对Google在新系统中引入的AI功能 ...