5.4. イレイジコードプラグイン
Ceph では、プラグインアーキテクチャーとのイレイジャーコーディングがサポートされます。つまり、さまざまなタイプのアルゴリズムを使用して、イレイジャーコードプールを作成できます。Ceph では、以下がサポートされています。
- Jerasure (デフォルト)
- ローカルに修復可能
- ISA (Intel のみ)
以下のセクションでは、これらのプラグインの詳細を説明します。
5.4.1. Jerasure Erasure コードプラグイン
jerasure プラグインは、最も汎用的で柔軟性のあるプラグインです。Ceph Erasure コードプールのデフォルトでもあります。
jerasure プラグインは JerasureH ライブラリーをカプセル化します。パラメーターの詳細は、jerasure のドキュメントを参照してください。
jerasure プラグインを使用して新しいイレイジャーコードプロファイルを作成するには、以下のコマンドを実行します。
ceph osd erasure-code-profile set <name> \ plugin=jerasure \ k=<data-chunks> \ m=<coding-chunks> \ technique=<reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion> \ [crush-root=<root>] \ [crush-failure-domain=<bucket-type>] \ [directory=<directory>] \ [--force]
詳細は以下のようになります。
- k
- 説明
- 各オブジェクトは data-chunks の部分で分割され、それぞれが異なる OSD に保管されます。
- タイプ
- 整数
- 必須
- Yes
- 例
-
4
- m
- 説明
- 各オブジェクトの コーディングチャンク を計算し、それらを異なる OSD に保存します。コーディングのチャンクの数は、データが失われることなくダウンできる OSD 数でもあります。
- タイプ
- 整数
- 必須
- Yes
- 例
- 2
- テクニック
- 説明
- より柔軟な技術は reed_sol_van で、k と m を設定するだけで十分です。cauchy_good 技術は速くなりますが、慎重に packetsize を選択する必要があります。reed_sol_r6_op、liberation、blaum_roth、liber8tion はすべて、m=2 でしか設定できない意味で RAID6 と同等です。
- タイプ
- 文字列
- 必須
- いいえ
- 有効なセット
-
reed_sol_van
reed_sol_r6_op
cauchy_orig
cauchy_good
liberation
blaum_roth
liber8tion
- デフォルト
-
reed_sol_van
- packetsize
- 説明
- エンコーディングは、バイト サイズのパケットで一度に行われます。適切なパケットサイズの選択は困難です。jerasure ドキュメントには、このトピックに関する詳細な情報が記載されています。
- タイプ
- 整数
- 必須
- いいえ
- デフォルト
-
2048
- crush-root
- 説明
- ルールの最初のステップに使用される CRUSH バケットの名前。たとえば、step take default となります。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
- default
- crush-failure-domain
- 説明
- 同じ障害ドメインを持つバケットに 2 つのチャンクがないことを確認します。たとえば、障害ドメインが ホスト の場合、2 つのチャンクは同じホストに保存されません。これは、step chooseleaf host などのルールステップを作成するのに使用します。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
-
host
- directory
- 説明
- イレイジャーコードプラグインが読み込まれた ディレクトリー 名を設定します。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
-
/usr/lib/ceph/erasure-code
- --force
- 説明
- 同じ名前で既存のプロファイルを上書きします。
- タイプ
- 文字列
- 必須
- いいえ
5.4.2. ローカルに修復可能な Erasure Code (LRC) プラグイン
jerasure プラグインでは、Ceph が複数の OSD にイレイジャーコーディングされたオブジェクトを保存する際に、1 つの OSD が失われた場合からの復元には、他のすべての OSD からの読み取りが必要です。たとえば、k=8 および m=4 で jerasure を設定する場合は、OSD の 1 つの OSD が失われると、修復のために他の 11 個から読み取る必要があります。
lrc イレイジャーコードプラグインは、少ない OSD を使用して復元できるようにローカルパリティーチャンクを作成します。たとえば、k=8、m=4、および l=4 で lrc を設定する場合は、4 つの OSD ごとに追加のパリティーチャンクが作成されます。Ceph が単一の OSD を失うと、そのオブジェクトデータを eleven ではなく 4 つの OSD のみで復旧できます。
すべてのホストが同じスイッチに接続されている場合はおそらく関心のあるユースケースではありませんが、lrc イレイジャーコードプラグインを使用する際に、ラック間の帯域幅使用量の使用量を低減することができます。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ k=4 m=2 l=3 \ crush-failure-domain=host $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
1.2 バージョンでは、プライマリー OSD が失われたチャンクと同じラックにある場合に限り、帯域幅を低下させることができます。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ k=4 m=2 l=3 \ crush-locality=rack \ crush-failure-domain=host $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
5.4.2.1. LRC プロファイルの作成
新しい LRC Erasure コードプロファイルを作成するには、以下のコマンドを実行します。
ceph osd erasure-code-profile set <name> \ plugin=lrc \ k=<data-chunks> \ m=<coding-chunks> \ l=<locality> \ [crush-root=<root>] \ [crush-locality=<bucket-type>] \ [crush-failure-domain=<bucket-type>] \ [directory=<directory>] \ [--force]
詳細は以下のようになります。
- k
- 説明
- 各オブジェクトは data-chunks の部分で分割され、それぞれが異なる OSD に保管されます。
- タイプ
- 整数
- 必須
- Yes
- 例
-
4
- m
- 説明
- 各オブジェクトの コーディングチャンク を計算し、それらを異なる OSD に保存します。コーディングのチャンクの数は、データが失われることなくダウンできる OSD 数でもあります。
- タイプ
- 整数
- 必須
- Yes
- 例
-
2
- l
- 説明
- コーディングとデータチャンクをサイズの 局所性 のセットにグループ化します。たとえば、k=4 および m=2 で locality=3 の場合は、3 つのグループが 2 つ作成されます。各セットは、別のセットからチャンクを読み込まなくても、復旧できます。
- タイプ
- 整数
- 必須
- Yes
- 例
-
3
- crush-root
- 説明
- ルールの最初のステップに使用される crush バケットの名前。たとえば、step take default となります。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
- default
- CRUSH-locality
- 説明
- l で定義される各チャンクのセットの crush バケットのタイプが保存されます。たとえば、rack に設定すると、l チャンクの各グループは異なるラックに配置されます。これは、step choose rack などのルールステップを作成するために使用されます。設定されていない場合、そのようなグループ化は行われません。
- タイプ
- 文字列
- 必須
- いいえ
- crush-failure-domain
- 説明
- 同じ障害ドメインを持つバケットに 2 つのチャンクがないことを確認します。たとえば、障害ドメインが ホスト の場合、2 つのチャンクは同じホストに保存されません。これは、step chooseleaf host などのルールステップを作成するのに使用します。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
-
host
- directory
- 説明
- イレイジャーコードプラグインが読み込まれた ディレクトリー 名を設定します。
- タイプ
- 文字列
- 必須
- いいえ
- デフォルト
-
/usr/lib/ceph/erasure-code
- --force
- 説明
- 同じ名前で既存のプロファイルを上書きします。
- タイプ
- 文字列
- 必須
- いいえ
5.4.2.2. 低レベル LRC プロファイルの作成
k および m の合計は、l パラメーターの倍数でなければなりません。低レベル設定パラメーターはこのような制限を課さないため、特定の目的で使用する方が便利です。たとえば、4 つのチャンクがあるグループと、3 つのチャンクを持つ 2 つのグループを定義できます。また、インスタンスデータセンターやラックなど、局所性セットをデータセンターに再帰的で定義することもできます。k/m/l は、低レベルの設定を生成することで実装されます。
lrc イレイジャーコードプラグインは、イレイジャーコード技術を再帰的に適用し、一部のチャンクの失われた状態を回復するには、ほとんどの場合は、利用可能なチャンクのサブセットのみが必要になります。
たとえば、3 つのコーディングのステップを以下に説明します。
chunk nr 01234567 step 1 _cDD_cDD step 2 cDDD____ step 3 ____cDDD
c がデータチャンク D から計算したチャンクをコーディングする場合、チャンク 7 の損失は、最後の 4 つのチャンクを使用して復元できます。chun 2 チャンクが失われると、最初の 4 つのチャンクを使用して復元できます。
最小のテストシナリオは、デフォルトの erasure-code プロファイルの使用を厳密に同等です。DD は K=2 を意味し、c は M=1 を意味し、デフォルトで jerasure プラグインを使用します。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=DD_ \ layers='[ [ "DDc", "" ] ]' $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
lrc プラグインは、ラック間の帯域幅の使用量を減らすのに特に便利です。すべてのホストが同じスイッチに接続されている場合に、ユースケースが考慮されないかもしれませんが、帯域幅の使用量は実際に確認される可能性があります。チャンクのレイアウトは異なりますが、k=4、m=2、および l=3 と同等です。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ [ "_cDD_cDD", "" ], [ "cDDD____", "" ], [ "____cDDD", "" ], ]' $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
Firefly では、プライマリー OSD が失われたチャンクと同じラックにある場合にのみ、帯域幅が減少します。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ [ "_cDD_cDD", "" ], [ "cDDD____", "" ], [ "____cDDD", "" ], ]' \ crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ], ]' $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
LRC は、デフォルトの EC バックエンドとして jerasure を使用するようになりました。低レベル設定を使用して、レイヤーごとに EC バックエンドおよびアルゴリズムを指定することができます。layers='[ [ "DDc", "" ] ]' の 2 つ目の引数は、実際にこのレベルに使用するイレイジャーのコードプロファイルです。以下の例は、lrcpool で使用する Cauchy 手法を含む ISA バックエンドを示しています。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=DD_ \ layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]' $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
レイヤーごとに異なるイレイジャーコードプロファイルを使用することもできます。
$ ceph osd erasure-code-profile set LRCprofile \ plugin=lrc \ mapping=__DD__DD \ layers='[ [ "_cDD_cDD", "plugin=isa technique=cauchy" ], [ "cDDD____", "plugin=isa" ], [ "____cDDD", "plugin=jerasure" ], ]' $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
5.4.3. CRUSH 配置の制御
デフォルトの CRUSH ルールは、異なるホストにある OSD を提供します。たとえば、以下のようになります。
chunk nr 01234567 step 1 _cDD_cDD step 2 cDDD____ step 3 ____cDDD
各チャンクに 1 つずつ、正確に 8 つの OSD が必要です。ホストが 2 つ隣り合ったラックにある場合は、最初の 4 つのチャンクを最初のラックに配置し、残りを 2 番目のラックに配置できます。1 つの OSD の失われた状態からのリカバリーには、2 つのラック間で帯域幅を使用する必要はありません。
たとえば、以下のようになります。
crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'
rack タイプのクラッシュバケットを 2 つ選択し、それぞれに 4 つの OSD (タイプ host の異なるバケットに配置) を選択するルールを作成します。
また、細かい制御のためにルールを手動で作成することもできます。