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