服务器无响应900s后断开连接
复现步骤
- 创建一个桥接网络
docker network create --driver=bridge --subnet=172.100.0.0/16 br0
- 启动2个nginx容器
docker run -d --name nginx1 --ip 172.100.1.1 --net=br0 nginx
docker run -d --name nginx2 --ip 172.100.1.2 --net=br0 nginx
- 使用LVS创建一个负载均衡器并且将流量导向172.100.1.1:80
ipvsadm -A-t 100.100.100.100:80 -s rr
ipvsadm -a -t 100.100.100.100:80 -r 172.100.1.1:80 -m -w 1
- 查看状态信息
ipvsadm -ln
> IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 100.100.100.100:80 rr
-> 172.100.1.1:80 Masq 1 0 0
-> 172.100.1.2:80 Masq 1 0 0
- 将来自 IP 地址为 172.100.1.1 的流量丢弃(DROP),即拒绝接收来自这个特定 IP 地址的所有入站数据包。这里是模拟程序或者服务突然挂掉,还没有来得及向客户端发送reset包
iptables -A INPUT -s 172.100.1.1 -j DROP
- LVS将流量切到172.100.1.2:80
ipvsadm -a -t 100.100.100.100:80 -r 172.100.1.2:80 -m -w 1
- 旧的长连接没有响应
nc 100.100.100.100 80
- 新开的窗口通过负载均衡走到172.100.1.2:80的这台机器上了,成功响应
nc 100.100.100.100 80
以上就成功复现了,服务突然挂掉后,客户端没有收到相关的ack或者reset包,导致链接一直在重试,直到900s后才正常。 而新的连接,通过负载均衡器连接到正常的服务器,所以能正常工作。