64k以上のWebソケット用にHAProxyを拡張


8

64k以上のWebソケットを処理できるアーキテクチャを設計しようとしています。

私たちは最初にAmazon ELBを試しましたが、その設計では、トラフィックやWebSocketの予期しないスパイクは許可されていません。(TCPモードでWebSocketが予期せずタイムアウトする)

HAProxyではこれらの制限は適用されませんが、HAとバックエンドサーバー間で維持される〜64kのWebソケットに制限されます。

頭に浮かんだ複数のソリューション:

  • 複数のHAProxyインスタンス、DNSによる負荷分散(Route53には加重オプションがあります)
  • Keepalived、複数の内部IPアドレスを持つ2つのHAProxyインスタンス(実行可能かどうかは不明)

これを行うより良い方法はありますか?


1
なぜ64k制限なのですか?送信元ポートのものですか?その場合はあなただけの別のポートにバインドされているバックエンドにより「サーバ」を追加することができます...
カイルブラント

@ Bastien974、最も簡単な方法は、バックエンドに異なるソースIPを使用し、130K接続にスケーリングすることです。2つのIPとtw_reuse sysctlオプションを使用しました
c4f4t0r

回答:


7

64kの制限が送信元ポートによるものである場合は、次のようなことを行うことができます(少しハッキーですが、現在はSEでWebソケットに対して実行しています(通常、HAProxyで.5ミリオンの同時実行など)。

server ny-web01-1 10.0.0.1:8081 check
server ny-web01-2 10.0.0.1:8082 check
server ny-web01-3 10.0.0.1:8083 check

また、keepalivedを使用して複数のインスタンスを実行できます。複数のIPでDNSのラウンドロビンなどを実行するだけです。DNS自体はロードバランシングを提供しないため、アクティブなロードバランサーが常にIPを取得するようにしてください(ここにもオプションがあり、これは単純です)。


1
私が正しく理解している場合、TCP接続はsrcIP:srcPORT / destIP:destPORTで定義されているため、複数のポートでバックエンドサーバーをリッスンできれば、HAProxyとバックエンドサーバーの間で同じ127.0.0.1:12345-> 10.0.0.1:8081、127.0.0.1:12345-> 10.0.0.1:8082などから複数の接続を確立するには これは本当に機能しますか?
Bastien974 2014年

@ Bastien974:あなたは正しく理解しています-それは機能します。
カイル・ブラント

@ Bastien974:source 0.0.0.0 usesrc clienttproxyソースの透過性のためにhaproxyのバックエンド構成で使用できます。このように、srcIP:srcPORTは実際のクライアントIP /ポートになります(haproxyマシンの内部IPではありません)。
wqw 2015

0

AnycastとBGPまたは他のボーダールーティングプロトコルを使用して、同じIPを共有する複数のHAproxyシステムをセットアップできます。このようにして、すべてのHAproxyシステムがアクティブになります。それらのいずれかがダウンした場合、そのシステムでのBGPルートのアドバタイズを停止し、30秒以内にトラフィックの受信を停止します。これは、同じ範囲をアドバタイズする他の使用可能なシステムに再配布されます。

たとえば、このようなレイアウトを設定する方法については、この URLを確認してください


各インスタンスに関連付けられたElastic IPを使用する必要があるため、これがAWS VPCインフラストラクチャ内で機能するかどうかはよくわかりません。Amazon Route53にはヘルスチェックを追加するオプションがあるので、ソリューションはDNSソリューションに非常に近くなります。私の懸念は、TTLが低くても、他の国(世界中にクライアントがいる)への伝播を待って、「死んだ」HAインスタンスへのトラフィックの送信を停止する余裕がないことです。
Bastien974
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.