如何解决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. 使用长链接

服务最好使用长链接,一是避免频繁的端口申请,致使端口耗尽;二是避免建立链接带来的时间消耗。

分享到此结束,谢谢~

相关文章
相关标签/搜索