同一客户端访问多个负载均衡实例失败或超时

2021-01-28  本文已影响0人  孙毛毛丶

背景:服务器突然被很多渠道报告出现大量 timeout.随找问题

服务器中间有负载均衡
1.解决方法
增加负载均衡配置(无效)
检查 timewait 问题 TCP

ss -ant|awk '{s[$1]++} END {for (k in s) print k, s[k] }'
image.png

2.多台服务器对多台负载(无效)
最后找到
3.试图优化 Nginx(无效)


image.png

CentOS下内核TCP参数优化配置详解https://www.cnblogs.com/xkus/p/7463135.html

现象或问题
将相同 ECS 同时挂载在多个负载均衡实例的后端,并在这些负载均衡实例下创建相同的后端端口的四层监听。在这种场景下,用户用同一台客户端去同时访问这些负载均衡实例时,有时会出现失败或超时。
如下图所示,用户有两个负载均衡实例 SLB1 和 SLB2,分别有两个 TCP 监听,其前端端口不一致,但后端端口一致,并且这两个监听后端挂载了相同的云服务器 ECS。当一个用户 Client 去访问这两个 SLB 实例时,访问可能会失败。

引用:https://help.aliyun.com/document_detail/54007.html
https://help.aliyun.com/document_detail/32431.html

image.png

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

四层负载均衡(TCP协议)服务可以直接在后端ECS上获取客户端的真实IP地址,无需进行额外的配置。

七层负载均衡(HTTP/HTTPS协议)服务需要对应用服务器进行配置,然后使用X-Forwarded-For的方式获取客户端的真实IP地址

配置 Nginx 解决

 # 配置阿里云
    # 负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无
法分配到该网段内,不会存在安全风险)
    set_real_ip_from 100.64.0.0/10; #真实服务器上一级代理的IP地址或者IP段,可以写>多行。
    real_ip_header X-Forwarded-For; #设置请求头字段,表示从X-Forwarded-For字段获>取用户 IP
    real_ip_recursive on;           #递归的去除所配置中的可信IP。
上一篇下一篇

猜你喜欢

热点阅读