CLB串流导致TCP连接超时
背景
线上Nginx服务突然报错,日志打印Connection timed out
排查
首先看一下完整日志
connect() failed (110: Connection timed out) while connecting to upstream ....
看来是熟悉的味道,和上次的问题一样TCP连接超时
于是和对方业务沟通:我们出现SYN丢包了,得检查你们TCP连接队列满了是否有丢包,^_^
对方有5台机器,发现有一台机器确实有SYN丢包问题:
于是愉快的让对方先将这台机器隔离出来,再观察下情况。
然鹅第二天业务高峰的时候,还是出现了TCP连接超时。
梳理调用链路:
客户端 -> 我方Nginx -> CLB ->对方Nginx ->对方后台服务
仔细想想,CLB后面挂载的是对方Nginx,这货不太可能出现连接队列满的情况。 难道是网络或者CLB有丢包?
于是和CLB助手沟通丢包问题,对方直接抛出了文档:
关于同一个客户端通过不同的中间节点访问同一个后端 RS 的同一个端口时串流问题的说明
问题现象
同一个客户端在同一时刻,通过不同的中间节点访问同一个 RS 的同一个端口会出现串流现象。具体场景如下:
同一个客户端,同时通过同一个 CLB 的四层、七层监听器,访问同一个 RS 的同一个端口。
同一个客户端,同时通过不同 CLB 的不同监听器,访问同一个 RS 的同一个端口。
访问内网 CLB 的客户端比较集中,且后端服务相同时,有较大概率会出现串流。(访问公网 CLB 的客户端来源较广,很少出现串流。)
问题原因
当前 CLB 会透传客户端 IP 到后端 RS,因此会导致 client_ip:client_port -> vip:vport -> rs_ip:rs_port 最终变为 client_ip:client_port --> rs_ip:rs_port
检查确实会有可能出现串流问题,我方通过两个CLB访问对方的Nginx,两个CLB都挂载了同样的RS。
client_ip:client_port -> vip:vport -> rs_ip:rs_port 最终变为 client_ip:client_port --> rs_ip:rs_port
经过CLB地址转换后,TCP四元组确实会重复,也就是串流。如果串流后,建连的SYN包肯定会被协议栈丢掉。
解决方法: 将2个CLB分别挂载不同的RS
Ref
[0x01]https://cloud.tencent.com/document/product/214/5411