阅读919 返回首页    go 阿里云


同一客户端访问多个负载均衡实例失败或超时__异常排查_负载均衡-阿里云

应用场景

将相同ECS同时挂载在多个负载均衡实例的后端,并在这些负载均衡实例下创建相同的后端端口的四层监听。在这种场景下,用户用同一台客户端去同时访问这些负载均衡实例时,有时会出现失败或超时。

架构图

架构图

如上图所示,用户有两个负载均衡实例SLB1和SLB2,分别有两个TCP监听,其前端端口不一致,但后端端口一致,并且这两个监听后端挂载了相同的云服务器ECS。当一个用户Client去访问这两个SLB实例时,访问可能会失败。

具体原因

  1. 四层 (TCP协议) 负载均衡会对用户的访问流量在入方向做DNAT
  2. 当客户端访问SLB1时,CIP:CPORT->VIP1:VPORT1的连接在到达后端ECS的时候,会被转换成CIP:CPORT->DIP:DPORT。
  3. 当客户端访问SLB2时,CIP:CPORT->VIP2:VPORT2的连接在到达后端ECS的时候,也会被转换成CIP:CPORT->DIP:DPORT;
  4. 两条TCP连接的序列号和TCP状态在后端服务器上互相干扰,导致建连失败,即Client建立的两条连接在后端服务器上变成了同样的五元组TCP:CIP:CPORT:DIP:DPORT

    注⚠:

    CIP: Client IP (客户端IP);

    VIP1: 负载均衡实例SLB1的IP地址;

    VIP2: 负载均衡实例SLB2的IP地址;

    VPORT1: 负载均衡实例SLB1的监听前端端口;

    VPORT2: 负载均衡实例SLB2的监听前端端口;

    DIP: 后端服务器的IP地址;

    DPORT: 后端服务器的端口;

    解决思路

在这样的场景下,需要在后端服务器上避免出现同样的五元组,因协议类型固定为TCP,则需要调整后面的四元组组成。

1.避免CIP冲突: 如果后端服务是HTTP服务,可将其中一个SLB实例的四层监听切换为七层监听,七层SLB监听通过HTTP头部的X-Forward-For字段获取客户端源地址,二者不会产生冲突;另外,使用不同的Client访问这两个监听也可避免此问题出现。

2.避免CPORT冲突: 在Client发起针对VIP1、 VIP2的TCP建连请求时,指定源端口CPORT进行访问(如访问VIP1时使用CPORT范围是10000 – 29999,访问VIP2时使用CPORT范围是30000 – 49999)。

3.避免DIP冲突:即避免同一个后端服务器挂载在多个SLB实例后面。

4.避免DPORT冲突:如果后端服务非HTTP服务,则可将其中一个SLB实例四层监听的后端服务器服务端口修改,也可以避免该问题。

最后更新:2016-12-20 19:37:08

  上一篇:go 部署负载均衡集群支持会话同步__常见问题_负载均衡-阿里云
  下一篇:go curl正常但健康检查异常__异常排查_负载均衡-阿里云