2.3. CRUSH の Ceph OSD
OSD の CRUSH 階層を作成したら、OSD を CRUSH 階層に追加します。既存の階層から OSD を移動または削除することもできます。Ceph CLI の使用には、以下の値が使用できます。
- id
- 説明
- OSD の数値 ID。
- タイプ
- 整数
- 必須
- Yes
- 例
-
0
- name
- 説明
- OSD のフルネーム。
- タイプ
- 文字列
- 必須
- Yes
- 例
-
osd.0
- weight
- 説明
- OSD の CRUSH 加重。
- タイプ
- double
- 必須
- Yes
- 例
-
2.0
- root
- 説明
- OSD が存在する階層またはツリーのルートバケットの名前。
- タイプ
- キーと値のペア。
- 必須
- Yes
- 例
-
root=default
、root=replicated_rule
など
- bucket-type
- 説明
- 1 つ以上の name-value ペア。ここで、名前はバケットタイプで、値はバケットの名前になります。CRUSH 階層で OSD の CRUSH の場所を指定できます。
- タイプ
- キーと値のペア。
- 必須
- No
- 例
-
datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
2.3.1. CRUSH での OSD の表示
ceph osd crush tree
コマンドは、CRUSH バケットと項目をツリービューで出力します。このコマンドを使用して、特定のバケット内の OSD の一覧を確認します。ceph osd tree
のような出力が表示されます。
詳細情報を返すには、以下のコマンドを実行します。
# ceph osd crush tree -f json-pretty
このコマンドは、以下のような出力を返します。
[ { "id": -2, "name": "ssd", "type": "root", "type_id": 10, "items": [ { "id": -6, "name": "dell-per630-11-ssd", "type": "host", "type_id": 1, "items": [ { "id": 6, "name": "osd.6", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] }, { "id": -7, "name": "dell-per630-12-ssd", "type": "host", "type_id": 1, "items": [ { "id": 7, "name": "osd.7", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] }, { "id": -8, "name": "dell-per630-13-ssd", "type": "host", "type_id": 1, "items": [ { "id": 8, "name": "osd.8", "type": "osd", "type_id": 0, "crush_weight": 0.099991, "depth": 2 } ] } ] }, { "id": -1, "name": "default", "type": "root", "type_id": 10, "items": [ { "id": -3, "name": "dell-per630-11", "type": "host", "type_id": 1, "items": [ { "id": 0, "name": "osd.0", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 3, "name": "osd.3", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] }, { "id": -4, "name": "dell-per630-12", "type": "host", "type_id": 1, "items": [ { "id": 1, "name": "osd.1", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 4, "name": "osd.4", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] }, { "id": -5, "name": "dell-per630-13", "type": "host", "type_id": 1, "items": [ { "id": 2, "name": "osd.2", "type": "osd", "type_id": 0, "crush_weight": 0.449997, "depth": 2 }, { "id": 5, "name": "osd.5", "type": "osd", "type_id": 0, "crush_weight": 0.289993, "depth": 2 } ] } ] } ]
RHCS 3 以降では、OSD オブジェクトには device_class
属性も含まれます。
2.3.2. OSD の CRUSH への追加
OSD を CRUSH 階層に追加することは、OSD を起動する前の最後のステップ (up
および in
を編集する) であり、Ceph は配置グループを OSD に割り当てます。
RHCS 3 では、デバイスクラスも追加できます。
OSD を準備してから、CRUSH 階層を追加する必要があります。Ansible 自動化アプリケーションなどのデプロイメントユーティリティーで、このステップを実行します。詳細は、OSD の追加/削除を参照してください。
CRUSH 階層は概念であるため、ceph osd crush add
コマンドを使用すると、希望する場所の CRUSH 階層に OSD を追加できます。指定する場所は、実際の場所を反映している はず です。少なくとも 1 つのバケットを指定すると、コマンドにより OSD を指定する最も具体的なバケットに配置され、かつ そのバケットは指定した他のバケットの下に移動します。
OSD を CRUSH 階層に追加するには、以下を実行します。
ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]
root バケットのみを指定した場合、このコマンドは OSD を直接ルートに割り当てます。ただし、CRUSH ルールは OSD がホストまたはシャーシの内部にあり、ホストまたはシャーシはクラスタートポロジーを反映する他のバケットの内部にある 必要 があります。
以下の例では、osd.0
を階層に追加します。
ceph osd crush add osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
ceph osd crush set
または ceph osd crush create-or-move
を使用して、OSD を CRUSH 階層に追加することもできます。
2.3.3. CRUSH 階層内での OSD の移動
Ansible 自動化アプリケーションなど、デプロイメントユーティリティーで OSD が準最適な CRUSH ロケーションで CRUSH マップに追加された場合や、クラスタートポロジーが変更された場合は、CRUSH 階層内の OSD を移動して実際の場所を反映させることができます。
CRUSH 階層で OSD を移動すると、Ceph は OSD に割り当てられる配置グループを再計算することを意味します。これにより、データが大幅に再分配される可能性があります。
CRUSH 階層内の OSD を移動するには、以下を実行します。
ceph osd crush set {id-or-name} {weight} root={pool-name} [{bucket-type}={bucket-name} ...]
ceph osd crush create-or-move
を使用して、CRUSH 階層内で OSD を移動することもできます。
2.3.4. CRUSH 階層からの OSD の削除
CRUSH 階層からの OSD 削除は、クラスターから OSD を削除する場合の最初の手順となります。CRUSH マップから OSD を削除すると、CRUSH は配置グループおよびデータリバランスを取得する OSD が再計算されます。詳細は、OSD の追加/削除を参照してください。
実行中のクラスターの CRUSH マップから OSD を削除するには、以下を実行します。
ceph osd crush remove {name}