web-dev-qa-db-ja.com

典型的なhttp(s)ロードバランサーはどのように機能しますか?

サーバーでhttp(s)の負荷が高くなる状況がいくつかあることを知っています。ロードバランサーを使用して、複数のバックエンドサーバーに負荷を分散する必要があります。
しかし、私はここで混乱しています!あまりにも多くのユーザー(たとえば100,000)がexample.com:80に同時にアクセスしようとしていて、ロードバランサー(Apache mod_proxy_balancerまたはその他のスタンドアロンロードバランサーなど)がこの負荷を複数のサーバーに分散したいとします。バックエンドサーバーですが、それでもすべてのトラフィックはフロントエンドサーバーを通過する必要があり、そのサーバーで大量のトラフィックが発生します。すべてのリクエストがバックエンドサーバーで解析されている場合でも、フロントエンドサーバーで管理する必要があります。それら(最良の場合、リクエストごとに単一の一意のスレッドを作成する必要があると仮定します。これにより、このサーバーは、一度に100,000スレッドを作成した後にクラッシュするだけです!)。
私の質問(専門家には面白そうに聞こえるかもしれません!)は、ロードバランサーがそのような状況をどのように処理できるかということです。言い換えると、フロントエンドサーバーは、このような重いネットワーク負荷を許容することなく、クライアントとバックエンドサーバーの間に直接リンクを確立するにはどうすればよいでしょうか。 (この状況では、バックエンドサーバーを実際に「バックエンド」と呼ぶことはできませんが、今のところは問題ないと思います)このシナリオでは、アプリケーション固有の変更が必要ですか? (たとえば、http Locationヘッダーを持つクライアントを他のサーバーに単純にリダイレクトするため)

5

これは、ロードバランサーの目的、つまり、バランスを取ることになっているワークロードのタイプによって異なります。 リバースプロキシベースのHTTP(S)ロードバランサーは、コンテンツを生成するアプリケーションバックエンド間で負荷を分散しています。

リバースプロキシはネットワーク負荷のバランスをとろうとはしておらず、動的アプリケーションが実行するすべてのタスクと比較して、ネットワークトラフィックの受け渡し(および場合によっては静的コンテンツの提供)は比較的単純なタスクです。

たとえば、データベースアクセスの負荷を分散することもできます。ほとんどのデータベースクエリはデータベースからの読み取りのみを伴うため、書き込みはすべてのデータベースサーバーにすぐに複製する必要がありますが、読み取りは均等に分散できます。

ネットワーク負荷分散は別の領域です。たとえば、クラスターサーバー間で(ネットワーク)負荷を分散するための一般的な方法の1つは、ラウンドロビンDNSレコードです。ここで、同じホスト名には、単に複数のAレコードがあります。

9
Esa Jokinen