为什么同一客户端同时访问不同ELB实例会概率性超时?
问题描述
触发场景 |
多个四层ELB实例或同一四层ELB实例的多个监听器挂载相同后端服务器,同一客户端同时访问这些ELB实例。 |
---|---|
问题现象 |
客户端概率性访问超时。 |
问题原因 |
当同一个客户端通过多个弹性负载均衡的四层监听器(TCP)访问到相同的后端服务器时,后端服务器从弹性负载均衡处接收的客户端请求报文的源IP和源端口相同,出现请求报文的五元组冲突,从而导致访问失败或超时。 |
问题分析
什么场景下后端服务器上不同四层连接会出现五元组冲突?
- 客户端请求源端口硬编码为固定端口:客户端访问不同的弹性负载均衡时,客户端请求的源端口固定,例如固定为80端口。
- 客户端请求源端口由操作系统自动选择:由于客户端访问不同的弹性负载均衡,即访问的目的IP地址不同,从而导致操作系统选择的客户端请求源端口可能相同。
同一客户端通过两个负载均衡器访问同一个后端服务器,客户端请求源端口相同且弹性负载均衡已开启获取客户端IP(DNAT模式)功能时,连接建立过程如图1。
- 客户端发出源IP(IP-client)和源端口(100)相同的TCP请求1和TCP请求2到两个弹性负载均衡的公网IP地址EIP-1(12.xx.xx.xx)和EIP-2(13.xx.xx.xx)。
- 两个弹性负载均衡的TCP监听端口都是80,收到的请求1和请求2的五元组报文如下:
表2 负载均衡器接收五元组详情 五元组报文
协议
源IP
源端口
目的IP
目的端口
五元组1-ELB
TCP
IP-Client
100
12.xx.xx.xx
80
五元组2-ELB
TCP
IP-Client
100
13.xx.xx.xx
80
- 弹性负载均衡将接收到请求转发到同一台后端服务器(IP-ECS),该后端服务器配置的业务端口都是90。
- 由于弹性负载均衡已开启获取客户端IP功能,源IP和源端口不会被修改,后端服务器接收到ELB转发的请求1和请求2,请求报文五元组如下:
表3 后端服务器接收五元组详情 五元组报文
协议
源IP
源端口
目的IP
目的端口
五元组1-ECS
TCP
IP-Client
100
IP-ECS
90
五元组2-ECS
TCP
IP-Client
100
IP-ECS
90
- 后端服务器接收到五元组报文相同的请求1和请求2,就会导致连接建立失败。
解决方案
为解决后端服务五元组冲突问题,客户端需要避免使用相同的源端口访问不同的实例或监听器,具体而言,您可采用以下措施:
- 客户端请求源端口硬编码为固定端口时:修改固定源端口配置,使客户端通过不同的固定端口访问不同的负载均衡器。
- 客户端请求源端口由操作系统自动选择时:
- 允许客户端进行重试,客户端操作系统重连后,将通过不同的客户源端口发出请求,从而解决五元组冲突。
- 若用户业务对重置连接极其敏感,需要更高的连接成功率,则请通过跨VPC后端添加后端服务器。在跨VPC后端场景下,产品底层基于FullNAT模式实现,获取客户端IP功能将会失效,源IP将会修改为负载均衡器后端子网中的IP地址。此时,若用户有获取客户端真实源IP的诉求,请通过配置TOA插件获取,详情请参见TOA插件配置。
- 在多组监听场景下,避免监听器使用相同的后端服务器。