6 つ以上のプロセスで構成されるクローラーがあります。プロセスの半分は Web をクロールするマスターであり、ジョブを見つけるとコレクションに入れますjobs
。ほとんどの場合、マスターは一度に 100 個のジョブを保存します (つまり、100 個のジョブを取得し、それぞれをできるだけ早く個別に保存するということです。
プロセスの後半は、何らかのタイプの新しいジョブが利用可能かどうかを常にチェックするスレーブです。利用可能な場合は、それらをマークしin_process
(findOneAndUpdate を使用して行われます)、ジョブを処理し、結果を別のコレクションに保存します。
さらに、マスター プロセスは、jobs
テーブルから大量のデータを読み取って同期する必要がある場合があります。
要約すると、dbには多くの読み取り操作と書き込み操作があります。db が小さかったときは問題なく動作していましたが、今では 700k までのジョブ レコードがあると (ジョブ ドキュメントは小さく、8 つのフィールドがあり、適切なインデックス/複合インデックスがあります)、db が緩みます。count
「統計」ページを表示すると、基本的にいくつかの条件 (インデックス付きフィールド) で~16 の操作を実行するときに観察できます。
マスター/スレーブ プロセスが実行されていない場合、2 秒後に統計ページが表示されます。マスター/スレーブが実行されている場合、同じページが約 1 分間表示され、まったく表示されない場合があります (タイムアウト)。
では、1 秒あたりにより多くのリクエストを処理するようにデータベースを作成するにはどうすればよいでしょうか? 私はそれを複製しなければなりませんか?