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

Ceph Monitor は、クラスターマップを RocksDB などのキーバリューストアに保存します。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.7.1. BlueStore の使用時の Ceph Monitor ストアのリカバリー

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

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

警告

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

前提条件

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

手順

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

    1. ceph-volume コマンドを使用してデータパーティションをリスト表示します。

      例:

      [ceph: root@host01 /]# ceph-volume lvm 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@host01 ~]# cd /root/
      [root@host01 ~]# ms=/tmp/monstore/
      [root@host01 ~]# db=/root/db/
      [root@host01 ~]# db_slow=/root/db.slow/
      
      [root@host01 ~]# mkdir $ms
      [root@host01 ~]# 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. 適切なケーパビリティーを設定します。

      例:

      [ceph: root@host01 /]# ceph-authtool /etc/ceph/ceph.client.admin.keyring -n mon. --cap mon 'allow *' --gen-key
      [ceph: root@host01 /]# 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 ファイルを一時的な場所に移動します。

      例:

      [ceph: root@host01 /]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db

    4. 収集したマップから Monitor ストアを再構築します。

      例:

      [ceph: root@host01 /]# 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. すべてのノードで一時的にマウントされたすべての OSD をアンマウントします。

    例:

    [root@host01 ~]# umount /var/lib/ceph/osd/ceph-*

  4. すべての Ceph Monitor デーモンを起動します。

    構文

    systemctl start ceph-FSID@DAEMON_NAME

    例:

    [root@mon ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@mon.host01.service

  5. Monitor がクォーラムを形成できることを確認します。

    構文

    ceph -s

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

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

    構文

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

    例:

    [root@host01 ~]# systemctl start ceph-b341e254-b165-11ed-a564-ac1f6bb26e8c@mgr.extensa003.exrqql.service

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

  7. すべての OSD ノード全体ですべての OSD プロセスを起動します。クラスター上のすべての OSD に対して繰り返します。

    構文

    systemctl start ceph-FSID@osd.OSD_ID

    例:

    [root@host01 ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@osd.0.service

  8. OSD がサービスに返されることを確認します。

    例:

    [ceph: root@host01 /]# ceph -s

関連情報