検索

第12章 OpenShift Data Foundation での ceph-monitor クォーラムの復元

download PDF

状況によっては、ceph-mons がクォーラムを失う可能性があります。mons が再びクォーラムを形成できない場合は、クォーラムを再度取得する手動の手順があります。唯一の要件は、1 つ以上の mon が正常である必要があることです。以下の手順は、正常でない mon をクォーラムから削除し、単一の mon でクォーラムを再度作成してから、クォーラムを元のサイズに戻すことができます。

たとえば、3 つの mons があり、クォーラムが失われる場合は、クォーラムから 2 つの悪い mons を削除して、適切な mon がクォーラムの唯一の mon であることを通知してから、適切なmon を再起動する必要があります。

手順

  1. monmap を変更する場合に mons がフェイルオーバーしないように、rook-ceph-operator を停止します。

    # oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0
  2. 新しい monmap を注入します。

    警告

    monmap は非常に慎重に注入する必要があります。誤って実行すると、クラスターは永続的に破棄される可能性があります。Ceph monmap は、mon クォーラムを追跡します。monmap は、正常な mon のみが含まれるように更新されます。この例では、正常な mon は rook-ceph-mon-b ですが、正常でない monrook-ceph-mon-a および rook-ceph-mon-c になります。

    1. 現在の rook-ceph-mon-b デプロイメントのバックアップを作成します。

      # oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yaml
    2. YAML ファイルを開き、コマンド および 引数mon コンテナーからコピーします (以下の例の containers リストを参照)。これは、monmap の変更に必要です。

      [...]
        containers:
        - args:
          - --fsid=41a537f2-f282-428e-989f-a9e07be32e47
          - --keyring=/etc/ceph/keyring-store/keyring
          - --log-to-stderr=true
          - --err-to-stderr=true
          - --mon-cluster-log-to-stderr=true
          - '--log-stderr-prefix=debug '
          - --default-log-to-file=false
          - --default-mon-cluster-log-to-file=false
          - --mon-host=$(ROOK_CEPH_MON_HOST)
          - --mon-initial-members=$(ROOK_CEPH_MON_INITIAL_MEMBERS)
          - --id=b
          - --setuser=ceph
          - --setgroup=ceph
          - --foreground
          - --public-addr=10.100.13.242
          - --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db
          - --public-bind-addr=$(ROOK_POD_IP)
          command:
          - ceph-mon
      [...]
    3. コピーした command および args フィールドを、以下のように貼り付け可能なコマンドを形成するためにクリーンアップします。

      # ceph-mon \
          --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
          --keyring=/etc/ceph/keyring-store/keyring \
          --log-to-stderr=true \
          --err-to-stderr=true \
          --mon-cluster-log-to-stderr=true \
          --log-stderr-prefix=debug \
          --default-log-to-file=false \
          --default-mon-cluster-log-to-file=false \
          --mon-host=$ROOK_CEPH_MON_HOST \
          --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
          --id=b \
          --setuser=ceph \
          --setgroup=ceph \
          --foreground \
          --public-addr=10.100.13.242 \
          --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
          --public-bind-addr=$ROOK_POD_IP
      注記

      --log-stderr-prefix フラグおよび括弧の周りの一重引用符を必ず削除し、ROOK_CEPH_MON_HOSTROOK_CEPH_MON_INITIAL_MEMBERS、および ROOK_POD_IP) に渡されます。

    4. rook-ceph-mon-b デプロイメントにパッチを適用し、mon Pod を削除せずにこの mon の作業を停止します。

      # oc -n openshift-storage patch deployment rook-ceph-mon-b  --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]'
      
      # oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'
    5. mon-b Pod で以下の手順を実行します。

      1. 正常な mon の Pod に接続し、以下のコマンドを実行します。

        # oc -n openshift-storage exec -it <mon-pod> bash
      2. 変数を設定します。

        # monmap_path=/tmp/monmap
      3. ceph mon を適切なmon デプロイメントから貼り付け、--extract-monmap=${monmap_path} フラグを追加して、monmap をファイルにデプロイメントします。

        # ceph-mon \
               --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
               --keyring=/etc/ceph/keyring-store/keyring \
               --log-to-stderr=true \
               --err-to-stderr=true \
               --mon-cluster-log-to-stderr=true \
               --log-stderr-prefix=debug \
               --default-log-to-file=false \
               --default-mon-cluster-log-to-file=false \
               --mon-host=$ROOK_CEPH_MON_HOST \
               --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
               --id=b \
               --setuser=ceph \
               --setgroup=ceph \
               --foreground \
               --public-addr=10.100.13.242 \
               --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
               --public-bind-addr=$ROOK_POD_IP \
               --extract-monmap=${monmap_path}
      4. monmap の内容を確認します。

        # monmaptool --print /tmp/monmap
      5. monmap から不正な mons を削除します。

        # monmaptool ${monmap_path} --rm <bad_mon>

        この例では、mon0 および mon2 を削除します。

        # monmaptool ${monmap_path} --rm a
        # monmaptool ${monmap_path} --rm c
      6. ceph mon コマンドを貼り付け、--inject-monmap=${monmap_path} フラグを以下のように追加することで、変更した monmap を適切な mon に挿入します。

        # ceph-mon \
               --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
               --keyring=/etc/ceph/keyring-store/keyring \
               --log-to-stderr=true \
               --err-to-stderr=true \
               --mon-cluster-log-to-stderr=true \
               --log-stderr-prefix=debug \
               --default-log-to-file=false \
               --default-mon-cluster-log-to-file=false \
               --mon-host=$ROOK_CEPH_MON_HOST \
               --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
               --id=b \
               --setuser=ceph \
               --setgroup=ceph \
               --foreground \
               --public-addr=10.100.13.242 \
               --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
               --public-bind-addr=$ROOK_POD_IP \
               --inject-monmap=${monmap_path}
      7. シェルを終了して続行します。
  3. Rook configmaps を編集します。

    1. Operator が mon を追跡するのに使用する configmap を編集します。

      # oc -n openshift-storage edit configmap rook-ceph-mon-endpoints
    2. data 要素で、以下のような 3 つの mon(または moncount に応じて) が表示されることを確認します。

      data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789
    3. リストから問題の mon を削除し、末尾に適切な mon を 1 つ削除します。以下に例を示します。

      data: b=10.100.13.242:6789
    4. ファイルを保存して終了します。
    5. ここで、mons およびその他のコンポーネントに使用される Secret を調整する必要があります。

      1. 変数 good_mon_id の値を設定します。

        以下に例を示します。

        # good_mon_id=b
      2. oc patch コマンドを使用して、rook-ceph-config シークレットにパッチを適用し、mon_host および mon_initial_members の 2 つのキー/値のペアを更新できます。

        # mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}')
        
        # oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
        注記

        hostNetwork: true を使用している場合は、mon_host 変数を mon がピニングされるノード IP (nodeSelector) に置き換える必要があります。これは、mode で作成された rook-ceph-mon-* サービスがないためです。

  4. mon を再起動します。

    変更を取得するには、元の ceph-mon コマンドで適切な mon Pod を再起動する必要があります。

    1. mon デプロイメント YAML ファイルのバックアップで oc replace コマンドを使用します。

      # oc replace --force -f rook-ceph-mon-b-deployment.yaml
      注記

      --force オプションはデプロイメントを削除し、新たに作成します。

    2. クラスターのステータスを確認します。

      ステータスは、クォーラムの mon が 1 つ表示されるはずです。ステータスが適切であれば、クラスターは再度正常であるはずです。

  5. クォーラムにある 2 つの mon デプロイメントを削除します。

    以下に例を示します。

    # oc delete deploy <rook-ceph-mon-1>
    # oc delete deploy <rook-ceph-mon-2>

    この例では、削除するデプロイメントは rook-ceph-mon-a および rook-ceph-mon-c です。

  6. Operator を再起動します。

    1. rook Operator を再び起動し、クラスターの健全性の監視を再開します。

      注記

      多数のリソースがすでに存在するエラーを無視するのは安全です。

      # oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1

      Operator は mons をさらに追加し、mon 数に応じて再びクォーラムサイズを増やします。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.