负载均衡器可扩展性和最大#tcp端口

时间:2012-04-10 08:52:39

标签: scalability load-balancing tcpsocket

负载均衡器将根据其运行的平台对可以同时使用的tcp端口数量进行一些限制(例如,我在某处读取Linux可以同时打开最多65535个tcp端口)。这意味着即使后端服务器场能够同时提供更多请求,平衡器也会成为瓶颈,并且无法提供超出同时多个请求的服务。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:8)

TCP和UDP端口号是16位,因此给定的IP只有65535(我相信端口0无效)。但是TCP连接由4元组(源IP,源端口,目标IP,目标端口)标识。 (看起来wikipedia有链接可以了解详情。)

对于客户端 - >平衡器请求:只要每个入站连接具有不同的(源IP,源端口),就没有问题。客户通常会确保这一点。我回忆起这方面的唯一问题是,一个非常受欢迎的网站,当从巨大的ISP访问时,每页有许多图像,这些ISP使他们的客户在很少的IPv4地址之后。那可能不是你的情况。

balancer->后端请求更有趣,因为您可能会为我上面提到的NAT问题创建类似的情况。我认为Linux通常会尝试为每个套接字分配一个不同的ephemeral port,默认情况下只有28,233个。并且IIRC它不会使用TIME_WAIT状态的那些,所以你可以在不实际同时打开那么多连接的情况下耗尽范围。 IIRC如果达到此限制,您将EADDRINUSE上的connect失败(如果您在连接之前明确绑定套接字,则在bind上)。{我不记得以前我是如何解决这个问题的,更不用说绝对最好的方式,但这里有一些可能有用的东西:

  • 保持持久性平衡器 - >后端连接,而不是为每个(可能是短暂的)客户端 - >平衡器连接创建新连接。
  • SO_REUSEADDR / bind之前的套接字上设置connect
  • 打开sysctl net.ipv4.tcp_tw_reuse和/或net.ipv4.tcp_tw_recycle
  • 明确选择要通过bind使用的源IP和/或端口,而不是让内核在connect上自动分配。你不能同时拥有两个同一个4元组的连接,但其他任何东西都没问题。 (例外:我正在思考TIME_WAIT是否重用同一个4元组是正常的;我必须通过阅读一些TCP RFC来刷新我对TIME_WAIT的记忆。)

您可能需要做一些实验。好消息是,一旦你理解了这个问题,它很容易重现并测试你是否已经修复它。