19 糾刪碼池 #
Ceph 提供了一種在池中正常複製資料的替代方案,稱為糾刪池或糾刪碼池。糾刪碼池不能提供複本池的所有功能 (例如,它們無法儲存 RBD 池的中繼資料),但其所需的原始儲存空間更少。一個能夠儲存 1 TB 資料的預設糾刪碼池需要 1.5 TB 的原始儲存空間,以應對發生單個磁碟故障的情況。從這方面而言,糾刪碼池優於複本池,因為後者需要 2 TB 的原始儲存空間才能實現相同目的。
如需糾刪碼的背景資訊,請參閱 https://en.wikipedia.org/wiki/Erasure_code。
如需 EC 池相關的池值清單,請參閱糾刪碼池值。
19.1 糾刪碼池的先決條件 #
若要使用糾刪碼,您需要:
在 CRUSH 地圖中定義糾刪碼規則。
定義用於指定要使用的編碼演算法的糾刪碼設定檔。
建立使用上述規則和設定檔的池。
請記住,一旦建立好池且池中包含資料,便無法變更設定檔和設定檔中的詳細資料。
確定糾刪池的 CRUSH 規則對 step
使用 indep
。如需詳細資料,請參閱第 17.3.2 節 「firstn 和 indep
」。
19.2 建立範例糾刪碼池 #
最簡單的糾刪碼池相當於 RAID5,至少需要三個主機。以下程序介紹如何建立用於測試的池。
ceph osd pool create
指令用於建立類型為糾刪的池。12
表示放置群組的數量。使用預設參數時,該池能夠處理一個 OSD 的故障。cephuser@adm >
ceph osd pool create ecpool 12 12 erasure pool 'ecpool' created字串
ABCDEFGHI
將寫入名為NYAN
的物件。cephuser@adm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -為了進行測試,現在可以停用 OSD,例如,透過斷開其網路連接來停用。
若要測試該池是否可以處理多部裝置發生故障的情況,可以使用
rados
指令來存取檔案的內容。cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
19.3 糾刪碼設定檔 #
呼叫 ceph osd pool create
指令來建立糾刪池時,除非指定了其他設定檔,否則會使用預設的設定檔。設定檔定義資料備援。若要進行此定義,可以設定隨意命名為 k
和 m
的兩個參數。k 和 m 定義要將資料片段拆分成多少個區塊
,以及要建立多少個編碼區塊。之後,備援區塊即會儲存在不同的 OSD 上。
糾刪池設定檔所需的定義:
- chunk
如果呼叫該編碼函數,它會傳回相同大小的區塊:可串連起來以重新建構原始物件的資料區塊,以及可用於重建所遺失區塊的編碼區塊。
- k
資料區塊的數量,即要將原始物件分割成的區塊數量。例如,如果
k = 2
,則會將一個 10 kB 物件分割成各為 5 kB 的k
個物件。糾刪碼池的預設min_size
為k + 1
。不過,我們建議將min_size
設定為k + 2
或更大的值,以避免寫入操作和資料遺失。- m
編碼區塊的數量,即編碼函數運算的額外區塊數量。如果有 2 個編碼區塊,則表示可以移出 2 個 OSD,而不會遺失資料。
- crush-failure-domain
定義要將區塊分佈到的裝置。其值需要設定為某個桶類型。如需所有的桶類型,請參閱第 17.2 節 「桶」。如果故障網域為
機櫃
,則會將區塊儲存在不同的機櫃上,以提高機櫃發生故障時的復原能力。請記住,這需要 k+m 個機架。
使用第 19.2 節 「建立範例糾刪碼池」中所用的預設糾刪碼設定檔時,如果單個 OSD 或主機發生故障,叢集資料將不會遺失。因此,若要儲存 1 TB 資料,需要額外提供 0.5 TB 原始儲存空間。也就是說,需要 1.5 TB 原始儲存空間才能儲存 1 TB 資料 (因為 k=2、m=1)。這相當於常見的 RAID 5 組態。做為對比,複本池需要 2 TB 原始儲存空間才能儲存 1 TB 資料。
可使用以下指令來顯示預設設定檔的設定:
cephuser@adm >
ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van
選擇適當的設定檔非常重要,因為在建立池後便無法修改設定檔。需要建立使用不同設定檔的新池,並將之前的池中的所有物件移到新池 (請參閱第 18.6 節 「池移轉」)。
設定檔最重要的幾個參數是 k
、m
和 crush-failure-domain
,因為它們定義儲存負擔和資料持久性。例如,如果在兩個機架發生故障並且儲存負擔達到 66% 的情況下,必須能夠維繫所需的架構,您可定義以下設定檔。請注意,這僅適用於擁有「rack」類型的桶的 CRUSH 地圖:
cephuser@adm >
ceph osd erasure-code-profile set myprofile \
k=3 \
m=2 \
crush-failure-domain=rack
對於此新設定檔,可以重複第 19.2 節 「建立範例糾刪碼池」中的範例:
cephuser@adm >
ceph osd pool create ecpool 12 12 erasure myprofilecephuser@adm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
NYAN 物件將分割成三個 (k=3
),並將建立兩個額外的區塊 (m=2
)。m
值定義可以同時遺失多少個 OSD 而不會遺失任何資料。crush-failure-domain=rack
將建立一個 CRUSH 規則集,用於確保不會將兩個區塊儲存在同一個機櫃中。
19.3.1 建立新糾刪碼設定檔 #
以下指令可建立新糾刪碼設定檔:
#
ceph osd erasure-code-profile set NAME \
directory=DIRECTORY \
plugin=PLUGIN \
stripe_unit=STRIPE_UNIT \
KEY=VALUE ... \
--force
- DIRECTORY
選擇性。設定從中載入糾刪碼外掛程式的目錄名稱。預設為
/usr/lib/ceph/erasure-code
。- PLUGIN
選擇性。使用糾刪碼外掛程式可計算編碼區塊和復原遺失的區塊。可用的外掛程式有「jerasure」、「isa」、「lrc」和「shes」。預設為「jerasure」。
- STRIPE_UNIT
選擇性。資料區塊中每個分割區的資料量。例如,如果設定檔有 2 個資料區塊,且 stripe_unit 等於 4K,則系統會將範圍 0-4K 的資料置於區塊 0 中,將 4K-8K 置於區塊 1 中,然後再將 8K-12K 置於區塊 0 中。需要有多個 4K 才能實現最佳效能。預設值取自建立池時的監控程式組態選項
osd_pool_erasure_code_stripe_unit
。使用此設定檔的池的「stripe_width」等於資料區塊的數量乘以此「stripe_unit」。- KEY=VALUE
選定糾刪碼外掛程式特定的選項鍵值組。
- --force
選擇性。覆寫名稱相同的現有設定檔,並允許設定不依 4K 對齊的 stripe_unit。
19.3.2 移除糾刪碼設定檔 #
以下指令可依 NAME 所識別的糾刪碼設定檔移除相應設定檔:
#
ceph osd erasure-code-profile rm NAME
如果某個池參考了該設定檔,則刪除將會失敗。
19.3.3 顯示糾刪碼設定檔的詳細資料 #
以下指令可依 NAME 所識別的糾刪碼設定檔顯示其詳細資料:
#
ceph osd erasure-code-profile get NAME
19.3.4 列出糾刪碼設定檔 #
以下指令可列出所有糾刪碼設定檔的名稱:
#
ceph osd erasure-code-profile ls
19.4 標示含 RADOS 區塊裝置的糾刪碼池 #
若要將 EC 池標示為 RBD 池,請對其進行相應標記:
cephuser@adm >
ceph osd pool application enable rbd ec_pool_name
RBD 可在 EC 池中儲存影像資料。但是,影像標題和中繼資料仍需要儲存在複本池中。為此,假設您的池命名為「rbd」:
cephuser@adm >
rbd create rbd/image_name --size 1T --data-pool ec_pool_name
您可以如同使用任何其他影像一般正常使用該影像,只不過所有資料都將儲存在 ec_pool_name 池而非「rbd」池中。