2

7 億行 / 1.3 TB の MongoDB インスタンス、バージョン 1.6.3 があります。copyDatabaseコマンドで新しい2.0インスタンスにコピーしようとしました。

「写すだけ」は2時間でできました。しかしその後、新しい MongoDB コレクションがロックされ、db.currentOp()以下の結果が返されます。

{
    "opid" : 5,
    "active" : true,
    "lockType" : "write",
    "waitingForLock" : false,
    "secs_running" : 22138,
    "op" : "query",
    "ns" : "nerv",
    "query" : {
        "copydb" : 1,
        "fromhost" : "<some host>",
        "fromdb" : "<some db>",
        "todb" : "<some db>"
    },
    "client" : "127.0.0.1:50689",
    "desc" : "conn",
    "threadId" : "0x7f5094005700",
    "connectionId" : 1,
    "msg" : "index: (2/3) btree bottom up 214887968/715742197 30%",
    "progress" : {
        "done" : 214887968,
        "total" : 715742197
    },
    "numYields" : 5591738
},

約5時間待っていますが、これは24時間以内に終了しないようです. これを待つ必要がありますか、それとも他に選択肢はありますか? (バックグラウンドでインデックス作成を実行するのと同じようensureIndexに)


追加) 回答ありがとうございます、Adam C. それでは、さらにお聞きしたいと思います :)

  1. 何をindex: (2/3) btree bottom upしていて、なぜそんなに遅いのですか?
  2. index: (3/3)私はまだメッセージに会っていません。(3/3)と同じくらい遅い(2/3)ですか?
4

1 に答える 1

2

セカンダリの問題を除けば、インデックスの構築はバックグラウンドで実行できますが、そのコピーの一部としては実行できません。

http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation

1.6.3 データベースを fsync してロック (または一時的にシャットダウン) し、データ ファイルをコピーするだけです。ファイル形式は 1.6.3 と 2.0.6 の間で変更されていないため、2.0.6 インスタンスを起動して、コピーされたファイルへの適切なパスを指すようにすると、問題なく使用できるはずです。

フォローアップの部分に関しては、それは私の現在の知識を少し超えていますが、見つけようとします. 関連するコードは次のとおりです。

https://github.com/mongodb/mongo/blob/master/src/mongo/db/index_update.cpp#L219

実際のインデックス データ構造が作成されている btree 構築フェーズ (読み取り/挿入後) フェーズにいるようで、最後の部分はコミットに関連しています。ここで正確なタイミングを判断するのは難しいですが、しばらく実行している場合は、おそらく終了させる価値があります.

それが私の選択であるとすれば、可能であれば、プラン B を用意して、データ ファイルのコピーを並行して実行することになります。インデックスの構築が最初に完了する場合は、ファイル転送を強制終了します。

更新: 別の問題を調査しているときに、2.0.6 までのバージョンでは、インデックスが作成されるコレクションが RAM よりかなり大きい場合にバグがあることに気付きました。これは、フォアグラウンド インデックス作成のフェーズ 2 (実行中の処理) に非常に長い時間がかかり、ページ フォールト率が大幅に増加することとして現れます。

このバグは 2.0.7 で修正されています (この回答を書いている時点で、リリース候補として入手できます)。したがって、他の誰かがこれに遭遇した場合、または元の質問の所有者がこの問題に遭遇した場合は、必ず 2.0.7+ で試してください。

于 2012-07-25T13:05:36.067 に答える