负载均衡器可扩展性和最大 #tcp 端口
Posted
技术标签:
【中文标题】负载均衡器可扩展性和最大 #tcp 端口【英文标题】:Load balancer scalability and max #tcp ports 【发布时间】:2012-04-22 13:31:43 【问题描述】:负载均衡器会根据它运行的平台对它可以同时使用多少个 tcp 端口有一些限制(例如,我在某处读到 Linux 最多可以同时打开 65535 个 tcp 端口)。这意味着平衡器成为一个瓶颈,并且即使后端服务器场能够同时处理更多请求,也无法提供超出这些同时请求的服务。有什么办法可以解决这个问题吗?
【问题讨论】:
【参考方案1】:TCP 和 UDP 端口号是 16 位的,因此给定的 IP 只有 65535 个(我相信端口 0 无效)。但是 TCP 连接由 4 元组(源 IP、源端口、目标 IP、目标端口)标识。 (看起来wikipedia 有链接可以了解更多信息。)
对于客户端->平衡器请求:只要每个入站连接具有不同的(源 IP、源端口),就没有问题。客户通常会确保这一点。我记得听说过的唯一问题是一个非常受欢迎的网站,当从巨大的 ISP 访问时,每页有很多图像,这些 ISP 对他们的客户进行了 NAT,只在很少的 IPv4 地址后面。那可能不是你的情况。
平衡器->后端请求更有趣,因为您可能正在创建与我上面提到的 NAT 问题类似的情况。我认为 Linux 通常会尝试为每个套接字分配一个不同的 ephemeral port,默认情况下只有 28,233 个。并且 IIRC 它也不使用处于 TIME_WAIT
状态的那些,因此您可以用尽范围而实际上不会同时打开那么多连接。 IIRC,如果您达到此限制,您将在connect
上获得EADDRINUSE
失败(如果在连接之前明确绑定套接字,则在bind
上)。我不记得我以前是如何解决这个问题的,更不用说绝对最好的方法了,但这里有一些可能会有所帮助的事情:
bind
/connect
之前的套接字上设置SO_REUSEADDR
。
打开 sysctl net.ipv4.tcp_tw_reuse
和/或 net.ipv4.tcp_tw_recycle
。
通过bind
明确选择要使用的源IP 和/或端口,而不是让内核在connect
上自动分配。您不能同时使用相同的 4 元组进行两个连接,但其他任何事情都可以。 (例外:我正在考虑是否可以重复使用同一 4 元组的 TIME_WAIT
;我必须通过阅读一些 TCP RFC 来刷新我对 TIME_WAIT
的记忆。)
您可能需要做一些实验。好消息是,一旦您了解了问题,就很容易重现它并测试您是否已修复它。
【讨论】:
以上是关于负载均衡器可扩展性和最大 #tcp 端口的主要内容,如果未能解决你的问题,请参考以下文章
内部 TCP 负载平衡器上的目标端口 - Google Cloud
使用 TCP TLS 到 Nginx 的 AWS 经典负载均衡器