ログファイルの保存にmongoを使用しています。 mongoDBとmysqlの両方が同じマシンで実行されているため、mongo envの仮想化はオプションではありません。ログテーブルが非常に速く成長するので、すぐにパフォーマンスの問題に遭遇するでしょう。 mongoの常駐メモリを制限して、使用可能なすべてのメモリを消費せず、mysqlサーバーの速度が過度に低下しないようにする方法はありますか?
DBマシン:Debian 'lenny' 5
その他の解決策(コメントしてください):
すべての履歴データが必要なため、上限のあるコレクションを使用することはできませんが、古いデータをダンプして削除するcronスクリプトの使用も検討しています
他のフォーラムで提案されているように、小さいキーの使用も検討すべきですか?
ちょっとVlad、あなたはここでログに関していくつかの簡単な戦略を持っています。
最初に知っておかなければならないことは、Mongoは通常、大量のRAMなしで多くの連続挿入を処理できることです。これの理由は簡単です。最近のものを挿入または更新するだけです。したがって、インデックスのサイズは大きくなりますが、データは常にページアウトされます。
別の言い方をすると、RAMの使用法を2つの主要な部分に分けることができます:インデックスとデータです。
通常のロギングを実行している場合、データ部分は常にフラッシュされているため、実際にはRAMにインデックスのみが残ります。
次に知っておくべきことは、ログを小さなバケットに入れることでインデックスの問題を軽減できることです。このように考えてください。すべてのログを日付スタンプ付きのコレクション(_logs20101206
_と呼びます)に収集すると、RAM内のインデックスのサイズを制御することもできます。
日を重ねると、古いインデックスはRAM=からフラッシュされ、再びアクセスされることはないので、単に消えます。
古いデータをダンプして削除するcronスクリプトの使用も検討しています
日ごとにログを記録するこの方法は、古いデータの削除にも役立ちます。データを使い終わった3か月後には、db.logs20101206.drop()
を実行するだけで、コレクションはすぐになくなります。ディスク容量を再利用することはありません(すべて事前に割り当てられています)が、新しいデータが空の領域を埋めることに注意してください。
他のフォーラムで提案されているように、小さいキーの使用も検討する必要がありますか?
はい。
実際、データオブジェクトに組み込んでいます。したがって、私は_logs.action
_または_logs->action
_を使用してデータにアクセスしますが、その下にあるデータは実際には_logs.a
_に保存されます。 「値」よりも「フィールド」に多くのスペースを費やすのは本当に簡単なので、「フィールド」を縮小して他の場所に抽象化しようとする価値はあります。
WiredTigerエンジンを使用するバージョン3.2以降の場合、オプション--wiredTigerCacheSizeGB
は質問に関連しています。正確に何をしているのかわかっている場合は、設定できます。それがベストプラクティスであるかどうかはわかりません。 document を読んで、ここで上げてください。
Windowsの場合、MongoDBが使用するメモリの量を制御することは可能と思われます。このチュートリアルをCaptain Codemanで参照してください。