web-dev-qa-db-ja.com

Mongodbバックグラウンドインデックス-作成された後もバックグラウンドですか?

Mongodbでインデックスを作成するときに、background: trueフラグを指定できます。これにより、インデックスの作成が非ブロッキングになります。これは、以前は明らかに重要ではなかったインデックスを作成するときにデータベース全体をロックしたくないため、本番環境では優れています(インデックスがなかったため)。

docs を読むと、このフラグはインデックスの作成方法のみを決定しているように見えます。作成が完了すると、インデックスは通常のインデックスとまったく同じように機能します。これが私が望んでいることです-インデックスがバックグラウンドで更新されているため、インデックスがドキュメントと同期しなくなることは望ましくありませんが、これを行うデータベースを想像することはできます。

getIndexesコマンドは、インデックスが作成された後もまだbackgroundとしてマークされていることを示しているので、ここで質問しています。これは、それがどのように作成されたかについての単なるリマインダーですか?または、backgroundインデックスは、作成後に異なる動作をしますか?たぶん、複製の微妙さはありますか?

23
Leopd

作成されると、通常のインデックスと同じように機能します。それらは、getIndexesuniqueなどと同様に、リマインダーとしてsparseに保持されます。

しかし、それは他の意味も持っています。 foregroundインデックスがすべてのライターをブロックするという理由だけで、この場合、すべてのインデックスが作成されるまでdb.testCollection.getIndexes()を実行できません。 。一方、backgroundインデックスを作成する場合は、db.testCollection.getIndexes()を呼び出すことができ、そのインデックスはすでに作成されているように見えます。

ただし、この場合、インデックスが実際に作成されているかどうかはわかりません。この場合、 db.currentOp() を呼び出す必要があります。

_{
  "inprog": [
    {
      "opid": 2001060,
      "active": true,
      "secs_running": 1,
      "op": "insert",
      "ns": "test.system.indexes",
      "insert": {
        "v": 1,
        "key": {
          "a": 1
        },
        "ns": "test.testCollection",
        "name": "a_1",
        "background": 1
      },
          ....
      "msg": "bg index build Background Index Build Progress: 368640/1000000 36%",
      "progress": {
        "done": 368640,
        "total": 1000000
      }
      ...
    }
  ]
}
_

つまり、バックグラウンドインデックスの作成がまだ進行中であり、プロセスに関するいくつかの情報を確認することもできます。

たとえば、大まかな計算を行うことができます。1000000のうち368640は1秒(可能なオフセットとして+1秒)かかるため、すべてが3〜6秒かかるはずです(最終的には4.8秒かかります)。

明らかに、そのような操作が進行中であることがわからない場合は、インデックスがすでに作成されています。

:多数の同時操作がある場合は、db.currentOp()にsearсh引数を指定できます。

_db.currentOp({"insert.background":1})
_
24
n1ckolas

複数のインデックスオプションがあります-前景(デフォルト)と背景。フォアグラウンドは比較的高速で、すべてのライターとリーダーをブロックします。まだアクセスできる他のデータベース。これは、実稼働環境では実行されないはずです。

バックグラウンドインデックスの作成は少し遅く、リーダーとライターをブロックしません。 MongoDB 2.4以降では、同じデータベース上でも複数のバックグラウンドインデックスを並行して作成できます。

MongoDB 2.6以降、プライマリのバックグラウンドでインデックスを作成すると、セカンダリのバックグラウンドでもインデックスが作成されます。セカンダリは、プライマリがインデックスの作成を完了すると、インデックスの作成を開始します。

本番システムで非常に効率的にインデックスを作成する別の方法があります。これは、ほとんどのクエリを処理するために使用されている別のサーバーにインデックスを作成することです。たとえば、連携して動作する複数のデータベースサーバーのレプリカセットで、1つを取り出して、要求を使用可能なサーバーにルーティングできるとします。フォアグラウンドインデックスの作成は、分離されたサーバーで実行できます。作成が正常に完了したら、クラスターに戻すことができます。

1
xameeramir