Webソケットの負荷分散


104

Webソケットの負荷分散方法について質問があります。

Webソケットをサポートするサーバーがあります。ブラウザは私のサイトに接続し、それぞれがへのWebソケットを開きますwww.mydomain.com。このようにして、私のソーシャルネットワークアプリはクライアントにメッセージをプッシュできます。

従来は、HTTPリクエストのみを使用して、2つのWebサーバーの前に2台目のサーバーとロードバランサーを追加することでスケールアップしていました。

Webソケットの場合、接続はロードバランサーではなく、Webサーバーに直接接続する必要があります。これは、マシンに64kの開いているポートという物理的な制限があり、クライアントがロードバランサーに接続している場合、サポートできないためです。 64k以上の同時ユーザー。

どうやって私は-

  1. ページが読み込まれたときに、クライアントを(ロードバランサではなく)Webサーバーに直接接続しますか?ページが最初に要求されるたびに、ノードからJavaScriptをロードするだけで、ロードバランサー(または何でも)がスクリプトのURLをランダムに変更しますか?

  2. リップルスタートを処理しますか?ブラウザは、Webサーバーがシャットダウンすると接続が閉じられたことを認識します。JavaScriptコードを記述して接続を再度開こうとすることができますが、ノードはしばらくの間なくなります。したがって、使用する次のノードのアドレスを照会するには、ロードバランサーに戻る必要があると思いますか?

  3. ロードバランサーが最初のリクエストでリダイレクトを送信するので、ブラウザーが最初にリクエストwww.mydomain.comしてにリダイレクトされるのではないかと思いましたwww34.mydomain.com。ノードがダウンするまで、それはかなりうまくいきます-そして、Facebookのようなサイトはそれをしません。どうやってやっているの?



1
DNSベースのロードバランシングやhttpベースのオーケストレーションサーバーの使用などの代替アプローチもあります。deepstream.io/blog/load-balancing-websocket-connections
wolframhempel

@wolframhempelリンクは死んでいます。:-(
Emile Cormier

回答:


94

ソースIPポートハッシュに基づいてIPパケットをWebSocketサーバーファームに分散するL3ロードバランサーを配置します。L3バランサーは(ハッシュされたソースIPポートを使用して)状態を維持しないため、ローエンドハードウェア(たとえば10GbE)のワイヤ速度にスケーリングします。分布は確定的であるため(ハッシュされたソースIPポートを使用)、TCP(およびWebSocket)で動作します。

また、64kのハード制限は、特定の(ソース)IPアドレスの発信 TCP / IPにのみ適用されることに注意してください。着信TCP / IPには適用されません。2コア、4GB RAM VMで200kのアクティブ接続を備えたAutobahn(高性能WebSocketサーバー)をテストしました。

また、最初のWebSocketハンドシェイク中にアナウンスされたHTTPパスでL7ロードバランシングを実行できることにも注意してください。その場合、ロードバランサーは状態を維持する必要があります(どのソースIPポートペアがどのバックエンドノードに行くか)。それでも、まともなセットアップでは何百万もの接続に拡張できます。

免責事項:私はアウトバーンの原作者であり、タヴェンドで働いています。


したがって、JavaScriptでWebソケットを作成するときに、ロードバランサーURLからJavaScriptライブラリをロードし、ロードバランサーURLを指定します。つまり、ブラウザーに対して透過的ですか。それはクールだ!
John Smith

1
はい、URLは1つしかなく、後者のホスト名はロードバランサーに解決されるはずです。WebSocketバックエンドサーバーには内部IP(パブリックではない)があり、オプションでパブリックとは異なるポートでも実行できます。唯一の注意点は、WebSocketサーバーにパブリックに見えるホスト名、IP、ポートを通知する必要がある場合があることです。これは、準拠するWebSocketサーバーが、WSハンドシェイクのHTTPヘッダーで提供されるURLがホスト名/ ip /ポートに適合することを確認するためです。聞いています。
oberstet 2012

バランスをとるためのWebSocket接続は多くありませんが、1つのトラフィックが多いか、接続数が非常に少ないと言います。簡単にするために、1つの接続を言うと、1つのWebソケット接続を通過するリクエストのバランスをどのように調整できますか?
user1870400 2017年

Java WebSocketで5000以上の接続を行うと、メモリが解放されません...解決策はありますか?
Poonam Patel

3

Websocketサーバーロジックがsocket.ioを使用してnodejsで実行されている場合、socket.ioに同期のために共有redisキー/値ストアを使用するように指示できます。このようにして、ロードバランサーについて気にする必要さえありません。イベントはサーバーインスタンス間で伝播します。

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 }));

参照:http : //socket.io/docs/using-multiple-nodes/

しかし、ある時点で、redisがボトルネックになる可能性があると思います...


2

検査と「ルーティング機能」により、レイヤー7の負荷分散を実現することもできます。

「Stingray Traffic Managerを使用してWebSocketsトラフィックを検査および負荷分散する方法、および必要に応じて、同じIPアドレスとポートで受信されるWebSocketsおよびHTTPトラフィックを管理する方法」を参照してください。https://splash.riverbed.com/docs/DOC-1451


2
あなたがリンクした情報を見つけるために私はいくつかの調査をしなければなりませんでした。:ウェイバックマシンは、私はその記事のライブコピー見つける助け community.pulsesecure.net/t5/Pulse-Secure-vADC/...
ウィック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.