概述
健康检查是负载均衡监听器用于检查后端服务器组可用性的功能,在一定程度上规避了后端服务器组故障对整体可用性的影响。
开启健康检查后,监听器将会自动屏蔽异常状态的后端服务器,即不向其转发请求,当后端服务器恢复正常后解除屏蔽。
注意事项
健康检查会占用一定的网络资源,建议结合业务情况,通过降低健康检查频率、增大健康检查间隔等方式,来降低对业务的影响。但为了保障业务的持续可用,不建议关闭健康检查,关闭健康检查可能会导致请求被转发给异常的后端服务器。
原理
TCP监听器健康检查原理
TCP监听器使用TCP协议对后端服务器组进行健康检查。
TCP监听器的检查原理如下:
- CLB实例根据监听器的健康检查配置,向后端服务器的内网IP+端口发送TCP SYN数据包。
- 后端服务器收到请求后,如果相应端口正在正常监听,则会返回SYN+ACK数据包。
- 如果在“响应超时时间”之内,CLB实例没有收到后端服务器返回的数据包,则认为服务无响应,判定健康检查失败;并向后端服务器发送RST数据包中断TCP连接。
- 如果在“响应超时时间”之内,CLB实例成功收到后端服务器返回的数据包,则认为服务正常运行,判定健康检查成功,而后向后端服务器发送RST数据包中断TCP连接。
说明
正常的TCP三次握手,CLB实例在收到后端服务器返回的SYN+ACK数据包后,会进一步发送ACK数据包,而后进行数据传输,但进行健康检查时会立即发送RST数据包中断TCP连接。
该实现机制可能会导致后端服务器认为相关TCP连接异常退出,并抛出错误信息,如Connection reset by peer
。解决方案如下:
- 采用HTTP方式进行健康检查。
- 在后端服务器上配置了获取客户端的真实IP,则可忽略来自健康检查的连接错误。
UDP监听器健康检查原理
UDP监听器使用UDP协议对后端服务器组进行健康检查。根据是否指定健康检查字符实现原理略有不同,如下图所示。
- 未指定健康检查字符时,UDP监听的检查原理如下:
- CLB实例向后端服务器的内网IP地址发送ICMP报文。
- CLB实例向后端服务器的(内网IP地址+健康检查端口)发送UDP探测报文。
- 如果在“响应超时时间”之内,ICMP报文发送成功且CLB实例未收到后端服务器返回的类似
port unreachable
的报错信息,则判定健康检查成功;否则,判定健康检查失败。
- 指定健康检查字符时,UDP监听的检查原理如下:
- CLB实例根据用户指定的字符向后端服务器的(内网IP地址+健康检查端口)发送UDP探测报文。
- 如果在“响应超时时间”之内,CLB实例收到后端服务器返回的与预期一致的信息,则判定健康检查成功;否则,判定健康检查失败。
说明
- UDP监听器健康检查可能会出现健康检查状态与服务真实状态不符的情况。
- 当后端服务器操作系统为Linux时,其防ICMP攻击保护机制,使后端服务器在大并发场景下发送ICMP的速度被限制,异常的后端服务器无法及时返回报错信息,导致监听器判断健康检查成功。
HTTP/HTTPS监听器健康检查原理
HTTP/HTTPS监听器统一使用HTTP协议对后端服务器组进行健康检查。
原理如下:
- CLB实例根据监听的健康检查配置,向后端服务器的【内网IP+端口+URL】或【域名+URL】,发送HTTP GET/HEAD请求。
- 后端服务器收到请求后,根据相应服务的运行情况,返回HTTP状态码。
- 如果在“响应超时时间”之内,CLB实例没有收到后端服务器返回的信息,则认为服务无响应,判定健康检查失败。
- 如果在“响应超时时间”之内,CLB实例成功接收到后端服务器返回的信息,则将返回的HTTP状态码与配置的状态码进行比对。如果匹配则判定健康检查成功。