【问题标题】:How to create a software load balancer for socket connections in java如何在 Java 中为套接字连接创建软件负载平衡器
【发布时间】:2013-04-22 07:51:31
【问题描述】:

我计划创建一个软件负载平衡器,它将位于 linux 中的许多套接字服务器的前面。客户端将连接到负载均衡器。负载均衡器将维护一个替代 ip 及其端口的表。它将客户端连接到最佳可用 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.

【问题讨论】:

标签: java linux sockets load-balancing


【解决方案1】:

这种微型设计对于手机和标签等小型设备中的应用很有帮助。服务器可以对特定设备允许请求的往返次数设置限制。在线服务器的偏离路线扩展将有助于减少往返次数。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      困难在于断开设备与服务器端的连接并将其连接到预期的服务器。
      可以有一个解决方法: 改用重定向。

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

      这样我们就可以避免打开文件限制和连接被拒绝错误。

      【讨论】:

      • 这将提供到下一个可用服务器的隔离连接。但不能保证第二次尝试连接会成功。从服务器到设备可能需要大量往返。而且每一个新的连接都是昂贵的。
      • 如果您可以为目标重定向服务器设置一条规则,该规则在打开文件描述符数量方面具有最高可用性,那么您可以确保每次第二次尝试重定向。负载均衡器将读取每个节点的打开文件描述符值,并返回最佳可用服务器 ip。
      【解决方案4】:

      我不太了解负载平衡器应与客户端断开连接的要求。如果您的套接字实际上是 TCP 连接,就像它们看起来那样,我看不出如何在没有一些低级黑客攻击的情况下将连接卸载到在其他地方运行的客户端。例如,查看来自linux virtual server 的 ldirectord。这允许完全卸载连接。

      为了简单起见,我只使用HAProxy。完成您想要的大部分操作,除了卸载连接。

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

      【讨论】:

      • 实际上负载均衡服务器的卸载是不可避免的,并且应该尽可能快地完成(以便它可以接受其他连接请求)。并且负载均衡器应该尽可能简单,只是为了建立与客户端的第 3 方连接并自行卸载。谢谢
      • 但这让我很困惑。在适当的多线程负载均衡器中,可以同时处理多个请求,因此您的负载均衡器不会因为它已经处理另一个请求而变得不可用。通常它确实有可配置的限制,任何超出限制的连接都将排队。这是一个很好的example
      • 等等,我想我明白你要去哪里了。您需要一个 Java 负载平衡器,它接受传入连接,然后启动处理程序线程来处理该连接。只要请求完成,线程就会一直存在,但父进程返回接受下一个连接。您的要求特别是它必须在 java 中,不幸的是,这意味着我无法交付。自 2004 年以来就没有编写过 java 代码。但我仍然会大力推动 haproxy,因为它基本上可以满足您的需求,并且可能会表现得更好。
      • 线程不是问题。如果负载均衡器没有与客户端断开连接,它将达到操作系统打开文件限制,并且新连接将被拒绝。线程也会打开一个新文件,这也会导致同样的问题。
      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 2020-02-08
      • 2010-09-15
      • 2017-11-13
      • 2013-08-13
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      相关资源
      最近更新 更多