zoukankan      html  css  js  c++  java
  • 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分层的分层部署不只解决纠删码速度慢的问题,当然还解决一些其他问题,下次再讨论。

  • 相关阅读:
    shp2pgsql向postgresql导入shape数据
    node.js的Promise库-bluebird示例
    iOS中点击事件失效的解决办法
    [PHP] 获取IP 和JS获取IP和地址
    [Bootstrap ] 模态框(Modal)插件
    [html][javascript] 关于SVG环形进度条
    [javascript] js实现小数的算术运算方法
    [GO] linux 下安装GO
    小知识点:session的存放位置
    [linux] linux的top命令参数详解
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4791217.html
Copyright © 2011-2022 走看看