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

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

分享到此结束,谢谢~

猜你喜欢

转载自blog.51cto.com/13178102/2354745