19 イレージャコーディングプール #
Cephでは、プール内のデータの通常のレプリケーションに代わる代替手段が提供されています。これを「イレージャ」または「イレージャコーディング」プールと呼びます。イレージャプールは「複製」プールのすべての機能を備えているわけではありませんが(たとえば、RBDプールのメタデータを保存することはできません)、必要な未加工ストレージが少なくて済みます。1TBのデータを保存可能なデフォルトのイレージャプールでは、1.5TBの未加工ストレージが必要で、これによって単一ディスク障害を許容することができます。複製プールでは同じ目的に対して2TBの未加工ストレージが必要であるため、比較しても遜色ありません。
イレージャコードの背景情報については、https://en.wikipedia.org/wiki/Erasure_codeを参照してください。
ECプールに関連するプール値のリストについては、イレージャコーディングプールの値を参照してください。
19.1 イレージャコーディングプールの前提条件 #
イレージャコーディングを利用するには、以下を行う必要があります。
CRUSHマップでイレージャルールを定義する
使用するコーディングアルゴリズムを指定するイレージャコードプロファイルを定義する
前述したルールとプロファイルを使用してプールを作成する
プールを作成してデータを保存した後でプロファイルや、プロファイル内の詳細を変更することはできないことに注意してください。
「イレージャプール」のCRUSHルールではstep
にindep
を使用するようにしてください。詳細については、17.3.2項 「firstn
とindep
」を参照してください。
19.2 サンプルのイレージャコーディングプールの作成 #
最もシンプルなイレージャコーディングプールはRAID5と同等で、少なくとも3つのホストを必要とします。この手順では、テスト用のプールを作成する方法について説明します。
コマンド
ceph osd pool create
を使用して、タイプが「erasure」のプールを作成します。12
は、配置グループの数を表します。デフォルトのパラメータの場合、このプールは1つの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を無効にできます。たとえば、OSDをネットワークから接続解除します。
プールがデバイスの障害に対応できるかどうかをテストするため、
rados
コマンドを使用してファイルの内容にアクセスできます。cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
19.3 イレージャコードプロファイル #
ceph osd pool create
コマンドを起動して「イレージャプール」を作成する場合、別のプロファイルを指定しない限り、デフォルトのプロファイルが使用されます。プロファイルはデータの冗長性を定義します。このためには、任意にk
およびm
という名前が付けられた2つのパラメータを定義します。kおよびmは、1つのデータを何個のchunks
(チャンク)に分割するかと、何個のコーディングチャンクを作成するかを定義します。これにより、冗長チャンクは異なるOSDに保存されます。
イレージャプールプロファイルに必要な定義は次のとおりです。
- chunk
エンコーディング関数を呼び出すと、同じサイズの複数のチャンクが返されます。連結して元のオブジェクトを再構成できるデータチャンクと、失われたチャンクの再構築に使用できるコーディングチャンクです。
- k
データチャンクの数。これは、元のオブジェクトが分割されるチャンクの数です。たとえば、
k = 2
の場合、10KBのオブジェクトはそれぞれが5KBのk
個のオブジェクトに分割されます。イレージャコーディングプールのデフォルトのmin_size
は、k + 1
です。ただし、書き込みおよびデータが失われるのを防ぐため、min_size
をk + 2
以上にすることをお勧めします。- m
コーディングチャンクの数。これは、エンコーディング関数によって計算される追加チャンクの数です。コーディングチャンクが2つある場合、2つのOSDに障害が発生してもデータが失われないことを意味します。
- crush-failure-domain
チャンクの分散先のデバイスを定義します。値としてバケットタイプを設定する必要があります。すべてのバケットタイプについては、17.2項 「バケット」を参照してください。障害ドメインが
rack
の場合、ラック障害時の災害耐性を向上させるため、チャンクは別のラックに保存されます。このためにはk+m個のラックが必要なことに注意してください。
19.2項 「サンプルのイレージャコーディングプールの作成」で使用されているデフォルトのイレージャコードプロファイルでは、1つのOSDまたはホストに障害が発生した場合は、クラスタデータは失われません。したがって、1TBのデータを保存するには、さらに0.5TBの未加工ストレージが必要です。つまり、1TBのデータには1.5TBの未加工ストレージが必要です(k=2、m=1であるため)。これは、一般的なRAID 5設定と同等です。比較すると、複製プールでは1TBのデータを保存するのに2TBの未加工ストレージが必要です。
デフォルトのプロファイルの設定は次のコマンドで表示できます。
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%のストレージオーバーヘッドでラック2台分の損失に耐える必要がある場合、次のプロファイルを定義できます。これは「ラック」タイプのバケットが設定された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オブジェクトは3つ(k=3
)に分割され、2つの追加チャンク(m=2
)が作成されます。m
の値は、データを失うことなく何個のOSDが同時に失われても構わないかを定義します。crush-failure-domain=rack
は、2つのチャンクが同じラックに保存されないようにする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に0~4K、チャンク1に4K~8K、続いてもう一度チャンク0に8K~12Kの範囲が設定されます。最高のパフォーマンスを得るためには、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 Block Deviceとしてマーク付け #
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
このイメージは他のイメージと同じように通常の方法で使用できますが、すべてのデータは「rbd」プールではなくec_pool_nameプールに保存される点が異なります。