2.7. CRUSH ルール
CRUSH ルールは、Ceph クライアントがバケットとそれら内の OSD を選択する方法を定義し、プライマリー OSD がバケットとセカンダリー OSD を選択してレプリカやコーディングのチャンクを保存する方法を定義します。たとえば、2 つのオブジェクトレプリカ用に SSD がサポートするターゲット OSD と、3 つのレプリカ用に SAS ドライブがサポートする 3 つのターゲット OSD を選択するルールを作成できます。
ルールは以下の形式を取ります。
rule <rulename> { ruleset <ruleset> type [ replicated | raid4 ] min_size <min-size> max_size <max-size> step take <bucket-type> [class <class-name>] step [choose|chooseleaf] [firstn|indep] <N> <bucket-type> step emit }
- ルールセット
- 説明
- (非推奨) ルールを一連のルールに属するように分類する手段。プールにルールセットを設定してアクティベートされます。RHCS 2 以前のリリースでサポートされます。RHCS 3 以降のリリースでは、ルールセットはサポートされません。
- 目的
- ルールマスクのコンポーネント。
- タイプ
- 整数
- 必須
- Yes
- デフォルト
-
0
- type
- 説明
- では、ストレージドライブ (複製) または RAID のいずれかのルールを説明します。
- 目的
- ルールマスクのコンポーネント。
- タイプ
- 文字列
- 必須
- Yes
- デフォルト
-
replicated
- 有効な値
-
現在は
replicated
のみ
- min_size
- 説明
- プールがこの数よりも小さいレプリカを使用する場合、CRUSH はこのルールを選択しません。
- タイプ
- 整数
- 目的
- ルールマスクのコンポーネント。
- 必須
- Yes
- デフォルト
-
1
- max_size
- 説明
- プールがこの数を超えるレプリカを行うと、CRUSH はこのルールを選択しません。
- タイプ
- 整数
- 目的
- ルールマスクのコンポーネント。
- 必須
- Yes
- デフォルト
-
10
- step take <bucket-name> [class <class-name>]
- 説明
- バケット名を取り、ツリーを下ってのイテレートを開始します。RHCS 3 以降ではデバイスクラス名を使用する場合があります。
- 目的
- ルールのコンポーネント。
- 必須
- Yes
- 例
-
step take data
step take data class ssd
- step choose firstn <num> type <bucket-type>
- 説明
特定タイプのバケット数を選択します。通常、この数はプール内のレプリカ数です (プールサイズ)。
-
<num> == 0
の場合は、pool-num-replicas
バケット (利用可能なすべて) を選択します。 -
<num> > 0 && < pool-num-replicas
の場合は、多くのバケットを選択します。 -
<num> < 0
の場合、これはpool-num-replicas - {num}
を意味します。
-
- 目的
- ルールのコンポーネント。
- 前提条件
-
step take
またはstep choose
の後に行います。 - 例
-
step choose firstn 1 type row
- step chooseleaf firstn <num> type <bucket-type>
- 詳細
{bucket-type}
のバケットのセットを選択し、バケットのセットの各バケットのサブツリーからリーフノードを選択します。セットのバケット数は、通常プール内のレプリカ数です (プールサイズ)。-
<num> == 0
の場合は、pool-num-replicas
バケット (利用可能なすべて) を選択します。 -
<num> > 0 && < pool-num-replicas
の場合は、多くのバケットを選択します。 -
<num> < 0
の場合、これはpool-num-replicas - <num>
を意味します。
-
- 目的
- ルールのコンポーネント。使い方は、2 つの手順を使用してデバイスを選択する必要がなくなります。
- 前提条件
-
step take
またはstep choose
の後に行います。 - 例
-
step chooseleaf firstn 0 type row
- step emit
- 説明
- 現在の値を出力します。また、スタックを除算します。通常、ルールの最後に使用されますが、同じルール内の異なるツリーを選択する際に使用することもできます。
- 目的
- ルールのコンポーネント。
- 前提条件
-
step choose
の後に行います。 - 例
-
step emit
- firstn versus indep
- 説明
-
CRUSH マップで OSD がダウンする場合に使用する代替ストラテジーを制御します。このルールをレプリケートされたプールで使用する場合はこれを
firstn
にする必要があります。イレイジャーコーディングされたプールの場合は、indep
にする必要があります。 - 例
-
OSD 1、2、3、4、5 に PG が保存されており、3 が落ちています。最初のシナリオでは、
firstn
モードの場合、CRUSH は、計算を調整して 1 および 2 を選択し、次に 3 を選択しますがそれがダウンしていることを検出したため、再試行して 4 と 5 を選択し、新しい OSD 6 を選択します。最終的な CRUSH マッピングの変更は 1、2、3、4、5 から 1、2、4、5、6 になります。2 つ目のシナリオでは、イレイジャーコーディングされたプールにindep
モードが設定されていると、CRUSH は失敗した OSD 3 の選択を試行し、1、2、3、4、5 から 1、2、6、4、5) の最終変換に 6 を選択します。
指定した CRUSH ルールは複数のプールに割り当てることができますが、単一プールで複数の CRUSH ルールを割り当てることはできません。
2.7.1. ルールの一覧表示
コマンドラインから CRUSH ルールを一覧表示するには、以下を実行します。
ceph osd crush rule list ceph osd crush rule ls
2.7.2. ルールのダンプ
特定の CRUSH ルールの内容をダンプするには、以下を実行します。
ceph osd crush rule dump {name}
2.7.3. 簡単なルールの追加
CRUSH ルールを追加するには、使用する階層のルートノード、複数の複製するバケットタイプ (例: 'rack'、'row' など)、バケットを選択するモードを指定する必要があります。
ceph osd crush rule create-simple {rulename} {root} {bucket-type} {firstn|indep}
Ceph は、chooseleaf
と、指定したタイプのバケットを 1 つ使用してルールを作成します。
以下に例を示します。
ceph osd crush rule create-simple deleteme default host firstn
以下のルールを作成します。
{ "rule_id": 1, "rule_name": "deleteme", "ruleset": 1, "type": 1, "min_size": 1, "max_size": 10, "steps": [ { "op": "take", "item": -1, "item_name": "default"}, { "op": "chooseleaf_firstn", "num": 0, "type": "host"}, { "op": "emit"}]}
RHCS 3 以降のリリースでは、ruleset
はサポートされません。RHCS 2 およびそれ以前の Ceph リリースにおける後方互換性にのみ存在します。
2.7.4. レプリケートされたルールの追加
レプリケートされたプールに CRUSH ルールを作成するには、以下を実行します。
# ceph osd crush rule create-replicated <name> <root> <failure-domain> <class>
詳細は以下のようになります。
-
<name>
: 仮想マシンの名前。 -
<root>
: CRUSH 階層のルート。 -
<failure-domain>
: 障害ドメイン。たとえば、host
またはrack
です。 -
<class>
: ストレージデバイスクラス。たとえば、hdd
またはssd
です。RHCS 3 以降のみ。
以下に例を示します。
# ceph osd crush rule create-replicated fast default host ssd
2.7.5. 実験的コードルールの追加
イレイジャーコードプールで使用する CRUSH ルールを追加するには、ルール名とイレイジャーコードプロファイルを指定できます。
ceph osd crush rule create-erasure {rulename} {profilename}
2.7.6. ルールの削除
ルールを削除するには、以下を実行し、CRUSH ルール名を指定します。
ceph osd crush rule rm {name}