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 で、km を設定するだけで十分です。cauchy_good 技術は速くなりますが、慎重に packetsize を選択する必要があります。reed_sol_r6_opliberationblaum_rothliber8tion はすべて、m=2 でしか設定できない意味で RAID6 と同等です。
タイプ
文字列
必須
いいえ
有効なセット
reed_sol_vanreed_sol_r6_opcauchy_origcauchy_goodliberationblaum_rothliber8tion
デフォルト
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=4jerasure を設定する場合は、OSD の 1 つの OSD が失われると、修復のために他の 11 個から読み取る必要があります。

lrc イレイジャーコードプラグインは、少ない OSD を使用して復元できるようにローカルパリティーチャンクを作成します。たとえば、k=8m=4、および l=4lrc を設定する場合は、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=2locality=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 プロファイルの使用を厳密に同等です。DDK=2 を意味し、cM=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=4m=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 の異なるバケットに配置) を選択するルールを作成します。

また、細かい制御のためにルールを手動で作成することもできます。