1

この質問には2つの側面があり、どちらもインデックスに関連しています。

5億3000万のエントリを持つデータセットがあり、各エントリには10個の要素の配列があります。私は単一のmongodを使用しています。配列post-bulk-insertにインデックスを作成しています。配列には、文字列型の2つのキーと値のペア(int)があります。

構築前にインデックスを作成することがmongodbの設計対象であり、このような大規模なデータセットは、大量のram / swappable-virtual-memoryがないと(挿入後に)インデックスを作成できないことをすでに推測/調査しました。

1つ:インデックス構築のフェーズ

インデックス構築のフェーズは何ですか。ログを見て、0から100%に一度上昇し、100%に達したときにカウントを開始するのを確認しました(並べ替えと関係がありますか??)。2番目のフェーズは最初のフェーズよりもはるかに遅くなりました。実行する必要のあるパスは他にありますか?

2:インデックスの状態

私はこのレートでインデックスの構築を監視するつもりはなく、バックアップとしてインデックス付きのデータセットを持っています(これはもう信頼できません。読み続けてください)。だから、私kill -9'dはプロセスです。プロセスを再開しました。ログには、インデックスビルド操作が進行中であり、正しく終了しなかったことをデータベースが確認していることが示されていますが、これ以上のことはありません。インデックスがdb.<db-name>.getIndexes()リストに表示されます。

これは特に少し奇妙だと思いますgetIndexes。この場合のインデックスの構築は決して終了しなかったという事実を知っています。そして今では、インデックス作成が正常に終了したと信じているバックアップを信頼できません。

少なくとも、データベースプラットフォームが一貫した状態にあるか、制御を通過する前にデータベースプラットフォームに到達することを期待しています。したがって、インデックス構築をロールバックするか、終了するか、リカバリー操作なしで開始することを拒否します。

では、データベースが一貫した状態にあるかどうか、具体的にはインデックスを確認するにはどうすればよいですか?

4

1 に答える 1

2

では、データベース、特にインデックスが一貫した状態にあるかどうかを確認するにはどうすればよいでしょうか?

このために、validateコマンドがあります。このコマンドは修復のようなブロック コマンドですが、いくつかのオプションがあるようです。

したがって、インデックスの構築をロールバックするか、終了するか、回復操作なしで開始を拒否してください。

同意した。また、ログは、DB が再起動されたときの状態について非常に明確である必要があります。ただし、MongoDB はまだ「存在」していません。

第 2 段階は、第 1 段階よりもはるかに遅かった。実行する必要があるパスは他にありますか?

実際、第 2 フェーズが完了すると、DB はロックfsyncされ、新しく作成されたインデックスをディスクにフラッシュするときに巨人を実行します。あなたがそれを殺したとき、それはおそらくここにいました。

このプロセスが発生するのを最後に見たとき、fsync. データのサイズを考えると、これは何ギガものデータがディスクにフラッシュされることを表します。ドライブの速度とインデックスの速度を計算しますが、このフェーズは間違いなく多くの待ち時間を表している可能性があります。

于 2012-02-02T08:21:12.657 に答える