如何在java中为套接字连接创建软件负载均衡器

时间:2013-04-22 07:51:31

标签: java linux sockets load-balancing

我打算创建一个软件负载均衡器,它将位于linux中的许多套接字服务器之前。客户端将连接到负载均衡器。负载均衡器将维护一个替代ips及其端口的表。它将客户端连接到最佳可用的IP和端口,并断开自身与客户端的连接。因此它将离开现场(将不再连接到客户端)。在这种情况下,只有连接的设备将是客户端和新的套接字服务器,但不是负载均衡器。

Example : Cleint ip 10.1.2.3 port 1234  
           load balancer Ip 10.1.2.4 port 1235
           list of socket servers   in Load Balancer: 
           A Ip 10.1.2.4 port 1236 
           B Ip 10.1.2.4 port 1237
           C  Ip 10.1.2.5 port 1238
    Now 
for the 1st request to the load balancer from client, the load balancer  will establish a connection between the client &  server A and disconnect itself from client.
     for the 2nd request to the load balancer from client, the load balancer  will establish a connection between the client &  server B and disconnect itself from client.
     for the 3rd request to the load balancer from client, the load balancer  will establish a connection between the client &  server C and disconnect itself from client.

Any Help on implementing this in Java is greatly appreciated.

4 个答案:

答案 0 :(得分:2)

这种微型设计可以帮助移动设备和标签等小型设备中的应用。服务器可以设置限制,允许从特定设备允许请求的往返次数。当然,在线服务器的缩放将有助于减少往返次数。

答案 1 :(得分:2)

我会使用redis来存储查找表。每个负载均衡器服务器将在redis中查找查找表,以便连接到最可用/最优先的服务器。此查找将返回单个整数,该整数是服务器的索引。客户端中的每个应用程序都将使用各自的索引存储服务器ip。所以这个查找速度非常快,不到30毫秒。此时连接速度会更快。无需重定向。如果存在并发连接,并且应用程序尝试连接时所需服务器上的qouta已完成,则还会提供回退功能。到查找服务器。在这种情况下,它将再次查找最可用的服务器,即,以递归方式重新启动,直到它成功连接或所有资源都已完成并且连接请求被标记为死胡同。

如何为每次查找保留几毫秒的连接?在连接该查找的延迟到期之后,页面文件将可用于占用新连接。这将减少递归查找,但也会阻止连接。延迟应该足以建立可能变化的连接。另一方面,在此延迟期间将阻止新连接,这可能导致糟糕的用户体验。 您需要在这两者之间进行权衡:减少查找和阻止连接,从不阻止连接,并且忍受非常快速的递归查找。

答案 2 :(得分:1)

难点在于断开设备与服务器端的连接并将其与目标服务器连接 可以有一个解决方法: 改为使用重定向。

  • 每台服务器都是客户端设备的负载均衡器和服务提供商
  • 每个服务器将始终跟踪其开放文件限制和最大开放文件限制的保留安全边距
  • 此池将用于检查是否需要重定向。
  • 当打开文件限制达到安全限制时,进一步 连接请求将返回下一个可用的服务器ip到 客户端设备。
  • 下一个最近的可用服务器ip可以在内存中的查找表中维护。
  • 设备将检查返回的值是否开始 使用重定向ip它将自动重新连接到 收到ip.Otherwise它会假设设备从任何服务器成功获得服务。

因此我们可以避免打开文件限制和连接拒绝错误。

答案 3 :(得分:0)

我不太明白负载均衡器应该与客户端断开连接的要求。如果您的套接字实际上是TCP连接,就像它们看起来那样,我看不出如何将连接卸载到运行在其他地方的客户端而没有一些低级别的hackery。例如,从linux virtual server查看ldirectord。这允许完全卸载连接。

为了简单起见,我只使用HAProxy。除了卸载连接外,您需要的大部分内容。

最后,您还可以使用某种循环DNS解决方案。这也可以根据需要卸载连接。