3つのmongodサーバー(それぞれ16GBのRAM、少なくとも4つのCPUコアと実際のHDD)と1つの専用アービターの小さなレプリカセットがあります。複製されたデータには、現在約1億件のレコードがあります。_id
このデータのほぼすべてが、 (自動生成されたMongo ID)とのインデックスを持つ1つのコレクションに含まれていdate
ます。これは、ネイティブのMongo日付フィールドです。定期的に、(mongoシェルから)次のような日付インデックスを使用して、このコレクションから古いレコードを削除します。
db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}})
これは機能しますが、実行速度は非常に遅くなります。私のノードの1つは他の2つよりもI/Oが遅く、SATAドライブが1つだけです。このノードがプライマリの場合、削除は約5〜10ドキュメント/秒で実行されます。rs.stepDown()を使用することにより、この遅いプライマリを降格し、より良いI/Oを備えたプライマリを取得するための選択を強制しました。そのサーバーでは、約100ドキュメント/秒を取得しています。
私の主な質問は、私は心配する必要がありますか?レプリケーションを導入する前の番号はありませんが、削除がはるかに高速であったことはわかっています。レプリカセットの同期がI/O待機を引き起こしているのか、それとも他の原因があるのか疑問に思っています。削除ステートメントが終了するまで、同期とインデックスの更新を一時的に無効にすることは完全に満足ですが、現時点ではそれを行う方法がわかりません。何らかの理由で、3つのノードのうち2つを無効にして、1つのノードとアービターだけを残すと、残りのノードが降格され、書き込みが不可能になります(アービターはそれを解決するはずではありませんか?)。
一般的なパフォーマンスを示すために、日付インデックスを削除して再作成すると、1億のドキュメントすべてをスキャンするのに約15分かかります。