如何解決haproxy服務器端口用完的問題
Haproxy負載作為負載均衡服務器,肯定會和客戶端建立很多的連接,而這些都需要消耗端口資源。當端口資源被消耗殆盡的時候,服務器隨之就會出現異常。那麽該如何解決這個問題呢?在網上看了很多網友的文章,整理成了如下的五種方法:
1. 盡可能使用多的端口
Linux系統默認提供了65536個端口,每當Haproxy建立了連接,就會消耗一個端口;當Haproxy斷開連接時,該端口不會被立即釋放,而是會處於TIME_WAIT狀態(2MSL,一般為2分鐘),要在超出該時間後才能給新端口用。
如果將tcp_fin_wait設置為15秒,那麽haproxy可以承載的最大並發連接數為:
64K/(15*2)=2.1K
可實際上達不到這個上線,原因如下:
net.ipv4.ip_local_port_range = 15000 65000
即可用的端口並沒有64K個。Linux會保留一些端口,實際能參與分配的端口數只有50K,為了盡可能多的分配端口,做如下調整:
net.ipv4.ip_local_port_range = 1024 65000
2. 端口復用
端口復用調整兩個參數:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
其中第一個參數很安全,第二個參數在某些情況下可能導致數據包的丟棄。例如:client通過NAT連接haproxy,並且haproxy端打開了net.ipv4.tcp_tw_recycle,同時saw_tstamp也沒有關閉,當第一個連接建立並關閉後,此端口處於TIME_WAIT狀態,在2MSL時間內又一個client(相同IP,如果打開了xfrm還要相同端口)發一個SYN包,此時linux內核就會認為這個數據包異常,從而丟帶這個包並發送RST包。
3. 縮短TIME_WAIT時間
Linux系統默認MSL為60秒,也就是正常情況下,120秒後處於TIME_WAIT狀態的端口才會被釋放,可以將MSL時間縮小,縮短端口釋放周期:
cat /proc/sys/net/ipv4/tcp_fin_timeout
60
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
註意這個值也不要設置的太小,否則會出現其他一些問題,需要一個比較折中的值。
4. 使用多IP
端口的數量其實是相對於IP而言的,如果有多個IP,那麽就可以使用更多的端口。Haproxy提供了內建端口的管理方法,可以充分利用以擴大我們的端口範圍,配置如下:
server mysql01 10.0.0.1:3306 check source 10.0.0.100:1025-65000 server mysql02 10.0.0.1:3306 check source 10.0.0.101:1025-65000
5. 使用長連接
服務最好使用長連接,一是避免頻繁的端口申請,導致端口耗盡;二是避免創建連接帶來的時間消耗。
分享到此結束,謝謝~
如何解決haproxy服務器端口用完的問題