ソフトウェアロードバランサーをスケールアウトする一般的な方法は何ですか?


22

多くの場合、アプリサーバーの前にSLB /リバースプロキシを持つWebアプリアーキテクチャがあります。

SLBへの接続数が、単一の SLBが効果的に処理するには多すぎるリソースを必要とする場合はどうなりますか?具体的でありながら最高の例として、200万の永続的なHTTP接続を検討してください。明らかに、単一の SLBはこれを処理できません。

SLB をスケールアウトするための推奨構成は何ですか?

LBのグループ/クラスターを作成するのは一般的ですか?そうである場合、LBのグループ間でクライアントの負荷はどのように分散されますか?


z8000、使用しているソフトウェアロードバランサーを指定できますか?また、可能であれば、ロードバランシングに使用するアルゴリズム/プロトコル。
マーティン

好みがありません。質問をより明確にするために更新しました。
z8000

ロードバランサーが200万の永続的なHTTP接続を本質的に処理できない理由は、私には明らかではありません。
ワンブル

回答:


10

ロードバランサーは、接続を維持しているチェーン上に単一のロードバランサーが本質的に存在するため、他のロードバランサーによって簡単にスケーリングすることはできません。とはいえ、LVSやHAProxyなどのバランサーは、Gbpsの範囲で途方もない容量を持っています。単一のロードバランサーの機能(ソフトウェア、ハードウェアなど)を超えたら、ラウンドロビンDNSなどの他の手法に移行する必要があります。


右!単一のLBを持つことは「問題」です。一般的にスループットは問題にならないことに同意します。しかし、私の場合、RAMのような他のリソースは心配です。RAMがなくなる前に、単一のSLBでホストできる接続は非常に多くあります。
z8000

HAProxyは、RAMのGBあたり約20k〜60kのアクティブセッションを処理できます。保持されるセッションデータが小さいため、LVSのほうがはるかに多くのことができると思います。RAMが不足している場合は、アップグレードするか、ラウンドロビンDNSシステムが前面にある別のロードバランサーを構築します。
Hyppy

1
「ロードバランサーは、他のロードバランサーによって簡単にスケーリングすることはできません」-実際には、単一のASICベースのL4ロードバランサーを、いくつかのL7 HTTPベースのロードバランサーの前に配置して、優れた結果を得ることができます。nignxの前のLinux LVSなど、ソフトウェアのみの実装にも同じ基本原則が適用されます。
ジェスパーM

19

OK、受け入れられた答えはすでにありますが、追加するものがあります。 ロードバランサー層をスケーリングする最も一般的な「古典的な」方法は(順不同)です。

  • ドメインの複数のIPアドレスを公開するDNSラウンドロビン。各IPアドレスに対して、可用性の高いサーバーペアを実装します(2つのサーバーが常に1つのIPアドレスを機能させるために協力します)。各IPは、アプライアンスまたは負荷分散ソフトウェアを備えたサーバーを使用して、1つのロードバランサークラスターに対応します。必要に応じてロードバランサーのペアを追加して、水平方向にスケーリングします。

  • ルーティングまたはファイアウォールを調整して、複数のロードバランサーに負荷を分散します。ソースIPアドレスをハッシュすることにより、フロントルーターまたはフロントファイアウォールが複数のIPアドレス(それぞれが1つのロードバランサーペアを表す)に着信接続を分散させるようにします。

  • レイヤIPレベルのロードバランサ HTTPレベルのロード・バランサの層の前に。IP層の負荷分散はASIC /シリコンに実装でき、いくつかの点で高速に機能します。したがって、単一のIPロードバランサーのペアは、多くの場合、複数のHTTP / HTTPSレベルのロードバランサーを維持し、アーキテクチャをシンプルかつシンプルに保ちながら、マルチギガビットのパフォーマンスレベルを提供します。

上記を行うさまざまな方法について完全に詳細に説明するには、非常に長い回答が必要です。ただし、一般に、ロードバランサー層のスケーリングはそれほど難しくありません。アプリケーションサーバー層、特にデータベース層のスケーリングははるかに困難です。

アプライアンスのフォームファクター(F5、Cisco、A10)を選択するか、汎用サーバー(Windows / Linux +ソフトウェア)を選択するかは重要ではありません。ロードバランサーレイヤーをスケールアウトする際の主な考慮事項は次のとおりです。

  • ステートフルとステートレス。スティッキーセッションが絶対に必要ですか、それともなしで生活できますか?状態を維持しないと、すべてが簡単になります。
  • 負荷分散のための「ハードウェア」(ASIC)対「ソフトウェア」(汎用サーバー)。それぞれに長所と短所があります。上記にリンクされているHAProxy概要ドキュメントを参照してください。
  • L3 / 4(IP / TCP / IP)負荷分散とL7(HTTP)負荷分散。繰り返しになりますが、長所と短所、HAProxy docは良い概要を提供します。
  • SSL終了、ここで、webnodesまたはロードバランサー。

一般に、Webサイトが非常に大きくなる前にこのことを心配する必要はありません。fxnginxを備えた単一の近代的なサーバーは、毎秒何万もの単純なHTTP要求を処理します。したがって、時期尚早な最適化を行わないでください。必要になる前にこれに対処しないでください。


実際に、DNS RRを使用して各IPアドレスを高可用性にする必要はありません。一般に、ブラウザは、接続できない場合、利用可能な場合は別のIPにフォールバックします。ただし、パブリックWebサービスがある場合は、多くのWebサービスライブラリが他のIPへのフェールオーバーを自動的に処理しないため、各IPアドレスにHAが必要になります。
rmalayter

9

HTTPロードバランシングレイヤーをスケーリングするための鍵は、最初に下位レベル(IPまたはTCP)ロードバランシングの別のレイヤーを追加することです。このレイヤーは完全にオープンソースソフトウェアで構築できますが、最新のルーターを使用すればより良い結果が得られます。

フロー(TCPセッション)は、送信元/宛先IPやTCPポートなどのヘッダーを使用してハッシュし、どのフロントエンドに移動するかを決定する必要があります。また、フロントエンドが停止したときに、フロントエンドが使用されなくなることを確認するメカニズムも必要です。

さまざまな戦略がありますが、何百万人ものユーザーにサービスを提供するサイトで本番で使用したカップルの概要を説明します。すべてを詳細に説明するのは長すぎますが、この回答があなたが始めるのに十分な情報/ポインターを提供することを願っています。これらのソリューションを実装するには、ネットワークについて本当に知識のある人が必要になります。

確かに、ここで説明していることは、他の回答で説明されているものよりも実装がはるかに困難ですが、99.9%を超える大きなスケーラビリティの問題と可用性の要件を備えたトラフィックの多いWebサイトがある場合、これは本当に最先端です。既にネットワークエンジニアを搭載している場合は、ロードバランサーアプライアンスよりもセットアップと実行(capexとopexの両方)にかかる費用が少なく、追加費用をほとんどかけずにさらに拡張できます(新規購入など)現在のモデルよりも大きくなった場合の高価なアプライアンス)。

最初の戦略:ファイアウォールを使用する

おそらく、ISPアップリンクが接続されている2つのルーターがあります。ISPは2つのリンクを提供します(VRRPを使用したアクティブ/パッシブ)。ルーターでは、VRRPも使用し、パブリックネットワークに向かうトラフィックをファイアウォールにルーティングします。ファイアウォールは、(FW 1およびFW 2下記)もまた、アクティブ/パッシブであり、(あなたのHTTPロードバランサを、トラフィックをフィルタリングし、健康的なフロントエンドサーバーへの各フローを送信するFE 1と、FE 2下記)。

      + -------------- + + -------------- +
      | ISPルーターA | | ISPルーターB |
      + -------------- + + -------------- +
             | |
           ==#======================#==(パブリックネットワーク)
             | |
      + --------------- + + --------------- +
      | ルーターA | | ルーターB |
      + --------------- + + --------------- +
             | |
           ==#=====#==========#=====#==(RFC 1918プライベートネットワーク)
             | | | |
       + ------ + + ------ + + ------ + + ------ +
       | FW 1 | | FE 1 | | FE 2 | | FW 2 |
       + ------ + + ------ + + ------ + + ------ +

目標は、フローを次のようにすることです。

  1. ISPはIPに向かうトラフィックをアクティブルーターにルーティングします。
  2. ルーターは、RFC 1918アドレスを使用するVIPにトラフィックをルーティングします。このVIPは、VRRPによく似たアクティブファイアウォールによって所有されています。ファイアウォールのニーズにOpenBSDを使用している場合は、VRRP / HSRPに代わる特許フリーのCARPを使用できます。
  3. ファイアウォールがフィルターを適用します(たとえば、「この特定のIPアドレスへの80 / tcpおよび443 / tcpの送信のみを許可する」)。
  4. ファイアウォールはルーターとしても機能し、正常なフロントエンドにパケットを転送します。
  5. フロントエンドはTCP接続を終了します。

これで、ステップ4と5で魔法が発生するので、それらの機能の詳細を見てみましょう。

ファイアウォールは、フロントエンド(FE 1およびFE 2)のリストを認識しており、フローの特定の側面に基づいてそれらの1つを選択します(たとえば、ヘッダーの中でソースIPとポートをハッシュすることにより)。ただし、トラフィックが正常なフロントエンドに転送されるようにする必要もあります。そうしないと、トラフィックがブラックホールになります。たとえば、OpenBSDを使用している場合は、を使用できますrelayd。何relayd簡単です:すべてのフロントエンドのヘルスチェックを行い(たとえば、プローブHTTPリクエストを送信することにより)、フロントエンドが正常な場合は常に、特定のフローのパケットの次ホップを選択するためにファイアウォールが使用するテーブルに追加します。フロントエンドがヘルスチェックに失敗すると、テーブルから削除され、パケットは送信されなくなります。パケットをフロントエンドに転送する場合、ファイアウォールは、パケットの宛先MACアドレスを、選択したフロントエンドの宛先MACアドレスに交換するだけです。

ステップ5では、ユーザーからのパケットがロードバランサーによって受信されます(Varnish、nginxなど)。この時点では、パケットはまだパブリックIPアドレスに向けられているため、ループバックインターフェイスでVIPをエイリアスする必要があります。これはDSR(Direct Server Return)と呼ばれます。フロントエンドがTCP接続を終了し、その間のファイアウォールがシンプレックストラフィックのみを受信する(着信パケットのみ)ためです。ルーターは、発信パケットをISPのルーターに直接ルーティングします。要求は応答よりも小さくなる傾向があるため、HTTPトラフィックには特に適しています。明確にするために:これはOpenBSD固有のものではなく、トラフィックの多いWebサイトで広く使用されています。

落とし穴:

  • DSRを使用するため、エンドユーザーはフロントエンドサーバーに直接接続します。おそらく既にそうでしたが、そうでない場合は、適切に保護されていることを確認する必要があります。
  • OpenBSDを使用する場合、シングルCPUコアのパフォーマンスによりファイアウォールのスループットが制限されるため、カーネルはシングルスレッドであることに注意してください。NICのタイプと表示されているパケットレートによっては問題になる場合があります。この問題を解決する方法があります(これについては以下で詳しく説明します)。

2番目の戦略:ファイアウォールなし

この戦略はより効率的ですが、使用しているルーターの特性により依存するため、セットアップが難しくなります。アイデアは、上記のファイアウォールをバイパスし、ファイアウォールが行っていたすべての作業をルーターに実行させることです。

ポートごとのL3 / L4 ACL、BGPECMP、およびポリシーベースルーティング(PBR)をサポートするルーターが必要です。これらの機能をサポートするのはハイエンドルーターのみであり、多くの場合、BGPを使用するには追加のライセンス料がかかります。これは通常、ハードウェアロードバランサーよりも安価であり、スケーリングもはるかに簡単です。これらのハイエンドルーターの良い点は、ラインレートになる傾向があることです(たとえば、10GbEインターフェイスでも、ASICによってすべての決定がハードウェアで行われるため、常にリンクを最大限に使用できます)。

ISPアップリンクがあるポートで、ファイアウォールに使用されていたACLを適用します(たとえば、「この特定のIPアドレスへの80 / tcpおよび443 / tcpのみ許可」)。次に、各フロントエンドにルーターとのBGPセッションを維持させます。優れたOpenBGPD(フロントエンドがOpenBSD上にある場合)またはQuaggaを使用できます。ルーターは、BGPセッションを維持しているため、正常なフロントエンドへのトラフィックをECMPします。ルーターは、PBRを使用してトラフィックを適切にルーティングします。

絞り込み

  • ファイアウォールペアソリューションでは、ファイアウォール間でTCP状態を同期できれば、1つのファイアウォールに障害が発生しても、すべてがスムーズに他のファイアウォールにフェイルオーバーできるようになります。これはで実現できpfsyncます。
    • 念頭に置いてベアpfsync通常、ファイアウォール上のパケットレートを倍増します。
    • HTTPはステートレスプロトコルであるため、ファイアウォールフェールオーバー中にすべての接続をリセットしても、使用しないので世界の終わりではありませんpfsync
  • 単一のファイアウォールを超える場合、ルーターでECMPを使用して、トラフィックを複数のファイアウォールペアにルーティングできます。
  • ファイアウォールの複数のペアを使用する場合、それらをすべてアクティブ/アクティブにすることもできます。フロントエンドがファイアウォールなしの2番目の設計で1つを維持する必要があるのと同様に、ファイアウォールでルーターとのBGPセッションを維持することでこれを実現できます。

サンプルrelayd設定

https://calomel.org/relayd.htmlの HOWTOも参照してください。

vip = "1.2.3.4"#パブリックIPアドレス
               #(複数持つことができますが、必要はありません)
fe1 = "10.1.2.101"
fe2 = "10.1.2.102"
fe3 = "10.1.2.103"
fe4 = "10.1.2.104"#任意の数のフロントエンドを使用できます。
int_if = "em0"
テーブル<fe> {$ fe1再試行2、$ fe2再試行2、$ fe3再試行2、$ fe4再試行2}
テーブル<フォールバック> {127.0.0.1}

ウェブトラフィックのリダイレクト{
        $ vipポート80でリッスンします
        セッションタイムアウト60
        <fe>へのルートhttp "/healthcheck.html"ダイジェストをチェックする "(healthcheck.htmlのsha1sum)"インターフェイス$ int_if
}

2

個人的には、その時点で、よりシンプルで設定の難しいハードウェアロードバランサーにアクセスします。CiscoのACE / ASAs、Foundry ServerIrons、Zeus ZXTM(非常に重い負荷用に設計されたSW LB)などです。


言い換えれば、スケールアップ?そのようなLBは、いくつかの接続(など)で最大になります。それで何?それは本当に私の質問です。ありがとう!
z8000

1
本当に大きなサイトは、何らかの形のDNSラウンドロビンで実行される大量のLBを使用しているだけです。現時点ではほとんどの場合十分であり、数億の接続を処理できます。それは非常に多くの接続はもちろんの開いたままにする必要がある理由の質問は...そこにある
Chopper3

その内部 RRDNSのことですか?きちんとした、私はそれを考えていませんでした。Re:open connections ...バックエンドのどこかでイベントが発生すると、時間の経過とともに接続されたクライアントに更新を送信する必要があるアプリのオプションを検討しています。カスタムTCPサーバー、またはSLBの背後にある多くのオープンHTTP接続の間で破れています。コメントしてくださってありがとうございます。
z8000

外部RRDNSである必要があると思います。たとえば、Twitter.comはRRDNSを使用して、多くの大規模LBの1つに要求を解決および分散し、サーバーに負荷を分散します。
ロバート

はい、ロバート、そのとおりです。たとえば、Cisco GSSボックスを使用してサイトごとのRRを実行します。
Chopper3

1

おそらく、応答を送信するために非常に多くのオープン接続を常に維持する代わりに、クライアントが必要に応じて定期的にサーバーをポーリングするようにアプリケーションをコーディングしますか?

あなたがやっていることは何でもこのミリ秒の応答が実際に必要ですか?クライアントは次のポーリング期間まで15/20秒待つことができますか?


0

典型的なアプローチは、必要な負荷を処理するのに十分な大きさのクラスターを作成し、確定的な負荷分散が可能なSLBを使用することです(永続的な接続の場合)。

CARPのようなものは、リクエストするIPのハッシュを使用して、どのバックエンドWebサーバーがリクエストを処理するかを決定します。これは決定論的ですが、ロードバランサーの前にファイアウォールまたはNATがある場合はあまり有用ではありません。Linuxで実行している場合は、IPVSの
ようなものも役立つかもしれません。


コイについてあなたが主張することは、それがどのように機能するかということからは程遠いので、どこから始めればいいのかわかりません!IPVSに言及する場合は+ -0。
モーロ

@ 3molo ...ハァッ?linux.com/archive/feed/35482にある net.inet.carp.arpbalanceを参照してください 。 」
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.