ECS云服务器偶发Nginx502处理过程
业务访问请求过程
外部公网IP
↓ (阿里云DNAT规则)
CLB负载均衡地址:192.168.0.196
↓ (阿里云CLB负载均衡-监听)
前置nginx:192.168.0.192/192.168.0.194——请求后端应用服务时偶发报错502,且请求时间request_time时间超过3秒
↓ (upstream)——调整连接-proxy_connect_timeout/等待-proxy_read_timeout/发送请求-proxy_send_timeout到上游服务器响应的超时时间
↓ (proxy_pass)——但默认超时时间均为60秒,因此不是nginx到后端服务器的请求时间问题
后端应用服务VIP:192.168.0.197
↓ (keepalived)——健康检查配置/配置VRRP通信方式:组播地址
后端应用服务器组:192.168.0.179/192.168.0.180/192.168.0.195——后端应用服务调用时正常响应nginx请求,并正常回包
问题所在:
参考链接:
https://www.ithothub.com/ihh/2021080420214426.html
https://blog.csdn.net/windlyrain/article/details/88396866
阿里云官方文档明确描述了ECS不支持多播协议,而这里阿里云ECS/云服务器部署阿里云环境上;如果需要使用多播,建议改为使用单播点对点方式
阿里云官方文档:(ECS使用限制)
https://help.aliyun.com/zh/ecs/product-overview/limits?spm=a2c6h.13066369.question.5.30dc54e2XypnVy&source=5176.11533457&userCode=28kqeewo&type=copy
限制概述:
... ...
不支持多播协议。如果需要使用多播,建议改为使用单播点对点方式
... ...
解决方案:
单播模式需要关闭vrrp_strict,严格遵守vrrp协议这个选项
单播需要在VIP实例配置段加入单播的源地址和目标地址
keepalived修改配置(修改为单播地址)
1、关闭vrrp_strict配置
2、配置单播的IP,如下:
unicast_src_ip 192.168.0.61 unicast_peer { 192.168.0.60 }
除了keepalived外的其他一些负载均衡服务的底层协议有的默认也基于组播协议,这个限制或多或者给大家使用上增加一些困扰,大家自己来搭建负载均衡存在这一个限制外,另外还存在另外的一个限制就是VIP
### 具体配置如下:
vrrp_instance VI_1 {
state MASTER
interface eth0
unicast_src_ip 192.168.0.179 #单播:本机地址
virtual_router_id 51
priority 101
nopreempt
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
unicast_peer {
192.168.0.180 #单播:对端,即这里配置vip的其他服务器地址
192.168.0.195
}
virtual_ipaddress {
192.168.0.197
}
track_script {
chk_apiserver
} }
keepalive中组播地址与单播地址的区别
- 组播地址:
- 组播地址用于将数据包发送到一组主机。组播地址的范围是224.0.0.0到239.255.255.255
- 组播地址通常用于广播或多播通信,适用于需要向多个接收者发送相同数据的场景
- 单播地址:
- 单播地址用于将数据包发送到单个主机。单播地址的范围是1.0.0.0到223.255.255.255
- 单播地址适用于点对点通信,即数据包只发送到一个特定的目标主机
在阿里云上,keepalived配置组播地址导致Nginx 502错误
① 组播地址在网络中的路由和转发机制与单播地址不同。组播数据包可能会被路由器或交换机以不同的方式处理,导致数据包无法正确到达目标主机
② Nginx与后端服务器之间的网络设备不支持或不正确配置组播地址,可能导致数据包丢失或延迟,从而导致偶发Nginx502错误

浙公网安备 33010602011771号