更新时间:2024-04-08 GMT+08:00

健康检查异常如何排查?

问题描述

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

  • 独享型负载均衡

    在“负载均衡器”界面,单击后端服务器所在的负载均衡器名称,切换到“后端服务器组”页签,在基本信息页面,查看“健康检查结果”列是否显示“异常”。

  • 共享型负载均衡

    在“负载均衡器”界面,单击后端服务器所在的负载均衡器名称,切换到“后端服务器组”页签,在基本信息页面,查看“健康检查结果”列是否显示“异常”。

背景介绍

ELB的健康检查通过向后端服务器发起心跳检查的方式来实现。独享型负载均衡在检查过程中使用ELB后端子网所在的VPC地址通信;共享型负载均衡在检查过程中使用内网地址100.125.0.0/16和100.126.0.0/16通信。

对于独享型负载均衡,为确保健康检查正常进行,您需要确保服务器已经放通ELB后端子网所在的VPC网段,使得ELB能够正常访问到后端服务器。

对于共享型负载均衡,为确保健康检查正常进行,您需要确保服务器已经放通100.125.0.0/16和100.126.0.0/16网段的地址,使得ELB能够正常访问到后端服务器。

  • 独享型负载均衡共享型负载均衡的安全组规则不同,请您在实际排查时务必注意,后文不再赘述。

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

对于共享型负载均衡,如果将健康检查正常的后端服务器的权重调整为0,则健康检查状态会显示为“异常”。

  • 当ELB后端服务器的健康检查状态处于异常状态时,ELB不会向该后端服务器转发请求。
  • 当健康检查关闭时,ELB默认后端服务器正常在线,会将请求转发至后端服务器。
  • 独享型ELB(TCP/UDP监听器)和共享型ELB(TCP/UDP监听器)如果开启了“获取客户端IP”功能,则就是真实的客户端IP直接和后端服务器进行交互,而不是使用100.125.0.0/16和100.126.0.0/16网段IP和后端服务器进行交互。
  • 共享型ELB(HTTP/HTTPS监听器)会使用100.125.0.0/16和100.126.0.0/16网段IP向后端服务器发送健康检查请求和正常的客户端请求。
  • 当后端服务器的权重为0时,流量不会再转发到该后端服务器上,此时健康检查的状态无参考意义。

排查思路

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

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

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

图1 健康检查异常排查
图2 健康检查异常排查
表1 排查思路

可能原因

处理措施

检查后端服务器组是否关联监听器

解决方法请参考检查后端服务器组是否关联监听器

检查ELB是否绑定EIP或私网IP

解决方法请参考检查ELB是否绑定EIP或私网IP

健康检查配置

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

服务器安全组配置

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

子网ACL配置

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

后端服务器监听配置

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

后端服务器防火墙配置

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

后端服务器路由配置

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

后端服务器负载过大

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

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

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

检查后端服务器组是否关联监听器

检查健康检查异常的服务器所在的后端服务器组是否关联了监听器。

  • 如果后端服务器组未关联监听器,请检查是否已创建了监听器。
    • 已经创建了监听器,请将后端服务器组关联至监听器。
    • 未创建监听器,请先添加监听器,然后为监听器绑定后端服务器组。
  • 如果后端服务器组已经关联了监听器,请再按照以下原因排查。

检查ELB是否绑定EIP或私网IP

  • 该检查项仅适用于四层监听器(TCP/UDP)。
  • 对于七层监听器(HTTP/HTTPS),无论ELB是否绑定弹性IP或私网IP,均不会影响后端服务器健康检查。

对于四层监听器(TCP/UDP),请检查其关联的负载均衡器是否绑定弹性IP或私网IP。

如果ELB未绑定弹性IP和私网IP,请绑定弹性IP或私网IP。

ELB初次创建时,如果未绑定EIP或私网IP时,四层监听器(TCP/UDP)所关联的后端服务器会显示健康检查异常。当给ELB绑定EIP或私网IP后,健康检查结果显示正常,再解绑EIP或私网IP后,健康检查结果依然会显示正常。

检查健康检查配置

单击对应的负载均衡名称,进入负载均衡基本信息页面。切换到“后端服务器组”页签,单击对应的后端服务器组名称,在其基本信息页面,单击“健康检查”右侧的配置按钮。查看以下参数:
  • 域名。健康检查使用HTTP协议时,如果后端服务器设置了校验HOST头能力,需要将后端服务器配置的域名填写到“健康检查配置”页面中的“域名”处。
  • 协议。
  • 端口。端口必须是后端服务器上真实业务所监听的端口,不是自定义端口。检查您配置的健康检查端口和监听的端口是否一致。不一致则会导致健康检查异常。
  • 健康检查方式。
  • 检查路径。如果是使用HTTP健康检查需要查看此参数,建议配置简单的静态HTML文件。
  • 检查路径需填写绝对路径。

    例如:

    访问链接为:http://www.example.com或http://192.168.63.187:9096,则检查路径填写“/”。

    访问链接为:http://www.example.com/chat/try/,则检查路径填写“/chat/try/”。

    访问链接为:http://192.168.63.187:9096/chat/index.html,则检查路径填写“/chat/index.html”。

检查服务器所在安全组

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

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

      图3 安全组入方向规则配置示例
    • UDP协议监听器:不仅需要保证安全组入方向规则放通健康检查的协议、端口和独享型ELB所在VPC的网段。还需要放通后端服务器所在安全组入方向的ICMP协议。
      图4 安全组入方向规则放通ICMP协议示例

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

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

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

检查网络ACL规则

  • 独享型负载均衡

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

    您可以通过配置网络ACL入方向规则,放行源网段为ELB后端子网所在的VPC网段,目的端口为后端服务器端口。

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

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

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

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

检查后端服务器是否正常

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

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

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

    如果您没有配置健康检查端口信息,默认和后端服务器业务端口一致。
    图7 后端服务器正常被监听的回显示例
    图8 后端服务器没有被监听的回显示例

    如果健康检查端口没有在监听状态(后端服务器没有被监听),您需要先启动后端服务器上的业务,启动业务后再查看健康检查端口是否被正常监听。

  • 如果是HTTP健康检查,请您在后端服务器上执行以下命令查看回显中返回的状态码。
    curl 后端服务器的私有IP:健康检查端口/健康检查路径 -iv

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

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

    对于独享型ELB:HTTP/HTTPS健康检查正常返回状态码均为200。

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

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

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

检查服务器防火墙

如果后端服务器内部开启了防火墙或其他安全类防护软件,这些软件可能会屏蔽ELB后端子网所在的VPC网段或100.125.0.0/16和100.126.0.0/16网段的IP。

对于独享型负载均衡,请您在防火墙入方向规则中放通ELB后端子网所在的VPC网段。

对于共享型负载均衡,请您在防火墙入方向规则中放通100.125.0.0/16和100.126.0.0/16网段。

检查服务器路由

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

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

route -n

正常的回显如图11所示。

图11 默认路由指向网关示例
图12 默认路由未指向网关示例

如果回显中没有像图11中的第一条路由信息,或者路由指向的IP的不是后端服务器所在VPC子网的网关,请您配置默认路由指向网关。

检查服务器负载

通过云监控服务,查看后端服务器的CPU/内存/网络连接数等,来判断后端服务器的负载是否过高。

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

检查服务器hosts.deny文件

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

对于独享型负载均衡,该文件中不能写入ELB后端子网所在的VPC网段。

对于共享型负载均衡,该文件中不能写入健康检查100.125.0.0/16和100.126.0.0/16网段。