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

