0

私はフリート追跡会社で働いており、この質問は具体的にどのようにレポートを作成する予定かについてのものです。私たちの環境を説明しましょう。1 つのデータベース、1 つの負荷分散プロセス、および 3 つのレポート処理サーバーがあります (これらはすべての点で等しいと仮定しましょう)。顧客がレポートを要求すると、そのレポートのすべてのパラメーターがデータベースに入ります。私は現在、データベースから保留中のレポートを取得し、レポートを作成して電子メールで送信する 3 つのレポート処理サーバーに委任する負荷分散アプリに取り組んでいます。サーバーがレポートを終了する (またはエラーが発生する) と、負荷分散アプリに通知します。レポートは、1 台の車両の 1 日分の GPS データから、数百台の車両の 3 か月分の GPS データまで、あらゆるサイズで提供されます。

ロード バランシングを行う方法はいくつか考えられますが、満足できるものではありません。各サーバーで最大 5 つのレポートしか作成できませんでしたが、1 つのサーバーが 5 つの小さなレポートを取得し、別のサーバーが 5 つの大きなレポートを取得する場合があります。「ラウンド ロビン」アプローチを実行して、サーバー間でレポートを順番に配布することもできますが、それでもサーバーの過負荷を防ぐことはできません。

私が今考えている最善のアイデアは、各レポートに必要な GPS データの量を数えることです (実行するのは簡単な作業です)。サーバーがレポートを終了する (そしてロード バランサーに通知する) と、そのサーバーの現在の合計からそのレポートの GPS データの量を差し引きます。このようにして、作業する GPS データの量が最も少ないサーバーに次のレポートを割り当てることができました。また、サーバーが過剰に機能しないように最大値を設定することもできます (最初にレポート プロセス全体をリファクタリングする原因となっている問題です)。すべてのサーバーが最大に達したときにさらにレポートがある場合は、それらをキューに入れ、後でサーバーがいくつかのレポートを終了したときにそれらを試みることができます。

レポートをできるだけ早く仕上げるための最良のアプローチであるとは確信していません。これらは、これまでに思いついた最高のものです。

複数のサーバー間で異なるサイズのレポートを負荷分散するアプローチを最適化するにはどうすればよいですか?

4

1 に答える 1

0

データを選択する主要なテーブルが 1 つしかないと仮定すると、最初にすべての大きなレポートを実行するように 1 つのサーバーを構成し、残りの 2 つのサーバーは最小から最大のレポートを実行するようにします。そうしないと、大きなレポートが完成しない可能性があります。

小規模なレポートの場合、より良いものがない場合は、「同様の」レポートを試して実行してもらいたいと考えています。これは、主に使用されるインデックスの同様の値の周りにクラスター化されているレポートを意味します。たとえば、サーバーが 2011 年 6 月のレポートを完了したばかりの場合、次に実行する最適なレポートは同じ期間であり、2012 年 11 月にジャンプするのではありません。ただし、これは実際のテーブルに依存しますが、多くの日付が注文されていると推測しています選択の大部分を構成するデータ。実際にやろうとしているのは、キャッシュされたインデックスなどを再利用する可能性が高いレポートをグループ化することです。これにより、最高のスループットが得られるはずです。

同様のスケジューリングの問題があり、主要なテーブルに向けられたクエリはあるサーバー (低速キュー) に送られ、それ以外は別のサーバー (高速キュー) に送られますが、いくつかの特殊なケースは例外です。

于 2013-02-03T11:20:25.993 に答える