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

Haproxy負載做爲負載均衡服務器,確定會和客戶端創建不少的鏈接,而這些都須要消耗端口資源。當端口資源被消耗殆盡的時候,服務器隨之就會出現異常。那麼該如何解決這個問題呢?在網上看了不少網友的文章,整理成了以下的五種方法:mysql

1. 儘量使用多的端口

Linux系統默認提供了65536個端口,每當Haproxy創建了鏈接,就會消耗一個端口;當Haproxy斷開鏈接時,該端口不會被當即釋放,而是會處於TIME_WAIT狀態(2MSL,通常爲2分鐘),要在超出該時間後才能給新端口用。linux

若是將tcp_fin_wait設置爲15秒,那麼haproxy能夠承載的最大併發鏈接數爲:sql

64K/(15*2)=2.1K

可實際上達不到這個上線,緣由以下:shell

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

注意這個值也不要設置的過小,不然會出現其餘一些問題,須要一個比較折中的值。tcp

4. 使用多IP

端口的數量實際上是相對於IP而言的,若是有多個IP,那麼就可使用更多的端口。Haproxy提供了內建端口的管理方法,能夠充分利用以擴大咱們的端口範圍,配置以下:ide

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. 使用長鏈接

服務最好使用長鏈接,一是避免頻繁的端口申請,致使端口耗盡;二是避免建立鏈接帶來的時間消耗。

分享到此結束,謝謝~

相關文章
相關標籤/搜索