仕事でMongoDB2.2.0を使用しています。DBには(現時点で)約51GBのデータが含まれているので、これまでに収集したユーザーデータについて分析を行いたいと思います。問題は、それが稼働中のマシンであり、現時点で別のスレーブを購入する余裕がないことです。MongoDBには読み取りロックがあり、特に複雑なクエリで発生する書き込みに影響を与える可能性があることを私は知っています。私の(特定の)クエリを最低の優先度で処理するようにMongoDBに指示する方法はありますか?
2 に答える
MongoDBでは、読み取りと書き込みは相互に影響します。読み取りロックは共有されますが、読み取りロックは書き込みロックの取得をブロックし、もちろん、書き込みロックが保持されている間は他の読み取りまたは書き込みは発生しません。MongoDBの操作は定期的に生成され、ロックが不足するのを待っている他のスレッドを防ぎます。詳細については、こちらをご覧ください。
それはあなたのユースケースにとってどういう意味ですか?読み取りロックなしでデータにアクセスするようにMongoDBに指示する方法も、読み取りが書き込みのパフォーマンスに大きく影響するかどうかを要求に優先順位を付ける方法もないため(少なくともまだ)、「ヘッドルーム」の量によって異なります。書き込みアクティビティが進行している間、利用可能です。
私ができる提案の1つは、データセット全体をスキャンするのではなく(つまり、すべての履歴データに対して集計クエリを実行する)、分析を実行する方法を理解するときに、短いタイムスライスでより小さな集計クエリを実行してみることです。これにより、次の2つのことが達成されます。
- 読み取りジョブは短命であるため、より早く終了します。これにより、クエリが「ライブ」パフォーマンスにどのような影響を与えるかを評価する機会が得られます。
- すべての古いデータを一度にRAMに取り込むことはありません。これらの分析クエリの間隔を空けることで、現在の書き込みパフォーマンスへの影響を最小限に抑えることができます。
別のサーバーを取得する余裕がない場合は、短命のAWSインスタンスを取得することを検討してください。これは、それほど強力ではないかもしれませんが、データセットのコピーに対して長い分析クエリを実行するために使用できます。データのコピーを作成するときは注意してください。本番システムから完全同期を実行すると、データに大きな負荷がかかります(より効果的な方法は、最近のバックアップ/ファイルスナップショットを使用して再開することです)。
このような操作は、レプリカセットのスレーブに任せるのが最適です。一つには、読み取りロックを共有して一度に多くの読み取りを許可することができますが、書き込みロックは読み取りをブロックします。また、クエリに優先順位を付けることはできませんが、mongodbは長時間実行される読み取り/書き込みクエリを生成します。彼らの並行性ドキュメントは役立つはずです
別のサーバーを購入する余裕がない場合は、予備のRAM /ディスクのヘッドルームがあれば、同じマシンにスレーブをセットアップできます。また、スレーブを軽く/たまに使用します。ただし、注意が必要です。ディスクI/Oが大幅に増加します。