跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Enterprise Storage 7.1 文件 / 管理和操作指南 / 在叢集中儲存資料 / 糾刪碼池
適用範圍 SUSE Enterprise Storage 7.1

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,至少需要三個主機。以下程序介紹如何建立用於測試的池。

  1. ceph osd pool create 指令用於建立類型為糾刪的池。12 表示放置群組的數量。使用預設參數時,該池能夠處理一個 OSD 的故障。

    cephuser@adm > ceph osd pool create ecpool 12 12 erasure
    pool 'ecpool' created
  2. 字串 ABCDEFGHI 將寫入名為 NYAN 的物件。

    cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
  3. 為了進行測試,現在可以停用 OSD,例如,透過斷開其網路連接來停用。

  4. 若要測試該池是否可以處理多部裝置發生故障的情況,可以使用 rados 指令來存取檔案的內容。

    cephuser@adm > rados --pool ecpool get NYAN -
    ABCDEFGHI

19.3 糾刪碼設定檔

呼叫 ceph osd pool create 指令來建立糾刪池時,除非指定了其他設定檔,否則會使用預設的設定檔。設定檔定義資料備援。若要進行此定義,可以設定隨意命名為 km 的兩個參數。k 和 m 定義要將資料片段拆分成多少個區塊,以及要建立多少個編碼區塊。之後,備援區塊即會儲存在不同的 OSD 上。

糾刪池設定檔所需的定義:

chunk

如果呼叫該編碼函數,它會傳回相同大小的區塊:可串連起來以重新建構原始物件的資料區塊,以及可用於重建所遺失區塊的編碼區塊。

k

資料區塊的數量,即要將原始物件分割成的區塊數量。例如,如果 k = 2,則會將一個 10 kB 物件分割成各為 5 kB 的 k 個物件。糾刪碼池的預設 min_sizek + 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 節 「池移轉」)。

設定檔最重要的幾個參數是 kmcrush-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 myprofile
cephuser@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 規則集,用於確保不會將兩個區塊儲存在同一個機櫃中。

Image

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」池中。