4.8. Ceph Monitor ストアのリカバリー

Ceph Monitor は、クラスターマップを LevelDB などのキーバリューストアに保存します。Monitor 上でストアが破損した場合、Monitor は異常終了し、再起動できなくなります。Ceph ログには以下のエラーが含まれる場合があります。

Corruption: error in middle of record
Corruption: 1 missing files; e.g.: /var/lib/ceph/mon/mon.0/store.db/1234567.ldb

実稼働の Red Hat Ceph Storage クラスターは少なくとも 3 つの Ceph Monitor を使用しており、1 つが故障しても別のものと交換できます。ただし、特定の状況では、すべての Ceph Monitor のストアが破損する可能性があります。たとえば、Ceph Monitor ノードのディスクやファイルシステムの設定が正しくない場合、停電によって基礎となるファイルシステムが破損する可能性があります。

すべての Ceph Monitor で破損がある場合には、ceph-monstore-tool および ceph-objectstore-tool と呼ばれるユーティリティーを使用して、OSD ノードに保管された情報で復元することができます。

重要

これらの手順は、以下の情報を復元できません。

  • Metadata Daemon Server (MDS) キーリングおよびマップ
  • 配置グループの設定:

    • ceph pg set_full_ratio コマンドを使用して設定する full ratio
    • ceph pg set_nearfull_ratio コマンドを使用して設定するほぼ nearfull ratio
重要

古いバックアップから Ceph Monitor ストアを復元しないでください。以下の手順に従って、現在のクラスター状態から Ceph Monitor ストアを再構築し、そこから復元します。

4.8.1. BlueStore の使用時の Ceph Monitor ストアのリカバリー

Ceph Monitor ストアがすべての Ceph Monitor で破損し、BlueStore バックエンドを使用する場合には、以下の手順に従います。

コンテナー化環境でこの方法を使用する場合、Ceph リポジトリーをアタッチし、最初にコンテナー化されていない Ceph Monitor に復元する必要があります。

警告

この手順では、データが失われる可能性があります。この手順で不明な点がある場合は、Red Hat テクニカルサポートに連絡して、リカバリープロセスの支援を受けてください。

前提条件

  • ベアメタルデプロイメント

    • rsync パッケージおよび ceph-test パッケージがインストールされています。
  • コンテナーデプロイメント

    • すべての OSD コンテナーが停止します。
    • ロールに基づいて Ceph ノードで Ceph リポジトリーを有効にします。
    • ceph-test パッケージおよび rsync パッケージが OSD および Monitor ノードにインストールされている。
    • ceph-mon パッケージが Monitor ノードにインストールされている。
    • ceph-osd パッケージが OSD ノードにインストールされている。

手順

  1. コンテナー で Ceph を使用する場合は、Ceph データを含むすべてのディスクを一時的な場所にマウントします。すべての OSD ノードに対してこの手順を繰り返します。

    1. データパーティションをリスト表示します。デバイスの設定に使用したユーティリティーに応じて、ceph-volume または ceph-disk を使用します。

      [root@osd ~]# ceph-volume lvm list

      または

      [root@osd ~]# ceph-disk list
    2. データパーティションを一時的な場所にマウントします。

      mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-$i
    3. SELinux コンテキストを復元します。

      for i in {OSD_ID}; do restorecon /var/lib/ceph/osd/ceph-$i; done

      OSD_ID を、OSD ノード上の Ceph OSD ID の数値のスペース区切りリストに置き換えます。

    4. 所有者とグループを ceph:ceph に変更します。

      for i in {OSD_ID}; do chown -R ceph:ceph /var/lib/ceph/osd/ceph-$i; done

      OSD_ID を、OSD ノード上の Ceph OSD ID の数値のスペース区切りリストに置き換えます。

      重要

      update-mon-db コマンドが Monitor データベースに追加の db ディレクトリーおよび db.slow ディレクトリーを使用するバグにより、このディレクトリーもコピーする必要があります。これを行うには、以下を行います。

      1. コンテナー外部の一時的な場所を準備して、OSD データベースをマウントしてアクセスし、Ceph Monitor を復元するために必要な OSD マップをデプロイメントします。

        ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev OSD-DATA --path /var/lib/ceph/osd/ceph-OSD-ID

        OSD-DATA は OSD データへのボリュームグループ (VG) または論理ボリューム (LV) パスに、OSD-ID は OSD の ID に置き換えます。

      2. BlueStore データベースと block.db との間のシンボリックリンクを作成します。

        ln -snf BLUESTORE DATABASE /var/lib/ceph/osd/ceph-OSD-ID/block.db

        BLUESTORE-DATABASE を BlueStore データベースへのボリュームグループ (VG) または論理ボリューム (LV) パスに置き換え、OSD-ID を OSD の ID に置き換えます。

  2. 破損したストアのある Ceph Monitor ノードから次のコマンドを使用します。すべてのノードのすべての OSD に対してこれを繰り返します。

    1. すべての OSD ノードからクラスターマップを収集します。

      [root@ mon~]# cd /root/
      [root@mon ~]# ms=/tmp/monstore/
      [root@mon ~]# db=/root/db/
      [root@mon ~]# db_slow=/root/db.slow/
      
      [root@mon ~]# mkdir $ms
      [root@mon ~]# for host in $osd_nodes; do
                      echo "$host"
                      rsync -avz $ms $host:$ms
                      rsync -avz $db $host:$db
                      rsync -avz $db_slow $host:$db_slow
      
                      rm -rf $ms
                      rm -rf $db
                      rm -rf $db_slow
      
                      sh -t $host <<EOF
                        for osd in /var/lib/ceph/osd/ceph-*; do
                          ceph-objectstore-tool --type bluestore --data-path \$osd --op update-mon-db --mon-store-path $ms
      
                         done
                      EOF
      
                            rsync -avz $host:$ms $ms
                            rsync -avz $host:$db $db
                            rsync -avz $host:$db_slow $db_slow
                      done
    2. 適切なケーパビリティーを設定します。

      [root@mon ~]# ceph-authtool /etc/ceph/ceph.client.admin.keyring -n mon. --cap mon 'allow *' --gen-key
      [root@mon ~]# cat /etc/ceph/ceph.client.admin.keyring
        [mon.]
          key = AQCleqldWqm5IhAAgZQbEzoShkZV42RiQVffnA==
          caps mon = "allow *"
        [client.admin]
          key = AQCmAKld8J05KxAArOWeRAw63gAwwZO5o75ZNQ==
          auid = 0
          caps mds = "allow *"
          caps mgr = "allow *"
          caps mon = "allow *"
          caps osd = "allow *"
    3. db ディレクトリーおよび db.slow ディレクトリーから、すべての sst ファイルを一時的な場所に移動します。

      [root@mon ~]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db
    4. 収集したマップから Monitor ストアを再構築します。

      [root@mon ~]# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /etc/ceph/ceph.client.admin
      注記

      このコマンドを実行後に、OSD から抽出したキーリングと、ceph-monstore-tool コマンドラインで指定されたキーリングのみが Ceph の認証データベースにあります。クライアント、Ceph Manager、Ceph Object Gateway などの他のすべてのキーリングを再作成またはインポートし、それらのクライアントがクラスターにアクセスできるようにする必要があります。

    5. 破損したストアをバックアップします。すべての Ceph Monitor ノードでこの手順を繰り返します。

      mv /var/lib/ceph/mon/ceph-HOSTNAME/store.db /var/lib/ceph/mon/ceph-HOSTNAME/store.db.corrupted

      HOSTNAME は、Ceph Monitor ノードのホスト名に置き換えます。

    6. 破損したストアを交換します。すべての Ceph Monitor ノードでこの手順を繰り返します。

      scp -r /tmp/monstore/store.db HOSTNAME:/var/lib/ceph/mon/ceph-HOSTNAME/

      HOSTNAME は、Monitor ノードのホスト名に置き換えます。

    7. 新しいストアの所有者を変更します。すべての Ceph Monitor ノードでこの手順を繰り返します。

      chown -R ceph:ceph /var/lib/ceph/mon/ceph-HOSTNAME/store.db

      HOSTNAME は、Ceph Monitor ノードのホスト名に置き換えます。

  3. コンテナーで Ceph を使用する場合は、すべてのノードで一時的にマウントされた OSD をアンマウントします。

    [root@osd ~]# umount /var/lib/ceph/osd/ceph-*
  4. すべての Ceph Monitor デーモンを起動します。

    [root@mon ~]# systemctl start ceph-mon *
  5. Monitor がクォーラムを形成できることを確認します。

    • ベアメタルデプロイメント

      [root@mon ~]# ceph -s
    • コンテナー

      [user@admin ~]$ docker exec ceph-mon-_HOSTNAME_ ceph -s

      HOSTNAME は、Ceph Monitor ノードのホスト名に置き換えます。

  6. Ceph Manager キーリングをインポートして、すべての Ceph Manager プロセスを起動します。

    ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring
    systemctl start ceph-mgr@HOSTNAME

    HOSTNAME は、Ceph Manager ノードのホスト名に置き換えてください。

  7. すべての OSD ノード全体ですべての OSD プロセスを起動します。

    [root@osd ~]# systemctl start ceph-osd *
  8. OSD がサービスに返されることを確認します。

    • ベアメタルデプロイメント

      [root@mon ~]# ceph -s
    • コンテナー

      [user@admin ~]$ docker exec ceph-mon-_HOSTNAME_ ceph -s

      HOSTNAME は、Ceph Monitor ノードのホスト名に置き換えます。

関連情報