2.7. CRUSH ルール
CRUSH ルールは、Ceph クライアントがバケットとそれら内の OSD を選択する方法を定義し、プライマリー OSD がバケットとセカンダリー OSD を選択してレプリカやコーディングのチャンクを保存する方法を定義します。たとえば、2 つのオブジェクトレプリカ用に SSD がサポートするターゲット OSD と、3 つのレプリカ用に SAS ドライブがサポートする 3 つのターゲット OSD を選択するルールを作成できます。
ルールは以下の形式を取ります。
rule <rulename> {
id <unique number>
type [replicated | erasure]
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
}
- id
- 説明
- ルールを識別するための一意の整数。
- 目的
- ルールマスクのコンポーネント。
- 型
- Integer
- 必須
- Yes
- デフォルト
-
0
- type
- 説明
- レプリケートまたはイレイジャーコーディングされたストレージドライブのルールを説明しています。
- 目的
- ルールマスクのコンポーネント。
- 型
- String
- 必須
- Yes
- デフォルト
-
replicated - 有効な値
-
現在は
replicatedのみ
- min_size
- 説明
- プールがこの数よりも小さいレプリカを使用する場合、CRUSH はこのルールを選択しません。
- 型
- Integer
- 目的
- ルールマスクのコンポーネント。
- 必須
- Yes
- デフォルト
-
1
- max_size
- 説明
- プールがこの数を超えるレプリカを行うと、CRUSH はこのルールを選択しません。
- 型
- Integer
- 目的
- ルールマスクのコンポーネント。
- 必須
- Yes
- デフォルト
-
10
- step take <bucket-name> [class <class-name>]
- 説明
- バケット名を取り、ツリーを下ってのイテレートを開始します。
- 目的
- ルールのコンポーネント。
- 必須
- Yes
- 例
-
step take datastep 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
以下のルールを作成します。
{ "id": 1,
"rule_name": "deleteme",
"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"}]}
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です。
以下に例を示します。
# ceph osd crush rule create-replicated fast default host ssd
2.7.5. 実験的コードルールの追加 リンクのコピーリンクがクリップボードにコピーされました!
イレイジャーコードプールで使用する CRUSH ルールを追加するには、ルール名とイレイジャーコードプロファイルを指定できます。
構文
ceph osd crush rule create-erasure {rulename} {profilename}
例
[ceph: root@host01 /]# ceph osd crush rule create-erasure default default
関連情報
- 詳細は、イレージャーコードプロファイル を参照してください。
2.7.6. ルールの削除 リンクのコピーリンクがクリップボードにコピーされました!
ルールを削除するには、以下を実行し、CRUSH ルール名を指定します。
ceph osd crush rule rm {name}