负载均衡器将根据其运行的平台对可以同时使用的tcp端口数量进行一些限制(例如,我在某处读取Linux可以同时打开最多65535个tcp端口)。这意味着即使后端服务器场能够同时提供更多请求,平衡器也会成为瓶颈,并且无法提供超出同时多个请求的服务。有没有办法解决这个问题?
答案 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
。net.ipv4.tcp_tw_reuse
和/或net.ipv4.tcp_tw_recycle
。bind
使用的源IP和/或端口,而不是让内核在connect
上自动分配。你不能同时拥有两个同一个4元组的连接,但其他任何东西都没问题。 (例外:我正在思考TIME_WAIT
是否重用同一个4元组是正常的;我必须通过阅读一些TCP RFC来刷新我对TIME_WAIT
的记忆。)您可能需要做一些实验。好消息是,一旦你理解了这个问题,它很容易重现并测试你是否已经修复它。