您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Ceph糾刪碼怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
一、糾刪碼原理
糾刪碼(Erasure Coding,EC)是一種編碼容錯(cuò)技術(shù),最早是在通信行業(yè)解決部分?jǐn)?shù)據(jù)在傳輸中的損耗問(wèn)題。其基本原理就是把傳輸?shù)男盘?hào)分段,加入一定的校驗(yàn)再讓各段間發(fā)生相互關(guān)聯(lián),即使在傳輸過(guò)程中丟失部分信號(hào),接收端仍然能通過(guò)算法將完整的信息計(jì)算出來(lái)。在數(shù)據(jù)存儲(chǔ)中,糾刪碼將數(shù)據(jù)分割成片段,把冗余數(shù)據(jù)塊擴(kuò)展和編碼,并將其存儲(chǔ)在不同的位置,比如磁盤(pán)、存儲(chǔ)節(jié)點(diǎn)或者其他地理位置。如果需要嚴(yán)格區(qū)分,實(shí)際上按照誤碼控制的不同功能,可分為檢錯(cuò)、糾錯(cuò)和糾刪3種類(lèi)型。
·檢錯(cuò)碼僅具備識(shí)別錯(cuò)碼功能而無(wú)糾正錯(cuò)碼功能。
·糾錯(cuò)碼不僅具備識(shí)別錯(cuò)碼功能,同時(shí)具備糾正錯(cuò)碼功能。
·糾刪碼則不僅具備識(shí)別錯(cuò)碼和糾正錯(cuò)碼的功能,而且當(dāng)錯(cuò)碼超過(guò)糾正范圍時(shí),還可把無(wú)法糾錯(cuò)的信息刪除。
從糾刪碼基本的形態(tài)看,它是k個(gè)數(shù)據(jù)塊+m個(gè)校驗(yàn)塊的結(jié)構(gòu),其中k和m值可以按照一定的規(guī)則設(shè)定,可以用公式:n=k+m來(lái)表示。變量k代表原始數(shù)據(jù)或符號(hào)的值。變量m代表故障后添加的提供保護(hù)的額外或冗余符號(hào)的值。變量n代表糾刪碼過(guò)程后創(chuàng)建的符號(hào)的總值。當(dāng)小于m個(gè)存儲(chǔ)塊(數(shù)據(jù)塊或校驗(yàn)塊)損壞的情況下,整體數(shù)據(jù)塊可以通過(guò)計(jì)算剩余存儲(chǔ)塊上的數(shù)據(jù)得到,整體數(shù)據(jù)不會(huì)丟失。
下面以k=2,m=1為例,介紹一下如何以糾刪碼的形式將一個(gè)名稱(chēng)為cat.jpg的對(duì)象存放在Ceph中,假定該對(duì)象的內(nèi)容為ABCDEFGH??蛻?hù)端在將cat.jpg上傳到Ceph以后,會(huì)在主OSD中調(diào)用相應(yīng)的糾刪碼算法對(duì)數(shù)據(jù)進(jìn)行編碼計(jì)算:將原來(lái)的ABCDEFGH拆分成兩個(gè)分片,對(duì)應(yīng)圖11-2中的條帶分片1(內(nèi)容為ABCD)和條帶分片2(內(nèi)容為EFGH),之后再計(jì)算出另外一個(gè)校驗(yàn)條帶分片3(內(nèi)容為WXYZ)。按照crushmap所指定的規(guī)則,將這3個(gè)分片隨機(jī)分布在3個(gè)不同的OSD上面,完成對(duì)這個(gè)對(duì)象的存儲(chǔ)操作。如圖所示。
下面再看一下如何使用糾刪碼讀取數(shù)據(jù),同樣還是以cat.jpg為例??蛻?hù)端在發(fā)起讀取cat.jpg請(qǐng)求以后,這個(gè)對(duì)象所在PG的主OSD會(huì)向其他關(guān)聯(lián)的OSD發(fā)起讀取請(qǐng)求,比如主OSD是圖中的OSD1,當(dāng)請(qǐng)求發(fā)送到了OSD2和OSD3,此時(shí)剛好OSD2出現(xiàn)故障無(wú)法回應(yīng)請(qǐng)求,導(dǎo)致最終只能獲取到OSD1(內(nèi)容為ABCD)和OSD3(WXYZ)的條帶分片,此時(shí)OSD1作為主OSD會(huì)對(duì)OSD1和OSD3的數(shù)據(jù)分片做糾刪碼解碼操作,計(jì)算出OSD2上面的分片內(nèi)容(即EFGH),之后重新組合出新的cat.jpg內(nèi)容(ABCDEFGH),最終將該結(jié)果返回給客戶(hù)端。整個(gè)過(guò)程如圖所示。
雖然糾刪碼能夠提供和副本相近的數(shù)據(jù)可靠性,并降低冗余數(shù)據(jù)的開(kāi)銷(xiāo),整體上能提高存儲(chǔ)設(shè)備的可用空間。但是,糾刪碼所帶來(lái)的額外開(kāi)銷(xiāo)主要是大量計(jì)算和網(wǎng)絡(luò)高負(fù)載,優(yōu)點(diǎn)同時(shí)伴隨缺點(diǎn)。特別是在一個(gè)硬盤(pán)出現(xiàn)故障的情況下,重建數(shù)據(jù)非常耗費(fèi)CPU資源,而且計(jì)算一個(gè)數(shù)據(jù)塊時(shí)需要讀出大量數(shù)據(jù)并通過(guò)網(wǎng)絡(luò)傳輸。相比副本數(shù)據(jù)恢復(fù),糾刪碼數(shù)據(jù)恢復(fù)時(shí)給網(wǎng)絡(luò)帶來(lái)巨大的負(fù)擔(dān)。因此,使用糾刪碼對(duì)硬件的設(shè)備性能是一個(gè)較大的考驗(yàn),這點(diǎn)需要注意。另外,需要注意的是,使用糾刪碼所建立的存儲(chǔ)資源池?zé)o法新建RBD塊設(shè)備。
Ceph安裝后默認(rèn)有Default Rule,這個(gè)Rule默認(rèn)是在Host層級(jí)進(jìn)行三副本讀寫(xiě)。副本技術(shù)帶來(lái)的優(yōu)點(diǎn)是高可靠性、優(yōu)異的讀寫(xiě)性能和快速的副本恢復(fù)。然而,副本技術(shù)帶來(lái)的成本壓力是較高的,特別是三副本數(shù)據(jù)情景下,每TB數(shù)據(jù)的成本是硬盤(pán)裸容量3倍以上(包括節(jié)點(diǎn)CPU和內(nèi)存均攤開(kāi)銷(xiāo))。糾刪碼具備與副本相近的高可用特性,而且降低了冗余數(shù)據(jù)的開(kāi)銷(xiāo),同時(shí)帶來(lái)了大量計(jì)算和網(wǎng)絡(luò)高負(fù)載。
二、糾刪碼實(shí)踐
糾刪碼是通過(guò)創(chuàng)建erasure類(lèi)型的Ceph池實(shí)現(xiàn)的。這些池是基于一個(gè)糾刪碼配置文件進(jìn)行創(chuàng)建的,在這個(gè)配置文件中定義了糾刪碼的特征值?,F(xiàn)在我們將創(chuàng)建一個(gè)糾刪碼配置文件,并根據(jù)這個(gè)配置文件創(chuàng)建糾刪碼池。下面的命令將創(chuàng)建一個(gè)名為Ecprofile的糾刪碼配置文件,它定義的特征值是:k=3和m=2,兩者分別表示數(shù)據(jù)塊和校驗(yàn)塊的數(shù)量。所以,每一個(gè)存儲(chǔ)在糾刪碼池中的對(duì)象都將分為3(即k)個(gè)數(shù)據(jù)塊,和2(即m)個(gè)額外添加的校驗(yàn)塊,一共有5個(gè)塊(k+m)。最后,這5(即k+m)個(gè)塊將分布在不同故障區(qū)域中的OSD上。
1、創(chuàng)建糾刪碼配置文件:
# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
2、查看配置文件
# ceph osd erasure-code-profile ls
Ecprofile
default
# ceph osd erasure-code-profile get Ecprofile
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=3
m=2
plugin=jerasure
technique=reed_sol_van
w=8
我們順便也看Ceph默認(rèn)的配置文件
# ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
3、基于上一步生成的糾刪碼配置文件新建一個(gè)erasure類(lèi)型的Ceph池:
# ceph osd pool create Ecpool 16 16 erasureEcprofile
pool 'Ecpool' created
4、檢查新創(chuàng)建的池的狀態(tài),你會(huì)發(fā)現(xiàn)池的大小是5(k+m),也就是說(shuō),erasure大小是5。因此,數(shù)據(jù)將被寫(xiě)入五個(gè)不同的OSD中:
# ceph osd dump | grep Ecpool
pool 8 'Ecpool' erasure size 5 min_size 4crush_rule 3 object_hash rjenkins pg_num 16 pgp_num 16 last_change 231 flagshashpspool stripe_width 12288
5、現(xiàn)在我們創(chuàng)建個(gè)文件放到糾刪碼池中。
# echo test > test
# ceph osd pool ls
Ecpool
# rados put -p Ecpool object1 test
# rados -p Ecpool ls
object1
6、檢查EC池中和object1的OSDmap。命令的輸出將清晰地顯示對(duì)象的每個(gè)塊所在的OSDID。正如步驟1)中說(shuō)明的那樣,object1被分為3(m)個(gè)數(shù)據(jù)塊和2(k)個(gè)額外的校驗(yàn)塊,因此,5個(gè)塊分別存儲(chǔ)在Ceph集群完全不同的OSD上。在這個(gè)演示中,object1一直存儲(chǔ)在這5個(gè)OSD中,它們是osd.5、osd.1、osd.3、osd.2、osd.4。
# ceph osd map Ecpool object1
osdmap e233 pool 'Ecpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([5,1,3,2,4], p5) acting([5,1,3,2,4], p5)
三、糾刪碼測(cè)試
1、我們先來(lái)關(guān)閉一個(gè)osd
# systemctl stop ceph-osd@3
停止osd.3,檢查EC池和object1的OSDmap。你應(yīng)該注意,這里的osd.3變成NONE了,這意味著osd.3在這個(gè)池是不可用的:
# ceph osd map Ecpool object1
osdmap e235 pool 'Ecpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([5,1,NONE,2,4], p5) acting ([5,1,NONE,2,4],p5)
2、我們?cè)賮?lái)關(guān)閉一個(gè)osd
# systemctl stop ceph-osd@5
停止osd.5,檢查EC池和object1的OSDmap。你應(yīng)該注意,這里的osd.5變成NONE了,這意味著osd.5在這個(gè)池是不可用的:
# ceph osd map Ecpool object1
osdmap e237 pool 'Ecpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([NONE,1,NONE,2,4], p1) acting([NONE,1,NONE,2,4], p1)
3、我們從糾刪碼池中下載文件
## rados get -p Ecpool object1 /tmp/wyl
感謝各位的閱讀!關(guān)于“Ceph糾刪碼怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。