sql >> データベース >  >> NoSQL >> MongoDB

MongoDBで暴走インデックスビルドを停止する方法

    MongoDBでのインデックスのビルドは、MongoDBクラスターの可用性に悪影響を与える可能性があります。本番サーバー上の大規模なコレクションでフォアグラウンドインデックスビルドをトリガーすると、インデックスビルドが完了するまでクラスターが応答しない場合があります。大規模なコレクションでは、MongoDBのインデックス作成の危険性で説明されているように、これには数時間または数日かかる場合があります。

    推奨されるベストプラクティスは、バックグラウンドでインデックスビルドをトリガーすることですが、大規模なコレクションインデックスでは、このアプローチで複数の問題が発生しています。 3ノードクラスターの場合、両方のセカンダリがインデックスの作成を開始し、要求への応答を停止します。その結果、プライマリにはクォーラムがなく、クラスタを停止するセカンダリ状態に移行します。また、コマンドラインからトリガーされるデフォルトのインデックスビルドはフォアグラウンドインデックスビルドであるため、これは現在広く普及している問題です。将来のリリースでは、これがデフォルトでバックグラウンドになることを期待しています。

    インデックスをトリガーした後は、サーバーを再起動するだけでは問題は解決しません。 MongoDBは、中断したところからインデックスビルドを取得します。再起動後に以前にバックグラウンドインデックスビルドを実行していた場合は、フォアグラウンドインデックスビルドになるため、この場合、再起動すると問題が悪化する可能性があります。

    すでにインデックスビルドをトリガーしている場合、どのようにそれを停止しますか?幸い、インデックスの作成を停止するのは比較的簡単です。

    オプション1:インデックスビルドプロセスを強制終了します

    db.currentOp()を使用してインデックスビルドプロセスを見つけ、db.killOp()を使用して操作を強制終了します。インデックス操作は次のようになります。

    {
    "opid" : 820659355,
    "active" : true,
    "lockType" : "write",
    ....
    "op" : "insert",
    "ns" : "xxxx",
    "query" : {
    },
    "client" : "xxxx",
    "desc" : "conn",
    "msg" : "index: (2/3) btree bottom up 292168587/398486401 64%"
    }
    

    インデックスが構築されているノードが新しい接続に応答しない場合、またはkillOpが機能しない場合は、以下のオプション2を使用してください。

    オプション2:「noIndexBuildRetry」の構成と再起動

    MongoDBには、再起動時に不完全なインデックスの作成を停止するようにMongoDBに指示する「–noIndexBuildRetry」オプションがあります。

    このパラメーターは、mongodプロセスのパラメーターとしてのみ、構成ファイルからサポートされているようには見えません。このオプションを使用してmongodを手動で実行することはお勧めしません。これは、誤ってmongodプロセスを昇格したユーザー(rootなど)として実行すると、すべてのファイルの権限が変更されるためです。また、「ルート」として実行すると、プロセスを再びmongodとして実行する際に断続的な問題が発生しました。

    より簡単なオプションは、/ etc / init.d/mongodファイルを編集することです。この行を探します:

    OPTIONS=" -f $CONFIGFILE"
    

    次の行に置き換えます:

    OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
    

    詳細な手順

    このディスカッションの目的で、CentOS / RedHat /AmazonLinuxの手順を提供します。

    1. 「–noIndexBuildRetry」を構成します

      上記で説明したように、すべてのデータノードに「–noIndexBuildRetry」オプションを追加します。

    2. インデックスを作成しているすべてのノードを再起動します

      各データサーバーのmongodログファイルを見て、インデックスを構築しているかどうかを判断します。そうである場合は、サーバー「servicemongodrestart」を再起動します。

    3. 不完全なインデックスを削除する

      関連するすべてのノードが再起動されたら、インデックスのリストを確認し、リストに不完全なインデックスが表示されている場合は削除します。

    4. 「–noIndexBuildRetry」を削除

      /etc/init.d/mongodファイルを編集して、手順1で追加した–noIndexBuildRetryオプションを削除し、インデックスビルドを再開するデフォルトの動作に戻すことができるようにします。

    ご不明な点がございましたら、[email protected]までお問い合わせください。

    インデックス作成をお楽しみください。


    1. Redis-エラー:値は有効なfloatではありません

    2. Beanstalkdと同様のCLIを使用してRedisをキューエンジンとして監視するにはどうすればよいですか?

    3. systemdをinitシステム(PID 1)としてシステムを起動していません。操作できません

    4. SpringRedis-application.propertiesファイルから構成を読み取ります