概述
健康检查是一个用于检查后端服务器的可用性和运行状态的功能。开启健康检查后,负载均衡实例会定期发送健康检查请求到后端服务器,以确定后端服务器的状态是否正常。
负载均衡实例只会向状态正常的后端服务器转发客户端请求。如果一台后端服务器的状态异常,负载均衡实例将不会把请求转发到该后端服务器,从而避免将请求发送到不可用的服务器上。当后端服务器恢复正常运行后,负载均衡实例会继续向该后端服务器转发请求。
健康检查协议
后端协议是TCP时,健康检查协议可以配置为TCP或HTTP。后端协议是UDP时,健康检查协议可以配置为UDP、TCP或HTTP。但是,如果健康检查协议与后端协议不同,可能导致检查结果与后端服务器的实际状态不一致,影响负载均衡流量的分发。
以下内容对基于各协议的健康检查机制进行说明。
健康检查机制
TCP健康检查机制
TCP健康检查流程图
TCP健康检查流程如下:
- 负载均衡实例根据健康检查配置,向后端服务器(IP+健康检查端口)发送TCP SYN报文。
- 当后端服务器收到请求报文之后,在相应端口的监听状态正常的情况下,后端服务器会返回SYN+ACK报文。
- 负载均衡实例根据情况返回报文给后端服务器:
- 在超时时间内,如果负载均衡实例没有收到来自后端服务器的SYN+ACK报文,负载均衡实例会判定健康检查失败。然后,负载均衡实例向后端服务器发送RST报文来中断TCP连接。
- 在超时时间内,如果负载均衡实例收到了来自后端服务器的SYN+ACK报文,负载均衡实例判定健康检查成功。然后,负载均衡实例向后端服务器发送ACK报文,随后再向后端服务器发送RST报文来中断TCP连接。
UDP健康检查机制
UDP健康检查流程图
UDP健康检查流程如下:
- 负载均衡实例根据健康检查配置,向后端服务器发送ICMP Echo Request报文。
- 负载均衡实例判断检查健康是否成功:
- 在超时时间内,如果负载均衡实例没有收到来自后端服务器的ICMP Echo Reply报文,则判定健康检查失败。
- 在超时时间内,如果负载均衡实例收到了ICMP Echo Reply报文,则向后端服务器发送UDP探测报文。
- 未配置检查字符串时
在超时时间内,如果负载均衡实例没有收到后端服务器返回的ICMP Port Unreachable报文,则判定健康检查成功。如果负载均衡实例收到了ICMP Port Unreachable报文,则判定健康检查失败。 - 配置了检查字符串时
负载均衡实例向后端服务器发送的UDP探测报文带有检查字符串。在超时时间内,如果负载均衡实例收到了来自后端服务器的响应报文,则判定健康检查成功。如果负载均衡实例没有收到响应报文,则判定健康检查失败。
HTTP健康检查机制
HTTP健康检查流程图
HTTP健康检查流程:
- 负载均衡实例根据健康检查配置,向后端服务器(IP+端口+检查路径)发送HTTP GET请求。您可以选择设置Host头域。
- 后端服务器收到请求后,根据情况返回相应的HTTP状态码。
- 负载均衡实例判断检查健康是否成功:
- 在响应超时时间内,如果负载均衡实例收到了后端服务器的响应,会将HTTP状态码与配置的状态码进行对比。如果状态码匹配,负载均衡实例判定健康检查成功、后端服务器运行正常。
- 在响应超时时间内,如果负载均衡实例没有收到后端服务器的响应,则判定健康检查失败。