1. 程式人生 > >淺談Ceph糾刪碼

淺談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分層


第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分層剛好解決了這個問題;
原理架構如下:


Cache分層的分層部署不只解決糾刪碼速度慢的問題,當然還解決一些其他問題,下次再討論。
[如有錯誤 敬請原諒 敬請指正]
--完--