2012-04-10 124 views
4

負載平衡器將基於它運行的平臺,它可以同時使用多少個tcp端口有一些限制(例如,我讀了某處可以同時打開最多65535個tcp端口的Linux) 。這意味着即使後端服務器場能夠同時處理更多的請求,平衡器也會成爲瓶頸,並且無法超越那些同時發生的請求。有什麼辦法可以解決這個問題嗎?負載均衡器的可擴展性和最大#tcp端口

回答

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_REUSEADDRbind/connect之前的插座上。
  • 開啓sysctl net.ipv4.tcp_tw_reuse和/或net.ipv4.tcp_tw_recycle
  • 明確地選擇通過bind使用的源IP和/或端口,而不是讓內核自動分配到connect。你不能有同一個4元組的兩個同時連接,但其他任何事情都可以。 (例外:我撐船通過TIME_WAIT重複使用相同的4元組是否是好的思想,我不得不通過一些TCP RFC文檔閱讀,刷新了我對TIME_WAIT內存。)

你可能會必須做一些實驗。好消息是,一旦你理解了這個問題,重現它並且測試是否已經修復它是相當容易的。