负载平衡网络插座


104

我对如何对Web套接字进行负载平衡有疑问。

我有一台支持Web套接字的服务器。浏览器连接到我的网站,每个浏览器都打开一个Web套接字www.mydomain.com。这样,我的社交网络应用可以将消息推送到客户端。

传统上,仅使用HTTP请求,我将通过在两个Web服务器之前添加第二个服务器和一个负载均衡器来进行扩展。

使用Web套接字时,连接必须直接与Web服务器连接,而不是直接与负载均衡器连接,因为如果一台计算机的物理限制为例如64k个开放端口,并且客户端正在连接到负载均衡器,那么我将无法支持超过64k的并发用户。

那我怎么-

  1. 让客户端在页面加载时直接连接到Web服务器(而不是负载平衡器)?我是否只是从节点加载JavaScript,并且每次最初请求页面时,负载平衡器(或其他负载)随机地修改脚本的URL?

  2. 处理涟漪开始?浏览器将注意到,随着Web服务器关闭,连接已关闭。我可以编写JavaScript代码来尝试重新打开连接,但是该节点将消失一会儿。所以我想我将不得不回到负载均衡器来查询要使用的下一个节点的地址?

  3. 我确实想知道负载均衡器是否在初始请求上发送了重定向,以便浏览器最初请求www.mydomain.com并重定向到www34.mydomain.com。直到节点出现故障,这一直很好,而Facebook之类的网站则不会这样做。他们是如何做到的呢?


1
您可以按照此处的
Chris Snow

1
还有其他方法,例如基于DNS的负载平衡或使用基于http的编排服务器。我已经尝试在deepstream.io/blog/load-balancing-websocket-connections中
wolframhempel

@wolframhempel链接已死。:-(
Emile Cormier

Answers:


94

放置一个L3负载均衡器,该负载均衡器将基于源IP端口哈希的IP数据包分发到WebSocket服务器场。由于L3平衡器不保持任何状态(使用散列的源IP端口),它将在低端硬件(例如10GbE)上扩展到线速。由于分布是确定性的(使用散列的源IP端口),因此它将与TCP(以及WebSocket)一起使用。

还要注意,64k硬限制仅适用于给定(源)IP地址的传出 TCP / IP。它不适用于传入的TCP / IP。我们已经在2核4GB RAM VM上测试了200k活动连接的Autobahn(高性能WebSocket服务器)。

还要注意,您可以在初始WebSocket握手期间声明的HTTP路径上进行L7负载平衡。在那种情况下,负载平衡器必须维持状态(哪个源IP端口对将到达哪个后端节点)。尽管如此,在适当的设置下,它可能会扩展到数百万个连接。

免责声明:我是高速公路的原始作者,并且为Tavendo工作。


因此,当我在javascript中创建Web套接字时,我将从负载均衡器URL加载我的javascript库,并提供负载均衡器URL-您的意思是它对浏览器是透明的?太棒了!
约翰·史密斯

1
是的,只有1个URL,后者的主机名应解析为您的负载均衡器。WebSocket后端服务器具有内部IP(非公共IP),并且可以选择在不同于公共IP的端口上运行。唯一的警告是,您可能需要告诉WebSocket服务器其公开的可见主机名,IP,端口是什么,因为符合标准的WebSocket服务器将检查WS握手的HTTP标头中提供的URL是否适合它们的主机名/ ip /端口。在听。
oberstet 2012年

我没有太多的websocket连接来平衡,但是一个连接中的流量很大,或者说连接很少。为简单起见,现在说一个连接,如何平衡通过一个Web套接字连接的请求?
user1870400

当我在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/…–
Wyck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.