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