健康检查概述

更新时间:2019-08-16 15:46:34

编辑我的收藏

本页目录

  • 健康检查过程
  • HTTP/HTTPS监听健康检查机制
  • TCP监听健康检查机制
  • UDP监听健康检查
  • 健康检查时间窗
  • 健康检查响应超时和健康检查间隔示例
  • HTTP健康检查中域名的设置

负载均衡通过健康检查来判断后端服务器(ECS实例)的业务可用性。健康检查机制提高了前端业务整体可用性,避免了后端ECS异常对总体服务的影响。

开启健康检查功能后,当后端某台ECS健康检查出现异常时,负载均衡会自动将新的请求分发到其它健康检查正常的ECS上;而当该ECS恢复正常运行时,负载均衡会将其自动恢复到负载均衡服务中。

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

健康检查过程

负载均衡采用集群部署。LVS集群或Tengine集群内的相关节点服务器同时承载了数据转发和健康检查职责。

LVS集群内不同服务器分别独立、并行地根据负载均衡策略进行数据转发和健康检查操作。如果某一台LVS节点服务器对后端某一台ECS健康检查失败,则该LVS节点服务器将不会再将新的客户端请求分发给相应的异常ECS。LVS集群内所有服务器同步进行该操作。

如下图所示,负载均衡健康检查使用的地址段是100.64.0.0/10,后端服务器务必不能屏蔽该地址段。您无需在ECS安全组中额外针对该地址段配置放行策略,但如有配置iptables等安全策略,请务必放行(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)。

HTTP/HTTPS监听健康检查机制

针对七层(HTTP或HTTPS协议)监听,健康检查通过HTTP HEAD探测来获取状态信息,如下图所示。

对于HTTPS监听,证书在负载均衡系统中进行管理。负载均衡与后端ECS之间的数据交互(包括健康检查数据和业务交互数据),不再通过HTTPS进行传输,以提高系统性能。

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

  1. Tengine节点服务器根据监听的健康检查配置,向后端ECS的内网IP+【健康检查端口】+【检查路径】发送HTTP HEAD请求(包含设置的【域名】)。
  2. 后端ECS收到请求后,根据相应服务的运行情况,返回HTTP状态码。
  3. 如果在【响应超时时间】之内,Tengine节点服务器没有收到后端ECS返回的信息,则认为服务无响应,判定健康检查失败。
  4. 如果在【响应超时时间】之内,Tengine节点服务器成功接收到后端ECS返回的信息,则将该返回信息与配置的状态码进行比对。如果匹配则判定健康检查成功,反之则判定健康检查失败。

TCP监听健康检查机制

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

TCP监听的检查机制如下:

  1. LVS节点服务器根据监听的健康检查配置,向后端ECS的内网IP+【健康检查端口】发送TCP SYN数据包。
  2. 后端ECS收到请求后,如果相应端口正在正常监听,则会返回SYN+ACK数据包。
  3. 如果在【响应超时时间】之内,LVS节点服务器没有收到后端ECS返回的数据包,则认为服务无响应,判定健康检查失败;并向后端ECS发送RST数据包中断TCP连接。
  4. 如果在【响应超时时间】之内,LVS节点服务器成功收到后端ECS返回的数据包,则认为服务正常运行,判定健康检查成功,而后向后端ECS发送RST数据包中断TCP连接。

说明 正常的TCP三次握手,LVS节点服务器在收到后端ECS返回的SYN+ACK数据包后,会进一步发送ACK数据包,随后立即发送RST数据包中断TCP连接。

该实现机制可能会导致后端ECS认为相关TCP连接出现异常(非正常退出),并在业务软件如Java连接池等日志中抛出相应的错误信息,如Connection reset by peer

解决方案:

  • TCP监听采用HTTP方式进行健康检查。
  • 在后端ECS配置了获取客户端真实IP后,忽略来自前述负载均衡服务地址段相关访问导致的连接错误。

UDP监听健康检查

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

UDP监听的检查机制如下:

  1. LVS节点服务器根据监听的健康检查配置,向后端ECS的内网IP+【健康检查端口】发送UDP报文。
  2. 如果后端ECS相应端口未正常监听,则系统会返回类似port XX unreachable的ICMP报错信息,反之不做任何处理。
  3. 如果在【响应超时时间】之内,LVS节点服务器收到了后端ECS返回的上述错误信息,则认为服务异常,判定健康检查失败。
  4. 如果在【响应超时时间】之内,LVS节点服务器没有收到后端ECS返回的任何信息,则认为服务正常,判定健康检查成功。

说明 当前UDP协议服务健康检查可能存在服务真实状态与健康检查不一致的问题:

如果后端ECS是Linux服务器,在大并发场景下,由于Linux的防ICMP攻击保护机制,会限制服务器发送ICMP的速度。此时,即便服务已经出现异常,但由于无法向前端返回port XX unreachable报错信息,会导致负载均衡由于没收到ICMP应答进而判定健康检查成功,最终导致服务真实状态与健康检查不一致。

解决方案:

负载均衡通过发送您指定的字符串到后端服务器,必须得到指定应答后才认为检查成功。但该实现机制需要客户端程序配合应答。

健康检查时间窗

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

  • 健康检查间隔(每隔多久进行一次健康检查)
  • 响应超时时间 (等待服务器返回健康检查的时间)
  • 检查阈值(健康检查连续成功或失败的次数)

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

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

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

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

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

  • 如果目标ECS的健康检查失败,新的请求不会再分发到相应ECS上,所以对前端访问没有影响。
  • 如果目标ECS的健康检查成功,新的请求会分发到该ECS上,前端访问正常。
  • 如果目标ECS存在异常,正处于健康检查失败时间窗,而健康检查还未达到检查失败判定次数(默认为三次),则相应请求还是会被分发到该ECS,进而导致前端访问请求失败。

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

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

  • 响应超时时间:5秒
  • 健康检查间隔:2秒
  • 健康阈值:3次
  • 不健康阈值:3次

健康检查失败时间窗=响应超时时间×不健康阈值+检查间隔×(不健康阈值-1),即5×3+2×(3-1)=19s。

从健康状态到不健康状态的检查过程如下图所示:

健康检查成功时间窗= (健康检查成功响应时间×健康阈值)+检查间隔×(健康阈值-1),即(1×3)+2×(3-1)=7s。

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

从不健康状态到健康的状态检查过程如下图所示(假设服务器响应健康检查请求需要耗时1s):

HTTP健康检查中域名的设置

当使用HTTP方式进行健康检查时,可以设置健康检查的域名,但并非强制选项。因为有些应用服务器会对请求中的host字段做校验,即要求请求头中必须存在host字段。如果在健康检查中配置了域名,则SLB会将域名配置到host字段中去,反之,如果没有配置域名,SLB则不会在请求中附带host字段,因此健康检查请求就会被服务器拒绝,可能导致健康检查失败。综上原因,如果您的应用服务器需要校验请求的host字段,那么则需要配置相关的域名,确保健康检查正常工作。

上一篇:后端服务器FAQ

下一篇:配置健康检查

负载均衡 > 用户指南 > 健康检查 > 健康检查概述相关推荐

  1. Nginx反向代理和负载均衡部署指南

    nginx不单能够作为强大的webserver,也能够作为一个反向代理server,并且nginx还能够依照调度规则实现动态.静态页面的分离.能够依照轮询.ip哈希.URL哈希.权重等多种方式对后端s ...

  2. Getting Started and Beyond|云原生应用负载均衡选型指南

    作者 冉昕,腾讯云服务网格TCM产品经理,现负责云原生流量接入网关与应用通信可观测性等产品特性策划与设计工作. 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理 ...

  3. 云原生应用负载均衡系列 (2): 入口流量分发、容错与高可用调度

    引言 在云原生应用负载均衡系列第一篇文章<云原生应用负载均衡选型指南>介绍了云原生容器环境的入口流量管理使用场景与解决方案,用 Envoy 作为数据面代理,搭配 Istio 作控制面的 I ...

  4. 应用交换技术的负载均衡算法

    原文出处是:http://hi.baidu.com/ruijievideo/blog/item/5959be1f3c1621ff1bd576d2.html 应用交换技术的负载均衡算法 应用交换技术里主 ...

  5. 服务器集群负载均衡(F5,LVS,DNS,CDN)区别以及选型

    服务器集群负载均衡(F5,LVS,DNS,CDN)区别以及选型 下面是"黑夜路人"的<大型网站架构优化(PHP)与相关开源软件使用建议> =============== ...

  6. Nginx负载均衡集群介绍

    第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...

  7. 负载均衡(SLB)使用最佳实践

    负载均衡(Server Load Balancer,下文简称 SLB)的引入,可以降低单台云服务器 ECS(下文简称 ECS)出现异常时对业务的冲击,提升业务的可用性.同时,结合弹性伸缩服务,通过动态 ...

  8. Nginx之反向代理与负载均衡实现动静分离实战

    Nginx之反向代理与负载均衡实现动静分离实战 什么是反向代理与负载均衡 Nginx仅仅作为Nginx  proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果. 负载均衡指的是 ...

  9. 构建负载均衡服务器之一 负载均衡与集群详解

    一.什么是负载均衡 首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载, ...

  10. 用NGINX做负载均衡,keepalived高可用

    实验环境,四台虚拟机,两台做负载均衡,两台做RS IP地址:两台负载均衡分别为:10.0.0.7:10.0.0.8(高可用keepalived) 两台 RS主机地址为: 10.0.0.9:10.0.0 ...

最新文章

  1. python 替换字符串的方法replace()、正则re.sub()
  2. 室外电磁赛道铺设补充说明
  3. 51单片机 自动重装载值计算
  4. ABAP RANGE 实现 SELECTION-OPTION 功能
  5. Tkinter之Label
  6. spring催办业务_业务后台系统之流程设计
  7. 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程
  8. SQL:显示每天的小计,某一天没有记录也要显示
  9. 计算机械效率的公式四种,功功率机械效率复习题超全
  10. linux备份数据库
  11. codeblocks下载安装以及使用自带GCC / g++编译器
  12. Unity 移动的几种方法(从某一点移动到另外一点)
  13. jquery,ajax动态从数据库加载数据并自动选中复选框
  14. 将png格式的图像转换为jpg
  15. HHUOJ_1351: 相对分子质量
  16. STM32的一个通用定时器理论上可以当做N个来用
  17. concat特征融合_小目标检测文献相关(特征融合)
  18. gitlab artifacts too large
  19. 如何有效开展小组教学_如何有效开展小组教学
  20. 老调重弹,Squirrel,FASTCGI

热门文章

  1. 车仪表台上的装饰_给车“纹身”贴这些的注意,有人挨罚啦!扣不扣分?!看这里...
  2. JavaWeb中filter的详解及应用案例
  3. 什么是软件测试资产,观点:当前是国内推广软件资产管理的最佳时期
  4. 力扣编辑距离系列问题总结
  5. 346雷达有多少tr组件_有源相控阵的天线设计的核心:T/R组件
  6. linux 774是什么权限,Linux权限
  7. java 元组 getinteger_TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉...
  8. gitlab CI/CD 知识点查阅
  9. 2017年对口招生c语言及答案,2017年计算机专业对口考试试卷及答案.doc
  10. python即时标记_python基础教程总结15——1.即时标记