ceph之纠删码

转自:http://m.blog.csdn.net/blog/skdkjxy/45695355

一、概述

  按照误码控制的不同功能,可分为检错码、纠错码和纠删码等。

    检错码仅具备识别错码功能 而无纠正错码功能;

    纠错码不仅具备识别错码功能,同时具备纠正错码功能;

    纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时可把无法纠错的信息删除。

  比如  K=3  M=2  K+M=5

    K:原始数据盘个数或恢复数据需要的磁盘个数

    M:校验盘个数或允许出故障的盘个数

    使用编码算法,通过K个原始数据生成K+M个新数据

    通过任何K个新数据都能还原出原始的K个数据通过任何K个新数据都能还原出原始的K个数据

    即允许M个数据盘出故障,数据仍然不会丢失;

二、Ceph纠删码

  用途:
    用更少的空间实现存储,即节约空间;
    纠删码实现了高速的计算,但有2个缺点,一个是速度慢,一个是只支持对象的部分操作(比如:不支持局部写)。纠删码的缺点现在已经有解决办法。

  Ceph纠删码库
    Ceph的默认纠删码库是Jerasure,即Jerasure库;
    当管理员创建一个erasure-coded后端时,可以指定数据块和代码块参数。
    Jerasure库是第三方提供的中间件。Ceph环境安装时,已经默认安装了Jerasure库。

  Ceph纠删码数据存储
    在erasure coded pool中,每个数据对象都被存放在K+M块中。对象被分成K个数据库和M个编码块;erasure coded pool的大小被定义成K+M块,每个块存储在一个OSD中;块的顺序号作为  object的属性保存在对象中。 

  编码块读写
    例如:创建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太慢了。

          

  间断全写
    在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);

            

  如果一切正常,每一个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中。

          

  

cache使用范围

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

      

  Cache分层的分层部署不只解决纠删码速度慢的问题,当然还解决一些其他问题,下次再讨论。

 

posted on 2015-09-08 12:11 阳台 阅读(...) 评论(...) 编辑 收藏

导航

公告