2.2. ディスクの失敗
Ceph は耐障害性を確保できるように設計されているため、Ceph はデータを損失せずに動作が degraded
の状態になっています。Ceph は、データストレージドライブに障害が発生してもも引き続き動作します。degraded
状態は、他の OSD に保存されるデータの追加コピーがストレージクラスター内の他の OSD に自動的にバックフィルされることを意味します。OSD が down
としてマークされる場合は、ドライブに障害が発生したことを意味します。
ドライブに障害が発生すると、最初に OSD ステータスは down
になりますが、ストレージクラスター内 (in
) に残ります。ネットワークの問題は、実際に起動 (up
) していても OSD をダウン (down
) としてマークすることもできます。まず、環境内のネットワークの問題を確認します。ネットワークが問題がないことを確認する場合は、OSD ドライブが失敗した可能性があります。
最新のサーバーは通常、ホットスワップ可能なドライブでデプロイして、障害が発生したドライブをプルし、ノードを停止せずに新しいドライブに置き換えます。ただし、Ceph では、OSD のソフトウェア定義部分を削除する必要もあります。
2.2.1. 障害のある OSD ディスクの置き換え
OSD を置き換える一般的な手順には、OSD をストレージクラスターから削除し、ドライブを置き換えてから OSD を再作成する必要があります。
BlueStore OSD のデータベースパーティションが含まれる BlueStore の block.db
ディスクを置き換える場合、Red Hat は Ansible を使用したすべての OSD の再デプロイのみをサポートします。破損した block.db
ファイルは、その block.db
ファイルに含まれるすべての OSD に影響を与えます。
前提条件
- 稼働中の Red Hat Ceph Storage クラスターがある。
- 障害の発生したディスク。
手順
ストレージクラスターの正常性を確認します。
# ceph health
CRUSH 階層で OSD の場所を特定します。
# ceph osd tree | grep -i down
OSD ノードで、OSD の起動を試行します。
# systemctl start ceph-osd@$OSD_ID
コマンドが OSD がすでに実行されていることを示す場合、ハートビートまたはネットワークの問題がある可能性があります。OSD を再起動できない場合は、ドライブが失敗する可能性があります。
注記OSD が
down
すると、OSD は最終的にout
とマークされます。Ceph Storage では、これは通常の動作です。OSD がout
とマークすると、失敗した OSD のデータのコピーが含まれる他の OSD がバックフィルを開始し、必要な数のコピーがストレージクラスター内に存在していることを確認します。ストレージクラスターがバックフィル状態である間、クラスターの状態はdegraded
になります。Ceph のコンテナー化されたデプロイメントでは、OSD に関連付けられたドライブを参照し、OSD コンテナーを起動します。
# systemctl start ceph-osd@$OSD_DRIVE
コマンドが OSD がすでに実行されていることを示す場合、ハートビートまたはネットワークの問題がある可能性があります。OSD を再起動できない場合は、ドライブが失敗する可能性があります。
注記OSD に関連付けられたドライブは、コンテナー OSD ID をドライブにマッピングして判断できます。
失敗した OSD のマウントポイントを確認します。
注記Ceph のコンテナー化されたデプロイメントでは、OSD がダウンし、OSD ドライブのマウントが解除されるため、
df
を実行してマウントポイントを確認することはできません。別の方法を使用して、OSD ドライブが失敗したかどうかを判別します。たとえば、コンテナーノードからドライブでsmartctl
を実行します。# df -h
OSD を再起動できない場合は、マウントポイントを確認できます。マウントポイントが表示されない場合は、OSD ドライブを再マウントして OSD を再起動することができます。マウントポイントを復元できない場合は、OSD ドライブが失敗している可能性があります。
smartctl
ユーティリティー cab を使用して、ドライブが正常かどうかを確認します。以下に例を示します。# yum install smartmontools # smartctl -H /dev/$DRIVE
ドライブに障害が発生した場合は、それを置き換えなければならない場合があります。
OSD プロセスを停止します。
# systemctl stop ceph-osd@$OSD_ID
FileStore を使用している場合は、ジャーナルをディスクにフラッシュします。
# ceph osd -i $$OSD_ID --flush-journal
Ceph のコンテナー化されたデプロイメントの場合には、OSD に関連付けられたドライブを参照して、OSD コンテナーを停止します。
# systemctl stop ceph-osd@$OSD_DRIVE
ストレージクラスターから OSD を削除します。
# ceph osd out $OSD_ID
失敗した OSD がバックフィルされていることを確認します。
# ceph -w
CRUSH マップから OSD を削除します。
# ceph osd crush remove osd.$OSD_ID
注記この手順は、OSD を永続的に削除し、再デプロイしない場合にのみ必要になります。
OSD の認証キーを削除します。
# ceph auth del osd.$OSD_ID
OSD のキーが一覧表示されていないことを確認します。
# ceph auth list
ストレージクラスターから OSD を削除します。
# ceph osd rm osd.$OSD_ID
障害が発生したドライブパスのマウントを解除します。
注記Ceph のコンテナー化されたデプロイメントでは、OSD がコンテナーがダウンし、OSD ドライブのマウントが解除されます。この場合、マウント解除するものがないため、この手順はスキップできます。
# umount /var/lib/ceph/osd/$CLUSTER_NAME-$OSD_ID
物理ドライブを置き換えます。ノードのハードウェアベンダーのドキュメントを参照してください。ドライブのホットスワップが可能である場合は、障害が発生したドライブを新しいドライブに置き換えます。ドライブがホットスワップできず、ノードに複数の OSD が含まれている場合は、物理ドライブを交換するためにノードを停止する必要がある場合があります。ノードを一時的に停止する必要がある場合は、バックフィルを防ぐためにクラスターを
noout
に設定できます。# ceph osd set noout
ドライブを置き換えて、ノードとその OSD をオンラインに戻したら、
noout
設定を削除します。# ceph osd unset noout
新しいドライブを
/dev/
ディレクトリーの下に表示されるように、ドライブパスを書き留めて作業を続行します。- OSD ドライブを特定し、ディスクをフォーマットします。
OSD を再作成します。
- Ansible の使用
- コマンドラインインターフェイスの使用
CRUSH 階層をチェックして、これが正確であることを確認します。
# ceph osd tree
CRUSH 階層の OSD の場所が適切でない場合は、
move
コマンドを使用して移動できます。# ceph osd crush move $BUCKET_TO_MOVE $BUCKET_TYPE=$PARENT_BUCKET
- OSD がオンラインであることを確認します。
2.2.2. OSD ID の保持中に OSD ドライブの置き換え
障害のある OSD ドライブを置き換える場合は、元の OSD ID および CRUSH マップエントリーを保持できます。
ceph-volume lvm
コマンドのデフォルトは、OSD 用の BlueStore です。FileStore OSD を使用するには、--filestore
、--data
、および --journal
オプションを使用します。
詳細は、OSD データおよびジャーナルドライブの準備 セクションを参照してください。
前提条件
- 稼働中の Red Hat Ceph Storage クラスターがある。
- 障害の発生したディスク。
手順
OSD を破棄します。
ceph osd destroy $OSD_ID --yes-i-really-mean-it
例
$ ceph osd destroy 1 --yes-i-really-mean-it
必要に応じて、交換ディスクを以前使用していた場合は、ディスクを
ザッピングする
必要があります。ceph-volume lvm zap $DEVICE
例
$ ceph-volume lvm zap /dev/sdb
既存の OSD ID で新規 OSD を作成します。
ceph-volume lvm create --osd-id $OSD_ID --data $DEVICE
例
$ ceph-volume lvm create --osd-id 1 --data /dev/sdb