文档首页/ 弹性负载均衡 ELB/ 常见问题/ 异常检查/ 为什么同一客户端同时访问不同ELB实例会概率性超时?
更新时间:2024-09-20 GMT+08:00

为什么同一客户端同时访问不同ELB实例会概率性超时?

问题描述

表1 问题概述

触发场景

多个四层ELB实例或同一四层ELB实例的多个监听器挂载相同后端服务器,同一客户端同时访问这些ELB实例。

问题现象

客户端概率性访问超时。

问题原因

当同一个客户端通过多个弹性负载均衡的四层监听器(TCP)访问到相同的后端服务器时,后端服务器从弹性负载均衡处接收的客户端请求报文的源IP和源端口相同,出现请求报文的五元组冲突,从而导致访问失败或超时。

问题分析

什么场景下后端服务器上不同四层连接会出现五元组冲突?

  • 客户端请求源端口硬编码为固定端口:客户端访问不同的弹性负载均衡时,客户端请求的源端口固定,例如固定为80端口。
  • 客户端请求源端口由操作系统自动选择:由于客户端访问不同的弹性负载均衡,即访问的目的IP地址不同,从而导致操作系统选择的客户端请求源端口可能相同。
图1 后端服务器接收请求报文五元组冲突示意图

同一客户端通过两个负载均衡器访问同一个后端服务器,客户端请求源端口相同且弹性负载均衡已开启获取客户端IP(DNAT模式)功能时,连接建立过程如图1

  1. 客户端发出源IP(IP-client)和源端口(100)相同的TCP请求1和TCP请求2到两个弹性负载均衡的公网IP地址EIP-1(12.xx.xx.xx)和EIP-2(13.xx.xx.xx)。
  2. 两个弹性负载均衡的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

  3. 弹性负载均衡将接收到请求转发到同一台后端服务器(IP-ECS),该后端服务器配置的业务端口都是90。
  4. 由于弹性负载均衡已开启获取客户端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

  5. 后端服务器接收到五元组报文相同的请求1和请求2,就会导致连接建立失败。

解决方案

为解决后端服务五元组冲突问题,客户端需要避免使用相同的源端口访问不同的实例或监听器,具体而言,您可采用以下措施:

  • 客户端请求源端口硬编码为固定端口时:修改固定源端口配置,使客户端通过不同的固定端口访问不同的负载均衡器。
  • 客户端请求源端口由操作系统自动选择时:
    • 允许客户端进行重试,客户端操作系统重连后,将通过不同的客户源端口发出请求,从而解决五元组冲突。
    • 若用户业务对重置连接极其敏感,需要更高的连接成功率,则请通过跨VPC后端添加后端服务器。在跨VPC后端场景下,产品底层基于FullNAT模式实现,获取客户端IP功能将会失效,源IP将会修改为负载均衡器后端子网中的IP地址。此时,若用户有获取客户端真实源IP的诉求,请通过配置TOA插件获取,详情请参见TOA插件配置
  • 在多组监听场景下,避免监听器使用相同的后端服务器。