UDPサーバーの負荷分散


10

私はudpサーバーを持っています。これは私のビジネスプロセスの中心的な部分です。本番環境で期待している負荷を処理するために、サーバーのインスタンスが2つまたは3つ必要になるでしょう。サーバーはほぼ完全にステートレスであり、ほとんどの場合データを収集し、その上の層は、複数のサーバーインスタンスから発生する可能性のある最小限の古くなったデータを処理する方法を認識しています。

私の質問は、サーバー間で負荷分散を実装するにはどうすればよいですか?サーバー間でリクエストをできるだけ均等に分散したいと思います。また、忠実に再現したいと思います。つまり、クライアントXがサーバーyにルーティングされた場合、それ以降のXのすべてのリクエストはサーバーYに送られるようにします。

ちなみにそれは.NETシステムです...何をお勧めしますか?


状態はサーバー内の内部であり、何らかのトランザクションではありません。状態とは、サーバーが受信したデータからサーバーが集計するいくつかのデータであり、単純なWCF WebServiceでクエリ可能です。アプリケーションはUDPに基づいており、決定には同意しませんが、その「給与水準より上」

私は現在、MSのNLBを試していますが、問題なく動作します。箱から出して忠実に動作しますが、ネットワーク全体でノイズが発生します...

DNSもありません...ああ、それは完全にコスチュームプロトコルです。


将来の参考のためのメモです。モデレーターや評判の高いユーザーは、多くの場合、stackexchangeサイト間で質問を移動できます。これは、すでに配置された回答を保持するのに役立ちます。そのため、通常は自分で再投稿するよりも優れています(回答がない場合は、古い質問を削除して誤って誰も回答しないようにします)。移動する提案に同意する場合は、その効果にコメントを追加し、(可能であれば)モデレーターの注意を促すために投稿にフラグを立てます。そうすれば、投稿は最終的に移動されます。
bdonlan

回答:


4

私はudpサーバーを持っています。[...]サーバーはほぼ完全にステートレスです[..]忠実度があります。つまり、クライアントXがサーバーyにルーティングされた場合、Xの後続のすべてのリクエストがサーバーYに送られるようにします。それが賢明であり、Yをオーバーロードしない限り。

それでは、いくつかのアプリケーションの状態を保持し、UDPの上で実行する非公開のアプリケーションプロトコルを使用しているのでしょうか。あなたは一種の難しい方向に進んでいます。UDPは信頼できるデータ転送ではありません、それが全体の要点です。信頼できるデータ転送については、その人気のある友人TCPを参照してください。「忠実度」を得る唯一の方法は、アプリケーション層プロトコルを理解し、現在のアプリケーションの状態を認識し、それに応じて動作できる負荷分散プロキシを用意することです。

私はあなたが求めるものを提供するのに近い3つのアプローチを見ます:

  • ソース(エンドユーザー)のIPアドレスに基づいて、着信接続を3つのIPアドレスに静的に分散します。このようにして、特定のユーザーは常に同じサーバーに転送されます。ほとんどのプロのファイアウォールはこれを行うことができます。ほとんどのファイアウォールはバックエンドのヘルスチェックを行わないため、3つのサーバーを高可用性にする必要があります。

  • Matt Simmonsがすでに提案しているように、DNSを使用し、DNSラウンドロビンを使用します。

  • Windowsの組み込みネットワーク負荷分散(NLB)を使用します。正直なところ、NLBとセミステートフルUDPベースのサービスでフェールオーバーシナリオがどのように機能するかわかりません。アプリケーションが状態を処理する方法に基づいて、自分で調査する必要があります。プラス面として、NLBは非常に簡単にセットアップでき、Windowsライセンスで無料で提供され、成熟し、パフォーマンスも優れています。


私は私の質問を編集しました
Hellfrost '31年

6

Linux Virtual Serverは、実サーバーのクラスター上に構築された、スケーラビリティと可用性の高いサーバーです。LVSは、UDPプロトコルとソースハッシュアルゴリズムをサポートしています(これは、クライアントを常に同じ実サーバーに表示する場合に使用されます)。

LVMを使用してDNS(rr)、SIP(sh)のバランスをとっています。


4

面白い。私が見たプロキシソフトウェアのほとんどは、確かにTCPベースです。

わずかな経験で見たUDP固有のロードバランシングのほとんどはDNSベースです(タイムサーバー、DNSサーバーなど)。複数のAレコードを提供する方法はありますか?それが機能する場合、通常のDNSラウンドロビンは要求の公平な分散を保証し(おそらく、とにかく十分に公平である)、クライアントキャッシングは忠実性が維持されることを保証します(クライアント側でキャッシュベースのプラットフォームを使用している場合)。


DNSはまったくありません。
ヘルフロスト、2011年

2

ハードウェアまたはソフトウェアのいずれの種類のロードバランサーでもこれを実行できます。必要に応じて、さまざまなロードバランサーから選択できます。

レベル3のロードバランサー:着信IPと使用可能なバックエンドIPを確認するだけでロードバランスを行います。この種のロードバランサーは、常に同じ着信IPアドレスを同じバックエンドに送信することでスティッキ性を保証しますが、この種の戦略は1つをオーバーロードする可能性があります多数のクライアントが同じIP(プロキシまたは企業ゲートウェイ)からの場合のバックエンドの数

レベル7のロードバランサー:レベル7のロードバランサーは、レベル3のバランサーとしてバランスをとるだけでなく、パッケージの内容も確認するため、バランスポリシーの柔軟性が大幅に向上します。

UDPを使用していることを考慮すると、両方のバランサーで良好なパフォーマンスが得られるはずです。また、UDPでの詳細なパケット検査は、TCPの場合よりも少し制限されます(プロトコル上の理由により)。

予算に応じて、ソフトウェアロードバランサー(linux + IPVSなど)を使用して開始し、CiscoまたはNetappが提供するハードウェアロードバランサーに移行します。


L7パーツの場合は-1。レイヤー/レベル7ロードバランサは、アプリケーション層で動作します-しかし、OPはUDPを使用しているので、彼は昔ながらのHTTPを使用していない、と彼は彼がどのアプリケーションに開示されていないされて使用します。OPが使用しているプロトコルにL7ロードバランサーが存在することはわかりません。
Jesper M

1
ロードバランサーで彼のオプションについてコメントしているだけで、彼がUDPで何を使用しているかはわかりません。これはきつすぎます;)
lynxman '31

NLB / linuxとCisco / netappの間には、KEMPロードバランサーがあります。あなたはそれの膨大な費用がかからない仮想版を手に入れることができます、我々はそれを使っています、そして我々はとても幸せです。
pauska 2011年

2

オープンソースのNGINXとアプリケーション配信プラットフォームであるNGINX Plusは、UDPロードバランシングをサポートするようになりました。新しい機能は、既存のTCPおよびHTTP機能に基づいて構築されており、NGINXは、さらに幅広いインターネットアプリケーションおよびデバイス向けの強力で使いやすく、一貫したフロントエンドになります。

リリースnginx-1.9.13で利用可能

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.