Ceph的正確玩法之Ceph糾刪碼理論與實踐

2022-05-21 22:18:11 字數 4193 閱讀 5986

注意空格,有的命令少空格

一、糾刪碼原理

糾刪碼(erasure coding,ec)是一種編碼容錯技術,最早是在通訊行業解決部分資料在傳輸中的損耗問題。其基本原理就是把傳輸的訊號分段,加入一定的校驗再讓各段間發生相互關聯,即使在傳輸過程中丟失部分訊號,接收端仍然能通過演算法將完整的資訊計算出來。在資料儲存中,糾刪碼將資料分割成片段,把冗餘資料塊擴充套件和編碼,並將其儲存在不同的位置,比如磁碟、儲存節點或者其他地理位置。如果需要嚴格區分,實際上按照誤碼控制的不同功能,可分為檢錯、糾錯和糾刪3種型別。

·檢錯碼僅具備識別錯碼功能而無糾正錯碼功能。

·糾錯碼不僅具備識別錯碼功能,同時具備糾正錯碼功能。

·糾刪碼則不僅具備識別錯碼和糾正錯碼的功能,而且當錯碼超過糾正範圍時,還可把無法糾錯的資訊刪除。

從糾刪碼基本的形態看,它是k個資料塊+m個校驗塊的結構,其中k和m值可以按照一定的規則設定,可以用公式:n=k+m來表示。變數k代表原始資料或符號的值。變數m代表故障後新增的提供保護的額外或冗餘符號的值。變數n代表糾刪碼過程後建立的符號的總值。當小於m個儲存塊(資料塊或校驗塊)損壞的情況下,整體資料塊可以通過計算剩餘儲存塊上的資料得到,整體資料不會丟失。

下面以k=2,m=1為例,介紹一下如何以糾刪碼的形式將乙個名稱為cat.jpg的物件存放在ceph中,假定該物件的內容為abcdefgh。客戶端在將cat.jpg上傳到ceph以後,會在主osd中呼叫相應的糾刪碼演算法對資料進行編碼計算:將原來的abcdefgh拆分成兩個分片,對應圖11-2中的條帶分片1(內容為abcd)和條帶分片2(內容為efgh),之後再計算出另外乙個校驗條帶分片3(內容為wxyz)。按照crushmap所指定的規則,將這3個分片隨機分布在3個不同的osd上面,完成對這個物件的儲存操作。如圖所示。

下面再看一下如何使用糾刪碼讀取資料,同樣還是以cat.jpg為例。客戶端在發起讀取cat.jpg請求以後,這個物件所在pg的主osd會向其他關聯的osd發起讀取請求,比如主osd是圖中的osd1,當請求傳送到了osd2和osd3,此時剛好osd2出現故障無法回應請求,導致最終只能獲取到osd1(內容為abcd)和osd3(wxyz)的條帶分片,此時osd1作為主osd會對osd1和osd3的資料分片做糾刪碼解碼操作,計算出osd2上面的分片內容(即efgh),之後重新組合出新的cat.jpg內容(abcdefgh),最終將該結果返回給客戶端。整個過程如圖所示。

雖然糾刪碼能夠提供和副本相近的資料可靠性,並降低冗餘資料的開銷,整體上能提高儲存裝置的可用空間。但是,糾刪碼所帶來的額外開銷主要是大量計算和網路高負載,優點同時伴隨缺點。特別是在乙個硬碟出現故障的情況下,重建資料非常耗費cpu資源,而且計算乙個資料塊時需要讀出大量資料並通過網路傳輸。相比副本資料恢復,糾刪碼資料恢復時給網路帶來巨大的負擔。因此,使用糾刪碼對硬體的裝置效能是乙個較大的考驗,這點需要注意。另外,需要注意的是,使用糾刪碼所建立的儲存資源池無法新建rbd塊裝置。

ceph安裝後預設有default rule,這個rule預設是在host層級進行三副本讀寫。副本技術帶來的優點是高可靠性、優異的讀寫效能和快速的副本恢復。然而,副本技術帶來的成本壓力是較高的,特別是三副本資料情景下,每tb資料的成本是硬碟裸容量3倍以上(包括節點cpu和記憶體均攤開銷)。糾刪碼具備與副本相近的高可用特性,而且降低了冗餘資料的開銷,同時帶來了大量計算和網路高負載。

二、糾刪碼實踐

糾刪碼是通過建立erasure型別的ceph池實現的。這些池是基於乙個糾刪碼配置檔案進行建立的,在這個配置檔案中定義了糾刪碼的特徵值。現在我們將建立乙個糾刪碼配置檔案,並根據這個配置檔案建立糾刪碼池。下面的命令將建立乙個名為ecprofile的糾刪碼配置檔案,它定義的特徵值是:k=3和m=2,兩者分別表示資料塊和校驗塊的數量。所以,每乙個儲存在糾刪碼池中的物件都將分為3(即k)個資料塊,和2(即m)個額外新增的校驗塊,一共有5個塊(k+m)。最後,這5(即k+m)個塊將分布在不同故障區域中的osd上。

1、建立糾刪碼配置檔案:

# ceph osd erasure-code-profile set ecprofile ruleset-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=3m=2

plugin=jerasure

technique=reed_sol_van

w=8我們順便也看ceph預設的配置檔案

# ceph osd erasure-code-profile get default

k=2m=1

plugin=jerasure

technique=reed_sol_van

# ceph osd pool create ecpool 16 16 erasure ecprofile

pool 'ecpool' created

4、檢查新建立的池的狀態,你會發現池的大小是5(k+m),也就是說,erasure大小是5。因此,資料將被寫入五個不同的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、現在我們建立個檔案放到糾刪碼池中。

# echo test > test

# ceph osd pool ls

ecpool

# rados put -p ecpool object1 test

# rados -p ecpool ls

object1

6、檢查ec池中和object1的osdmap。命令的輸出將清晰地顯示物件的每個塊所在的osdid。正如步驟1)中說明的那樣,object1被分為3(m)個資料塊和2(k)個額外的校驗塊,因此,5個塊分別儲存在ceph集群完全不同的osd上。在這個演示中,object1一直儲存在這5個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)

三、糾刪碼測試

1、我們先來關閉乙個osd

# systemctl stop ceph-osd@3

停止osd.3,檢查ec池和object1的osdmap。你應該注意,這裡的osd.3變成none了,這意味著osd.3在這個池是不可用的:

# 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、我們再來關閉乙個osd

# systemctl stop ceph-osd@5

停止osd.5,檢查ec池和object1的osdmap。你應該注意,這裡的osd.5變成none了,這意味著osd.5在這個池是不可用的:

# 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)

## rados get -p ecpool object1 /tmp/wyl

玩轉 Ceph 的正確姿勢

玩轉 ceph 的正確姿勢 本文先介紹 ceph,然後會聊到一些正確使用 ceph 的姿勢 在集群規模小的時候,ceph 怎麼玩都沒問題 但集群大了 到pb級別 這些準則可是保證集群健康執行的不二法門 ceph 最初的目標是做乙個分布式檔案系統,直到現在這個目標也不能算完美實現 目前官網上對它的檔案...

Ceph基礎之搭建ceph集群

8 更新源 yum update ysetenforce 0 4 安裝ntp,在所有ceph節點上執行 2 用ceph deploy建立ceph集群mkdir etc ceph 生成乙個新的ceph集群,集群包括ceph配置檔案以及monitor的金鑰環。3 安裝ceph二進位制軟體包ceph de...

ceph中糾刪碼如何讀寫資料

從該圖我們可以看到從前端的業務檔案到資料儲存到儲存硬碟上的過程,步驟如下 1.file object對映 rados中需要配置object的大小,一般會設定為2m到4m的大小。當使用者寫入資料檔案時,首先會根據object的大小值將file進行切分。如果file的大小不足object的大小,則直接按...