UDP 健康检查
针对四层UDP监听,健康检查通过UDP报文探测来获取状态信息,如下图所示。
image.png
当前 UDP 协议健康检查可能存在服务真实状态与健康检查不一致的问题:
如果后端 ECS 服务器是 Linux 服务器,在大并发场景下,由于 Linux 的防 ICMP 攻击保护机制,会限制服务器发送 ICMP 的速度。此时,即便服务已经出现异常,但由于无法向前端返回 “port XX unreachable” 报错信息,会导致负载均衡由于没收到 ICMP 应答进而判定健康检查成功,最终导致服务真实状态与健康检查不一致。
如果相应服务器非正常关机,由于也不会返回 “port XX unreachable” 报错信息。所以也会导致健康检查处于"正常"状态的误报。
image.png image.png为啥会失败(UDP)?
这里介绍一下UDP健康检查的原理。
首先,健康检查通过SLB向后端发送UDP报文探测来获取状态信息。
SLB会周期性地给后端ECS发送UDP报文,如果UDP端口的业务处于正常情况,则没有任何回应。
而当服务出现问题,比如指定的UDP服务端口处于不可达的情况或者无服务的状态的时候,会回复ICMP的不可达报文。
这里也会存在一个问题就是如果后端服务器已经变成了网络中的孤岛,比如出现了整个服务器的掉电、关机情况这样完全不能工作的状态,这时候的ICMP不可达报文是永远不可能收到的,因为后端的服务器无法收到SLB发来的UDP探测报文,那么在这种情况下,可能会出现误认为后端健康的情况,但是实际上这个服务可能已经宕掉了。
为了应对这种情况,健康检查还提供用户自定义UDP应答报文来实现精确的UDP健康检查,也就是由用户自定义指定一个字符串,当后端的云服务器收到UDP健康检查的探测的时候,也回应指定的字符串,之后SLB对于这个字符串进行对比和校验,如果匹配成功则认为服务一定是健康的,这样就可以实现非常精确的健康检查。
image.png而UDP的健康检查失败也有很多原因,比如在协议栈里面有可能会有ICMP限速保护。
当频率达到一定速率的时候,ICMP会被协议栈限制,后端无法回应ICMP不可达报文,进而导致SLB收不到ICMP的报文,出现健康检查的失败情况。
所以这部分是需要注意的,如果可能尽量将速率限制放大一些。
常用的均衡算法有哪些?
Random 随机
Round Robin 轮询
Weighted Round Robin 加权轮询
Least Connections 最少连接
Source Hashing 源地址散列
参考
想设计亿万级高并发架构,你要先知道高并发是什么?
https://www.csdn.net/tags/NtjaIgwsMTQ0ODUtYmxvZwO0O0OO0O0O.html
负载均衡(SLB)使用最佳实践
http://www.uml.org.cn/zjjs/201712141.asp
负载均衡SLB产品家族介绍
https://help.aliyun.com/document_detail/196874.html
负载均衡进阶:SLB常见问题解决方法
https://developer.aliyun.com/article/222524
SLB技术原理浅析
https://developer.aliyun.com/article/1803
负载均衡>传统型负载均衡CLB>CLB用户指南>健康检查>健康检查FAQ
https://help.aliyun.com/document_detail/55205.html
负载均衡>传统型负载均衡CLB>CLB用户指南>健康检查>健康检查概述
https://help.aliyun.com/document_detail/85958.html
常用的均衡算法有哪些?
https://mp.weixin.qq.com/s/AYwnc76hfbxTZMOUoa59Tg
负载均衡SLB高可用的四个层次
https://developer.aliyun.com/article/247044
再聊负载均衡SLB的主备可用区和高可用部署最佳实践
https://developer.aliyun.com/article/247044
阿里云SLB 会话保持常见问题
https://help.aliyun.com/document_detail/55202.html
阿里云SLB 高精度秒级监控
https://help.aliyun.com/document_detail/251757.html
阿里云 SLB 添加UDP监听
https://help.aliyun.com/document_detail/86130.htm
网友评论