負載平衡器將基於它運行的平臺,它可以同時使用多少個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. WCF SSL over負載平衡器。負載均衡器更改SSL端口
- 6. 彈性負載均衡器和https
- 7. Socket.io和負載均衡器
- 8. 彈性負載均衡器端口重定向?
- 9. Nginx多負載均衡器或單負載均衡器
- 10. GCP負載均衡器或Kubernetes類型=負載均衡器
- 11. activemq負載均衡使用彈性負載平衡器?
- 12. Akka Http客戶端+負載均衡器
- 13. 您如何負載均衡TCP流量?
- 14. Nginx負載均衡 - TCP,SSL,HTTPS
- 15. 負載均衡
- 16. AWS彈性負載均衡器超時
- 17. 帶非80/443端口的ElasticBeanstalk負載均衡器?
- 18. 負載均衡器沒有可用的客戶端服務器
- 19. 如何獲取tomcat主機和端口號的負載均衡?
- 20. 使用負載均衡器
- 21. 負載均衡服務器
- 22. Erlang負載均衡器
- 23. 負載均衡和APC
- 24. SignalR和負載均衡
- 25. yii2和負載均衡
- 26. AWS Beanstalk負載均衡器到非HTTP端口
- 27. 將端口添加到Azure負載均衡器
- 28. EC2負載均衡實例協議和端口
- 29. nginx負載均衡器和OAuth
- 30. 負載均衡器和會話管理