Skip to content

健康检查

健康检查实现针对多种协议(ICMP、TCP、HTTP、HTTPS、DNS、gRPC等)配置不同的健康检查策略,服务器池配置时应用对应的健康检查策略,节点出现异常时即产生告警信息并通知相关人员及时处理。 点击【SLB本地负载-健康检查】菜单,默认按照策略更新时间倒序排列展示所有健康检查策略信息列表。

  • 查询区域:

健康检查列表

可通过“策略名称”属性,进行条件查询操作。点击“查询”按钮执行查询操作,点击“重置”按钮将查询条件清空;

  • 数据区域:

点击列表上方“新增”按钮,弹框打开健康检查策略新增页面,可添加/配置新的健康检查策略: 健康检查新增 选择需要修改的健康检查策略信息,点击此用户所在行操作栏的“修改”按钮,打开健康检查策略配置修改弹框: 健康检查修改 选择需要删除的健康检查策略信息,然后操作栏的“删除”按钮,可对健康检查策略信息进行删除操作: 健康检查删除

提示

如果用户需要删除的健康检查策略已被服务器池、转发引擎集群进行关联,则必须解除引用才能删除。

通用配置说明

  1. 基本配置 健康检查基本配置超时时间:上下线超时时间均为所填时间。
    间隔时间:上下线间隔时间均为所填时间。
    最大连续尝试次数:最大连续成功和失败次数均为所填次数。
  2. 高级配置:可分别配置上下线超时时间、上下线间隔时间、最大连续成功或失败尝试次数: 健康检查高级配置

注意

免费版用户不支持高级配置功能。

ICMP协议健康检查策略

对服务器节点IP(支持IPv4、IPv6)进行ICMP协议健康检查(与Ping命令效果相同),在超时时间内响应则认为节点健康。

一般只需设置策略名称,其余字段可使用默认值,配置字段如下:

策略名称:健康检查策略的名称。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。

TCP协议健康检查策略

当服务器IP地址不支持ICMP协议或ICMP协议不满足健康检查需求时,且服务使用的是TCP协议,可使用TCP三次握手进行健康检查。

当不启用内容验证时,会根据是否接收到服务器的SYN-ACK包判断节点健康状态;当启用内容验证后,会根据发送和接收的字符串是否正确来判断节点健康状态。各字段含义如下:

策略名称:健康检查策略的名称。
端口
复用监听端口:服务器节点端口使用服务器池中的监听端口。
不复用监听端口:指定该健康检查策略的服务器节点目标端口。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
内容验证:默认为未启用状态,未启用时表明通过TCP三次握手做健康检查。
发送字符串:启用内容验证后,向服务器发送的字符串内容。
接受字符串:启用内容验证后,接收到服务器回复的字符串内容。

TCP半连接健康检查

TCP检查建立连接后会发送FIN包关闭连接,为了减少完整的TCP健康检查的资源占用,可使用TCP半连接对服务器健康检查,TCP半连接在收到SYN-ACK包后就判断节点健康,之后发送RST包重置连接。

一般只需设置策略名称,其余字段可使用默认值,各字段含义如下:

策略名称:健康检查策略名称。
端口
复用监听端口:服务器节点端口使用服务器池中的监听端口。
不复用监听端口:指定该健康检查策略的服务器节点目标端口。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。

UDP协议健康检查策略

当服务器禁用ICMP或ICMP协议不满足健康检查需求时,且服务使用的是UDP协议,可使用UDP对服务器发送探测报文,根据是否在超时时间内响应内容或报错信息来判断服务节点健康状态。

当不启用内容验证时,在超时时间内,如果未收到报错则判断节点为健康,如果收到Connection refused报错信息,则判断节点异常;当启用内容验证后,会根据接收的字符串是否正确匹配来判断节点健康状态。各字段含义如下:

策略名称:健康检查策略名称。
端口
复用监听端口:服务器节点端口使用服务器池中的监听端口。
不复用监听端口:指定该健康检查策略的服务器节点目标端口。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
内容验证:是否发送验证字符串。
发送字符串:发送内容(字符串)。
接收字符串最大长度:接收响应的最大长度(单位:社区字节),超出后即认为失败。
接收字符串必须:接收内容判断,选项包括:等于、包含,后跟字符串。

HTTP协议健康检查策略

如果有时端口可达但服务返回错误,在这种情况下,当服务使用的是HTTP协议,可配置HTTP协议健康检查。

HTTP健康检查协议中,可设定HTTP请求包,根据服务返回的响应是否匹配状态码、响应头部、响应包体来判断健康状态。各字段含义如下:

策略名称:健康检查策略名称。
端口
复用监听端口:服务器节点端口使用服务器池中的监听端口。
不复用监听端口:指定该健康检查策略的服务器节点目标端口。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
HTTP方法:进行健康检查的HTTP请求方法。
请求路径:进行健康检查的HTTP请求URL。
请求头部(可选):进行健康检查的HTTP请求Header头部。
请求包体(可选):进行健康检查的HTTP请求Body包体。
响应码:基于服务器的响应码(可配置多个)判断节点是否健康。
响应头部:基于HTTP响应中是否包含某个HTTP头部,判断节点是否健康。
响应包体:对HTTP响应包体做字符串比较,以此判断节点是否健康。

HTTPS协议健康检查策略

如果有时端口可达但服务返回错误,在这种情况下,当服务使用的是HTTPS协议,可配置HTTPS协议健康检查。

对HTTPS健康检查协议中,可设定HTTPS请求包,根据服务返回的响应是否匹配状态码、响应头部、响应包体来判断健康状态。与HTTP配置唯一不同的字段是TLS_SERVER_NAME,各字段含义如下:

策略名称:健康检查策略名称。
HTTP方法:进行健康检查的HTTP请求方法。
TLS_SERVER_NAME(可选):指定ClientHello中的SNI域名。
端口
复用监听端口:服务器节点端口使用服务器池中的监听端口。
不复用监听商品:指定该健康检查策略的服务器节点目标端口。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
请求路径:进行健康检查的HTTP请求URL。
请求头部(可选):进行健康检查的HTTP请求Header头部。
请求包体(可选):进行健康检查的HTTP请求Body包体。
响应码:基于服务器的响应码(可配置多个)判断节点是否健康。
响应头部:基于HTTP响应中是否包含某个HTTP头部,判断节点是否健康。
响应包体:对HTTP响应包体做字符串比较,以此判断节点是否健康。

DNS协议健康检查

在对DNS服务器进行健康检查时,有时尽管服务端口可达,但它并不能准确地判断节点的健康状况。例如,DNS端口可能是开放的,但是由于服务异常没有返回解析结果。此时可配置DNS协议健康检查。

DNS健康检查协议会向服务器节点发送DNS查询请求,当设置匹配方式IPv4、IPv6、CNAME时,如果返回结果匹配包含填写的所有内容,则认为节点健康,否则认为节点异常;当设置匹配方式为*时,返回任意查询类型结果都认为节点健康,如果超时没有返回则认为节点异常。各字段含义如下:

策略名称:健康检查策略名称。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
查询域名:配置发送给节点的查询域名。
匹配方式:可选匹配IPv4、IPv6、CNAME或*(*表示发送ANY查询)。
IPv4地址:这意味着DNS请求是A请求。
IPv6地址:这意味着DNS请求是AAAA请求。
CNAME:这意味着DNS请求是CNAME请求。

MYSQL健康检查

当端口检查无法准确判断服务器健康状态时,可能需要对数据库进行健康检查,如果使用的是MYSQL类型数据库,可选择MYSQL协议类型。

通过发送MYSQL请求数据包对服务器进行MYSQL协议健康检查,可配置数据库名和用户名密码,检测是否正常连接数据库,配置内容验证,检测是否正确响应请求。各字段含义如下:

策略名称:健康检查策略名称。
超时时间:主动健康检查的套接字的超时时间。
间隔时间:对健康的上游服务目标设备进行主动健康检查的间隔时间(以毫秒为单位)。
数据库名称:需要检查的数据库名称。
用户名:登录数据库的用户名。
密码:登录数据库的密码。
内容验证:是否需要内容验证。
发送字符串:发送内容(字符串)。
接收字符串:接收内容(字符串)。

自定义脚本

当以上健康检查策略不满足业务需求时,还可以灵活定制脚本,通过用户自定义脚本检查每个节点的健康状态(目前仅支持Python脚本)。 脚本执行时将会接收到2个参数,第1个参数是服务器节点的IP,第2个参数是目标端口。脚本返回0则表示节点是健康的,返回非0则表示节点不健康。

脚本使用基本规则

提供3种基本数据类型:int, string, bool

  • 定义一个 int 变量, 并赋值
python
var code int
code = 10
  • 定义一个 string 变量
python
var helloworld string
helloworld = "helloworld"
  • 定义一个 bool 变量
python
var isTrue bool
isTrue = true

提供函数使用

函数名用途参数返回值
httpReq请求一个 url
  • url -- string 请求url
  • method -- string 请求方法
  • body -- string 请求体(没有请求体时可以传入一个空字符串 "")
  • int 函数结果状态码
  • int http请求响应状态码
tcpConnect进行一次 tcp 连接
  • ip -- string ip地址
  • port -- int 端口号
  • int 函数结果状态码
icmpConnectping 一个 ip
  • ip -- string ip地址
  • int 函数结果状态码
getNodeStatus获取一个服务器池中的节点的状态
  • poolId -- int 服务器池 id
  • nodeIp -- string 服务器池节点 ip
  • nodePort -- int 服务器池节点 port
  • int 函数结果状态码
  • string node 健康状态

函数结果状态码

状态码说明
0函数执行成功
1001创建http请求失败,请检查参数
1002执行http请求失败,请检查参数
2001Tcp 连接失败
3001创建ICMP请求失败,请检查参数
3002执行ICMP请求失败,请确定地址存在

脚本全局变量

脚本存在 2 个全局变量,便于用户获取当前被检查的服务器节点的信息,用户可以在脚本的任意地方使用。

变量名变量类型说明
curIpstring当前被检查的节点的 ip 地址
curPortint当前被检查的节点的端口号

脚本返回结果

脚本使用 return 关键字进行结束,并且需要一个返回结果, 这个结果是一个 bool 类型的变量,返回 true 代表脚本检查成功,返回 false 代表脚本检查失败。

简单脚本示例

场景1: 对当前服务器节点的 url 发起一次 http 调用

python
var codeHttp int
var statusCode int
var url string

// 拼接 url
url = "http://" + curIp + ":" + intToString(curPort) + "/"

// 对指定 url 发送 get 请求
codeHttp, statusCode = httpReq(url, "GET", "")
if codeHttp == 0 && statusCode == 200 {
   return true
}
return false

场景2: 对当前的服务器节点地址发起一次 tcp 调用

python
var codeTcp int
codeTcp = tcpConnect(curIp, curPort)
if codeTcp == 0 {
   return true
}
return false

场景3: 对当前的服务器节点 ip 发起一次 icmp 调用

python
var codeIcmp int

codeIcmp = icmpConnect(curIp)
if codeIcmp == 0 {
   return true
}
return false

场景4: 服务器节点 127.0.0.1: 80,根据【服务器池:容量池10.133.7.250】中的节点 10.133.7.250:12000 的状态来判断自己的状态; 服务器节点 10.1.1.1:80 根据【服务器池:容量池10.138.5.250】中的节点 10.138.5.250:12000 的状态来判断自己的状态,其他节点均根据 icmp 结果来判断健康检测的结果。

python
var code int
var status string

if curIp == "127.0.0.1" && curPort == 80 {
   code, status = getNodeStatus("容量池10.133.7.250", "10.133.7.250", 12000)
   if code == 0 && status == "health" {
      return true
   }
   return false
} else if curIp == "10.1.1.1" && curPort == 80 {
   code, status = getNodeStatus("容量池10.138.5.250", "10.138.5.250", 12000)
   if code == 0 && status == "health" {
      return true
   }
   return false
} else {
   code = icmpConnect(curIp)
   if code == 0 {
      return true
   }
   return false
}