CLB健康检查

更新时间:2025-02-21 10:08:31

CLB通过健康检查判断后端服务器的可用性。开启健康检查后,如果某台后端服务器异常,CLB会将请求分发到其他正常的服务器。当该服务器恢复正常,CLB会重新将其流量转发。健康检查机制提高了业务整体可用性,避免了局部服务器异常对服务的影响。

重要

如果您的业务对负载敏感,高频率的健康检查可能影响正常业务访问。您可以根据业务情况,通过降低健康检查频率、增大检查间隔、将七层检查改为四层检查等方式,来降低影响。但为了保障业务的持续可用,不建议关闭健康检查。

健康检查过程

健康检查是通过定期发送请求来确认服务器的状态。

CLB采用集群部署,集群内的节点服务器同时负责数据转发和健康检查。如果某台服务器健康检查失败,则不会再将新的客户端请求分发给该异常服务器。

CLB健康检查使用的地址段是100.64.0.0/10,后端服务器务必不能屏蔽该地址段。您无需在ECS安全组中额外配置放行策略,但如有配置iptables等安全策略,请务必放行(100.64.0.0/10 是阿里云保留地址,不会存在安全风险)。

image

HTTP/HTTPS监听健康检查机制

七层监听(HTTP/HTTPS)通过HEADGET请求进行健康检查。

HTTPS监听的证书由CLB系统管理,数据交互使用HTTP以提高性能。

image

七层监听的检查机制如下:

  1. 服务器根据配置向后端服务器发送HTTP HEAD请求。

  2. 后端服务器返回HTTP状态码。

  3. 若在响应超时时间内未收到响应,则判定健康检查失败。

  4. 若在响应超时时间内收到响应,则比对状态码,匹配则成功,否则失败。

TCP监听健康检查机制

为了提高四层TCP监听的健康检查效率,健康检查通过定制的TCP探测来获取状态信息,如下图所示。

image

TCP监听的检查机制如下:

  1. 四层集群中的服务器根据健康检查配置,向后端服务器的内网IP和健康检查端口发送TCP SYN数据包。

  2. 后端服务器收到请求后,如果相应端口正在正常监听,则返回SYN+ACK数据包。

  3. 如果在响应超时时间内,四层集群中的服务器没有收到后端服务器返回的数据包,则认为服务无响应,判定健康检查失败,并发送RST数据包中断TCP连接。

  4. 如果在响应超时时间内,四层集群中的服务器成功收到后端服务器返回的数据包,则认为服务正常运行,判定健康检查成功,并发送RST数据包中断TCP连接。

说明

该机制可能会导致后端服务器认为相关TCP连接异常,并在业务软件日志中抛出Connection reset by peer错误信息。

解决方案:

  • TCP监听采用HTTP方式进行健康检查。

  • 在后端服务器配置获取客户端真实IP后,忽略来自CLB服务地址段的连接错误。

UDP监听健康检查

针对四层UDP监听,健康检查通过UDP报文探测来获取状态信息,如下图所示。

image

UDP监听的检查机制如下:

  1. 四层集群服务器根据健康检查配置,向后端服务器的内网IP和健康检查端口发送UDP报文。

  2. 如果后端服务器端口未正常监听,则系统产生ICMP报错信息,否则不做处理。

  3. 如果在响应超时时间内收到错误信息,则判定健康检查失败;否则,判定健康检查成功。

说明

在大并发场景下,Linux服务器的防ICMP攻击保护机制可能导致健康检查结果与服务真实状态不一致。

解决方案:

负载均衡通过发送指定字符串到后端服务器,并在收到指定应答后判定检查成功。此机制需要客户端程序配合。

健康检查时间窗

健康检查机制提高了服务可用性,但为了避免频繁切换影响系统,只有在健康检查时间窗内连续多次检查成功或失败后,才会进行状态切换。健康检查时间窗由以下三个因素决定:

  • 健康检查间隔(每隔多久进行一次健康检查)

  • 响应超时时间 (等待服务器返回健康检查的时间)

  • 检查阈值(健康检查连续成功或失败的次数)

健康检查时间窗口的计算方法如下:

  • 健康检查失败时间窗口=响应超时时间×不健康阈值+检查间隔×(不健康阈值-1)

  • 健康检查成功时间窗口= (健康检查成功响应时间x健康阈值)+检查间隔x(健康阈值-1)

    说明

    健康检查成功响应时间是一次健康检查请求从发出到响应的时间。TCP方式健康检查时间非常短,几乎可以忽略不计;HTTP方式健康检查时间取决于服务器性能和负载,通常在秒级以内。

健康检查状态对请求转发的影响如下:

  • 如果目标后端服务器的健康检查失败,新的请求不会再分发到相应后端服务器上,所以对前端访问没有影响。

  • 如果目标后端服务器的健康检查成功,新的请求会分发到该后端服务器上,前端访问正常。

  • 如果目标后端服务器存在异常,正处于健康检查失败时间窗,而健康检查还未达到检查失败判定次数(默认为三次),则相应请求还是会被分发到该后端服务器,进而导致前端访问请求失败。

image

健康检查响应超时和健康检查间隔示例

以如下健康检查配置为例:

  • 响应超时时间:5

  • 健康检查间隔:2

  • 健康阈值:3

  • 不健康阈值:3

健康检查失败时间窗口=响应超时时间×不健康阈值+检查间隔×(不健康阈值-1),5×3+2×(3-1)=19s,即以19s为一个时间窗,健康检查响应时间超过19s,健康检查状态为不健康。

健康检查成功时间窗口= (健康检查成功响应时间×健康阈值)+检查间隔×(健康阈值-1),(1×3)+2×(3-1)=7s,即以7s为一个时间窗,健康检查成功响应时间低于7s,健康检查状态为健康。

说明

健康检查成功响应时间是一次健康检查请求从发出到响应的时间。当采用TCP方式健康检查时,由于仅探测端口是否存活,因此该时间非常短,几乎可以忽略不计。当采用HTTP方式健康检查时,该时间取决于应用服务器的性能和负载,但通常都在秒级以内。

HTTP健康检查中域名的设置

使用HTTP方式进行健康检查时,可以设置域名,但这不是强制的。有些应用服务器会校验请求中的host字段,要求请求头中必须存在host字段。如果配置了域名,CLB会将其添加到host字段中。如果没有配置域名,健康检查请求可能会被服务器拒绝,导致检查失败。

因此,如果您的应用服务器需要校验host字段,请配置相关域名以确保健康检查正常工作。

相关文档

  • 本页导读 (1)
  • 健康检查过程
  • HTTP/HTTPS监听健康检查机制
  • TCP监听健康检查机制
  • UDP监听健康检查
  • 健康检查时间窗
  • 健康检查响应超时和健康检查间隔示例
  • HTTP健康检查中域名的设置
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等