更新时间:2022-01-25 GMT+08:00

健康检查异常如何排查?

问题描述

客户端通过负载均衡器访问后端服务器异常,负载均衡器的“后端服务器组”页签显示后端服务器的健康检查结果为“异常。”

背景介绍

ELB的健康检查通过向后端服务器发起心跳检查的方式来实现,检查过程中使用内网地址100.125.0.0/16通信。为了确保健康检查的正常进行,您需要确保服务器已经放通100.125.0.0/16网段的地址,使得ELB能够正常访问到后端服务器

当健康检查探测到您的后端服务器异常时,ELB会将异常的服务器暂时移出后端服务器组,不再向异常的后端服务器转发流量。直到健康检查检测到后端服务器恢复正常时,ELB才会向此服务器继续转发流量。

  • 当ELB后端服务器的健康检查状态处于异常状态时,ELB不会向该后端服务器转发请求。
  • 当健康检查关闭时,ELB默认后端服务器正常在线,会将请求转发至后端服务器
  • ELB会使用100.125.0.0/16网段IP向后端服务器发送健康检查请求和正常的客户端请求。
  • 当后端服务器的权重为0时,流量不会再转发到该后端服务器上,此时健康检查的状态无参考意义。

排查思路

以下排查思路根据原因的出现概率进行排序,建议您从高频率原因往低频率原因排查,从而帮助您快速找到问题的原因。

如果解决完某个可能原因仍未解决问题,请继续排查其他可能原因。

相关修改配置的操作,修改完配置后需要等待一定的时间,配置才会生效,因为健康检查包含检查周期和阈值(根据默认配置为几十秒生效,如果健康检查恢复正常,在ELB关联的后端服务器基本信息界面可以看到健康检查状态是否正常)。

图1 排查思路
表1 排查思路

可能原因

处理措施

健康检查配置

解决方法请参考检查健康检查配置

服务器安全组配置

解决方法请参考检查服务器所在安全组

子网ACL配置

解决方法请参考检查网络ACL规则

后端服务器监听配置

解决方法请参考检查后端服务器是否正常

后端服务器防火墙配置

解决方法请参考检查服务器防火墙

后端服务器路由配置

解决方法请参考检查服务器路由

后端服务器负载过大

解决方法请参考检查服务器负载

后端服务器host.deny文件配置

解决方法请参考检查服务器host.deny文件

检查健康检查配置

单击对应的负载均衡名称,进入负载均衡基本信息页面。切换到“后端服务器组”页签,单击对应的后端服务器组名称,在其基本信息页面,单击“健康检查”右侧的配置按钮。查看以下参数:
  • 协议。
  • 端口。
  • 检查路径。如果是使用HTTP健康检查需要查看此参数,建议配置简单的静态HTML文件。

检查服务器所在安全组

  • TCP、HTTP或HTTPS协议监听器:后端服务器所在的安全组入方向规则需要放通100.125.0.0/16网段,并在TCP协议中放通健康检查的端口。
    • 健康检查端口与后端服务器业务端口相同:需要放通后端服务器的业务端口,例如80。
    • 健康检查端口与后端服务器业务端口不同:需要放通后端服务器的业务端口和健康检查端口,例如80和443。

      健康检查的协议和端口在配置的健康检查配置项提示框中获取。

    图2 安全组入方向规则配置示例
  • UDP协议监听器:不仅需要保证安全组入方向规则放通健康检查的协议、端口和100.125.0.0/16网段。还需要放通后端服务器所在安全组入方向的ICMP协议。
    图3 安全组入方向规则放通ICMP协议示例
  • ELB与后端服务器进行通信的网段为100.125.0.0/16网段,ELB流量转到后端服务器后,源IP会被转换为100.125的IP,发起健康检查的节点的IP就属于这个网段,所以后端服务器配置的安全组必须放通这个网段。
  • 如果不确认是否是安全组问题,可以把安全组入方向规则的“协议”和“端口范围/ICMP类型”均放通Any测试下。
  • UDP协议监听器,也可以参考使用UDP协议有什么注意事项?

检查网络ACL规则

网络ACL是一个子网级别的可选安全层,通过与子网关联的出方向/入方向规则控制出入子网的数据流。网络ACL与安全组类似,都是安全防护策略,当您想增加额外的安全防护层时,就可以启用网络ACL。但是网络ACL默认规则会拒绝所有入站和出站流量,如果此网络ACL和负载均衡所属同一个子网,或者此网络ACL和负载均衡相关联的后端服务器所属同一个子网那么负载均衡的业务也会受到影响,收不到来自于公网或者私网的任何请求流量,或者会导致后端服务器异常。

您可以通过配置网络ACL入方向规则,放行100.125.0.0/16网段。

  1. 登录管理控制台。
  2. 在管理控制台左上角单击图标,选择区域和项目。
  3. 在系统首页,选择“网络 > 虚拟私有云”。
  4. 在左侧导航栏选择“访问控制 > 网络ACL”。
  5. 在“网络ACL”列表区域,选择网络ACL的名称列,单击您需要修改的“网络ACL名称”进入网络ACL详情页面。
  6. 在入方向规则或出方向规则页签,单击“添加规则”,添加入方向或出方向规则。
    • 策略:选择允许。
    • 协议:和监听器协议一致。
    • 源地址:此方向允许的源地址,填写100.125.0.0/16
    • 源端口范围:选择业务所在端口范围。
    • 目的地址:此方向允许的目的地址。选择默认值为0.0.0.0/0,代表支持所有的IP地址。
    • 目的端口范围:选择业务所在端口范围。
    • 描述:网络ACL规则的描述信息,非必填项。
  7. 单击“确定”。

检查后端服务器是否正常

如果后端服务器的操作系统为Windows,请通过浏览器直接访问https://后端服务器的IP : 健康检查配置的端口。如果返回码为2xx或3xx,则表示以后端服务器正常。

  • 您可以在后端服务器上通过以下命令查看后端服务器的健康检查端口是否被健康检查协议正常监听。
    netstat -anlp | grep port

    回显中包含健康检查端口信息并且显示LISTEN,则表示后端服务器端口在监听状态,如图4中表示880端口被TCP进程所监控。

    如果您没有配置健康检查端口信息,默认和后端服务器端口一致。
    图4 后端服务器正常被监听的回显示例
    图5 后端服务器没有被监听的回显示例
  • 如果是HTTP健康检查,请您在后端服务器上执行以下命令查看回显中返回的状态码。
    curl 后端服务器的私有IP:健康检查端口/健康检查路径 -iv

    HTTP健康检查是ELB向后端服务器发起GET请求,当获取到以下所列的响应状态码,认为服务器是正常状态。

    对于TCP的监听器,HTTP健康检查正常返回状态码是200。

    对于ELB,HTTP健康检查正常返回状态码是200、202或者401。

    图6 后端服务器异常的回显示例
    图7 后端服务器正常的回显示例
  • 如果HTTP健康检查异常,除了检查健康检查路径外,建议您将配置的HTTP健康检查修改为TCP健康检查。操作如下:

    在监听器界面,修改目标监听器,在配置参数里选择已有TCP健康检查的后端服务器组,或者选择新创建TCP健康检查的后端服务器组。配置完成之后,几十秒后去查看健康检查状态是否恢复正常。

检查服务器防火墙

如果后端服务器内部开启了防火墙或其他安全类防护软件,这些软件可能会屏蔽100.125.0.0/16网段的IP,请您在防火墙入方向规则中放通100.125.0.0/16网段。

检查服务器路由

请检查是否手动修改了后端服务器内部的路由,查看主网卡(比如eth0)上是否配置默认路由,默认路由是否修改。如果默认路由更改,可能导致健康检查报文无法到达后端服务器

您可以在后端服务器上通过以下命令查看您的默认路由是否指向网关(经过ELB转发属于跨网段访问,三层通信需要配置默认路由指向网关)。
ip route

route -n

正常的回显如图8所示(如果回显中没有图中第一条路由信息,或者路由指向的IP的不是后端服务器所在VPC子网的网关,请您修改成默认路由)。

图8 默认路由指向网关示例
图9 默认路由未指向网关示例

检查服务器负载

查看后端服务器的负载。如果负载很高,可能会导致健康检查的连接或请求超时。

检查服务器host.deny文件

建议您排查后端服务器的/etc/hosts.deny文件,文件中不能写入ELB的健康检查100.125.0.0/16网段。