1

現在、単一のロードバランサーの下で2つのEC2ノードでRESTAPIアプリを実行しています。多くのIPからの少量のトラフィックの標準的な負荷分散シナリオではなく、少数のIPからのみ大量のトラフィックを取得します。したがって、個々のIPからの要求を、使用可能なすべてのノードに分散させたいと思います。

ただし、セッションスティッキネスをオフにしても、そうではないようです。ログを見ると、ほとんどすべてのリクエストが1つのサーバーに送信され、最小のクライアントがセカンダリノードに送信されます。私のサービスへのリクエストは最大30秒続く可能性があり、そのプライマリノードを失うと、不釣り合いな量のリクエストが強制終了されるため、これは有害です。

各クライアントの個々の要求に対してラウンドロビンするようにELBに指示するにはどうすればよいですか?

4

4 に答える 4

0

これは、異なるアベイラビリティーゾーンに2つのインスタンスがある場合に発生する可能性があります。

1つのELBが単一のアベイラビリティーゾーンで複数のインスタンスを処理している場合、インスタンス間でリクエストをラウンドロビンします。

2つのインスタンスが2つの異なるアベイラビリティーゾーンにある場合、ELBが機能する方法は、それぞれが独自のIPを持つ2つのサーバー(elbサーバー)を作成し、DNSとの負荷を分散することです。

クライアントがDNSにサーバーのIPアドレスを要求すると、2つ(またはそれ以上)の応答を受け取ります。次に、クライアントは1つのIPを選択し、それをキャッシュします(OSは通常そうします)。クライアントを制御しない限り、これについてできることはあまりありません。

2つのインスタンスが異なるアベイラビリティーゾーンにあることが問題である場合、解決策は、各アベイラビリティーゾーンに少なくとも2つのインスタンスを持つことです。次に、1台のELBサーバーが2台のサーバー間のラウンドロビンを処理し、IPが1つだけになるため、サーバーに障害が発生した場合でも、クライアントに対して透過的になります。

PS:ELBが一意のIPでより多くのサーバーを作成する別のケースは、単一のアベイラビリティーゾーンに多数のサーバーがあり、1つのELBサーバーがすべての負荷を処理して接続されたサーバーに分散できない場合です。次に、追加のインスタンスを接続するための新しいサーバーが再度作成され、DNSと複数のIPを使用して負荷が分散されます。

于 2012-10-03T09:21:21.600 に答える
0

それはいけません。ELBは、構成不可能なラウンドロビンアルゴリズムを使用します。この問題を軽減する(解決しない)ためにできることは、ELBにサーバーを追加したり、ELBによって開始されたヘルスチェック要求をより頻繁にすることです。

于 2012-07-06T15:57:50.033 に答える
0

私はあなたがどこから来ているのか理解しています。ただし、別の角度から問題に取り組むべきだと思います。表示される問題は、負荷のバランスが取れていないという事実とは特に関係がありません。このバランスの問題を解決したとしましょう。あなたはまだ大量のリクエストを失うことになります。クライアントがどのようにサービスに接続しているかわからないため、問題を解決する方法について詳しく説明することはできませんが、コードをより堅牢に改善して、への接続を計画することをお勧めします。ドロップされます。30秒以上の接続があるサービスは、接続が切断されないことに依存するべきではありません。TCP / UDPソケットの時代には、障害に備えて構築するために多くの作業が行われていましたが、今日のHTTPの世界ではどういうわけか失われています。

私が言おうとしているのは、クライアントが接続に使用しているコードを記述し、より堅牢になるようにコードを構築し、再試行で障害を処理することです。再試行の実行を開始したら、API呼び出しがアトミックであることを確認し、必要に応じてトランザクションを使用する必要があります。

最後に、あなたの元の質問に答えます。AmazonのELBは、同じコンピューター/IPアドレスからでもラウンドロビンです。クライアントが常に同じサーバーに接続している場合は、応答をキャッシュしているブラウザまたはコードである可能性があります。ブラウザからRESTAPIに直接アクセスしていない場合、ほとんどの言語では、特定のホスト名のIPのリストを取得できます。これらのIPはロードバランサーのIPになり、リストをシャッフルして、毎回最上位のエントリを使用できます。たとえば、次のPHPコードを使用して、別のロードバランサーにリクエストをランダムに送信できます。

public function getHostByName($domain) {
    $ips = gethostbynamel($domain);
    shuffle($ips);
    return $ips[0];
}
于 2012-07-07T16:51:17.010 に答える
0

Amazon ELBでも同様の問題が発生しましたが、HTTPクライアントがConnection:keep-aliveを使用していることがわかりました。つまり、同じクライアントからの要求は同じ接続を介して処理されたため、サーバー間で切り替えられませんでした。使用しているサーバーはわかりませんが、キープアライブをオフにして、要求ごとにクライアントに新しい接続を強制することはおそらく可能です。これは、大量のデータを含むリクエストに適したソリューションになる可能性があります。小さなデータで大量のリクエストがある場合、パフォーマンスに悪影響を与える可能性があります。

于 2012-08-25T22:48:56.310 に答える