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