负载平衡器将基于它运行的平台,它可以同时使用多少个tcp端口有一些限制(例如,我读了某处可以同时打开最多65535个tcp端口的Linux) 。这意味着即使后端服务器场能够同时处理更多的请求,平衡器也会成为瓶颈,并且无法超越那些同时发生的请求。有什么办法可以解决这个问题吗?负载均衡器的可扩展性和最大#tcp端口
4
A
回答
8
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
(或如果您在连接之前显式绑定套接字时在bind
上)获得EADDRINUSE
故障。我不记得确切我如何解决此之前,更谈不上绝对的最佳途径得到,但这里有几件事情,可以帮助:
- 保持持续balancer->后端连接,而不是创建一个新的每个(可能是短暂的)客户端 - >平衡器连接。
- 设置
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
内存。)
你可能会必须做一些实验。好消息是,一旦你理解了这个问题,重现它并且测试是否已经修复它是相当容易的。
相关问题
- 1. IPTables端口负载均衡
- 2. Azure负载均衡器端口号码
- 3. 谷歌TCP负载均衡器端口转发
- 4. 春天RMI负载均衡/可扩展性
- 5. 弹性负载均衡器端口重定向?
- 6. Akka Http客户端+负载均衡器
- 7. 您如何负载均衡TCP流量?
- 8. Nginx负载均衡 - TCP,SSL,HTTPS
- 9. 负载均衡
- 10. 负载均衡器没有可用的客户端服务器
- 11. 使用负载均衡器
- 12. 负载均衡服务器
- 13. yii2和负载均衡
- 14. SignalR和负载均衡
- 15. 负载均衡和APC
- 16. AWS Beanstalk负载均衡器到非HTTP端口
- 17. 将端口添加到Azure负载均衡器
- 18. 负载均衡器和会话管理
- 19. nginx负载均衡器和OAuth
- 20. TCP监听器在负载均衡器后面不工作
- 21. 与负载均衡
- 22. MongoDB负载均衡
- 23. 动态端口和AWS应用程序负载均衡器和ECS
- 24. 带负载均衡器可伸缩性的websockets
- 25. 负载均衡客户端连接
- 26. 负载均衡的Fiware Orion
- 27. docker swarm的负载均衡
- 28. HAProxy的负载均衡
- 29. EC2 - 在弹性负载均衡
- 30. 带负载均衡器的RabbitMQ集群