1. 程式人生 > >如何解決haproxy服務器端口用完的問題

如何解決haproxy服務器端口用完的問題

超出 數據包 出現 amp 例如 系統 如果 rec 客戶端

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服務器端口用完的問題