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分層的分層部署不只解決糾刪碼速度慢的問題,當然還解決一些其他問題,下次再討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM