2.2. CRUSH 階層
CRUSH マップは転送されたグラフであるため、複数の階層に対応することができます (例: パフォーマンスドメイン)。CRUSH 階層を作成し、変更する方法は Ceph CLI で行いますが、CRUSH マップのコンパイル、編集、再コンパイル、およびアクティブ化することもできます。
Ceph CLI でバケットインスタンスを宣言する場合には、そのタイプを指定して一意の名前 (文字列) を指定する必要があります。Ceph はバケット ID を自動的に割り当て、アルゴリズムを straw
に設定しrjenkins1
を反映してハッシュを 0
に設定し、重みを設定します。コンパイルされていない CRUSH マップを変更する場合は、バケットに負の整数 (任意) として表現される一意の ID を割り当て、アイテムの合計容量/機能に対する重みを指定し、バケットアルゴリズム (通常は straw
)、およびハッシュ (通常はハッシュアルゴリズム rjenkins1
を反映させ 0
)。
バケットには 1 つ以上の項目を指定できます。項目は、ノードバケット (ラック、行、ホストなど)、またはリーフ (OSD ディスクなど) で構成されます。項目は、項目の相対的な重みを反映する重みを指定できます。
コンパイルした CRUSH マップを変更する場合、以下の構文でノードバケットを宣言できます。
[bucket-type] [bucket-name] { id [a unique negative numeric ID] weight [the relative capacity/capability of the item(s)] alg [the bucket type: uniform | list | tree | straw ] hash [the hash type: 0 by default] item [item-name] weight [weight] }
たとえば、上図を使用すると、ホストバケットと 1 つのラックバケットを 2 つ定義します。OSD は、ホストバケット内の項目として宣言されます。
host node1 { id -1 alg straw hash 0 item osd.0 weight 1.00 item osd.1 weight 1.00 } host node2 { id -2 alg straw hash 0 item osd.2 weight 1.00 item osd.3 weight 1.00 } rack rack1 { id -3 alg straw hash 0 item node1 weight 2.00 item node2 weight 2.00 }
前の例では、ラックバケットに OSD が含まれていないことに注意してください。低レベルホストバケットが含まれ、項目エントリーでの重みの合計が含まれます。
2.2.1. CRUSH の場所
CRUSH の場所は、CRUSH マップの階層に関して OSD の場所です。コマンドラインインターフェースで CRUSH の場所を表すと、CRUSH の場所指定子は、OSD の場所を説明する名前/値のペアの一覧を取得します。たとえば、OSD が特定の行、ラック、シャーシ、およびホストにあり、default
の CRUSH ツリーの一部である場合、そのクラッシュの場所は以下のように記述できます。
root=default row=a rack=a2 chassis=a2a host=a2a1
注記:
- キーの順序は問題にはなりません。
-
キー名 (
=
の左) は有効な CRUSHtype
である必要があります。デフォルトでは、これには、root
、datacenter
、room
、row
、pod
、pdu
、rack
、chassis
、およびhost
が含まれます。CRUSH マップを編集して、ニーズに合わせてタイプを変更できます。 -
すべての buckets/keys を指定する必要はありません。たとえば、デフォルトでは Ceph は
ceph-osd
デーモンの場所をroot=default host={HOSTNAME}
に自動的に設定します (hostname -s
からの出力に基づいています)。
2.2.1.1. デフォルトの ceph-crush-location
フック
起動時に、Ceph は、デフォルトで ceph-crush-location
ツールを使用して各デーモンの CRUSH の場所を取得します。ceph-crush-location
ユーティリティーは、指定のデーモンの CRUSH の場所を返します。その CLI の使用は以下で構成されます。
ceph-crush-location --cluster {cluster-name} --id {ID} --type {daemon-type}
たとえば、以下のコマンドは OSD.0
の場所を返します。
ceph-crush-location --cluster ceph --id 0 --type osd
デフォルトでは、ceph-crush-location
ユーティリティーは、指定のデーモンの CRUSH の場所文字列を返します。優先順位順に返される場所は以下に基づきます。
-
Ceph 設定ファイルの
{TYPE}_crush_location
オプションたとえば、OSD デーモンの場合、{TYPE}
はosd
のようになり、設定はosd_crush_location
となります。 -
Ceph 設定ファイル内の特定のデーモン用の
crush_location
オプション。 -
root=default host=HOSTNAME
のデフォルト。ホスト名がhostname -s
コマンドで返されます。
典型的なデプロイメントシナリオでは、プロビジョニングソフトウェア (またはシステム管理者) は単にホストの Ceph 設定ファイルの crush_location
フィールドを設定して、データセンターまたはクラスター内でのマシンの場所を記述できます。これにより、Ceph デーモンおよびクライアントに対して以下のような場所を認識できます。
2.2.1.2. カスタムロケーションフック
カスタムの場所フックは、階層内の OSD デーモン配置の汎用フックの代わりに使用できます。(起動時に、各 OSD の位置が正しいことを確認します)。
osd_crush_location_hook = /path/to/script
このフックは複数の引数が渡され (以下)、CRUSH の場所の説明で単一行を stdout
(標準出力) に出力する必要があります。
ceph-crush-location --cluster {cluster-name} --id {ID} --type {daemon-type}
--cluster
名前は通常「ceph」で、--id
はデーモン識別子 (OSD 番号) に、デーモン --type
は通常 osd
です。