Skip to content

健康检查

健康检查是 DNS-Go 高可用架构的重要组成部分,通过定期检测上游 DNS 服务器的可用性,确保 DNS 解析服务的稳定性。

功能概述

健康检查模块提供:

  • 自动健康检测:定时检查上游 DNS 状态
  • 故障自动切换:自动剔除故障节点,恢复后自动加入
  • 检测方式多样:支持 DNS 查询、Ping、TCP 端口检测
  • 自定义检测域名:灵活配置检测目标

检测方式

DNS 查询检测(推荐)

向上游 DNS 发送 DNS 查询请求,验证其是否能正常响应。

优点:

  • 最贴近实际使用场景
  • 检测 DNS 服务本身的健康状态
  • 可检测解析结果正确性

配置参数:

  • 检测域名:用于探测的域名(默认 www.baidu.com
  • 查询类型:A、AAAA 等
  • 期望结果:可选,验证返回结果

Ping 检测

使用 ICMP Ping 检测上游服务器的网络连通性。

优点:

  • 简单快速
  • 检测网络层连通性

局限性:

  • 只能检测网络可达性
  • 无法检测 DNS 服务状态
  • 某些服务器可能禁用 ICMP

TCP 端口检测

检测上游 DNS 服务器的 TCP 53 端口是否开放。

优点:

  • 检测 DNS 服务端口状态
  • 适用于 TCP DNS 查询场景

检测流程

检查周期

┌──────────┐     ┌──────────┐     ┌──────────┐
│ 等待间隔  │────▶│ 执行检测  │────▶│ 更新状态  │
└──────────┘     └──────────┘     └────┬─────┘
     ▲                                  │
     └──────────────────────────────────┘
  1. 等待间隔:等待配置的检测间隔时间
  2. 执行检测:向每个上游发送检测请求
  3. 更新状态:根据检测结果更新健康状态
  4. 循环执行:重复上述流程

状态判定

健康 → 故障:

  • 连续 N 次检测失败(N 为失败阈值)
  • 标记为故障状态
  • 从可用上游列表中移除

故障 → 健康:

  • 连续 N 次检测成功
  • 标记为健康状态
  • 重新加入可用上游列表

配置说明

全局健康检查配置

  1. 进入「上游管理」→「健康检查」
  2. 配置检查参数:
参数说明默认值建议值
检查间隔多久检查一次30 秒30-60 秒
检查域名用于 DNS 探测的域名www.baidu.com稳定的域名
超时时间等待响应时间5 秒3-5 秒
失败阈值连续失败次数3 次2-3 次
成功阈值连续成功次数2 次1-2 次

检测域名配置

可配置专用的检测域名:

  1. 进入「上游管理」→「健康检查域名」
  2. 点击「新增检测域名」
  3. 配置检测域名:
字段说明示例
检测域名用于健康检查的域名health.check.local
查询类型A、AAAA、MX 等A
期望结果可选,验证返回结果192.168.1.1
描述可选说明内部健康检查域名

健康状态查看

Web 界面查看

在上游列表页面,每个上游显示健康状态:

  • 🟢 健康:上游 DNS 正常工作
  • 🔴 故障:上游 DNS 无法响应
  • 🟡 检查中:正在进行健康检查
  • ⚪ 未检查:尚未开始检查

状态详情

点击上游的「健康状态」可查看详细信息:

  • 当前状态
  • 最后检查时间
  • 连续成功/失败次数
  • 历史健康率
  • 响应时间趋势

API 查询

bash
# 获取上游健康状态
GET /api/upstream/list/health

# 获取指定上游健康详情
GET /api/UpstreamHealthCheck/:id

响应示例:

json
{
  "code": 200,
  "data": {
    "id": 1,
    "upstream_id": 1,
    "status": "healthy",
    "last_check": "2025-01-15T10:30:00Z",
    "success_count": 150,
    "fail_count": 2,
    "response_time": "23ms",
    "health_rate": "98.7%"
  }
}

手动检测

单上游检测

对单个上游执行即时健康检查:

  1. 在上游列表中找到目标上游
  2. 点击「检测」按钮
  3. 等待检测结果

批量检测

对所有上游执行即时健康检查:

  1. 点击「批量检测」按钮
  2. 系统并行检测所有上游
  3. 查看批量检测结果

API 手动检测

bash
# 检测单个上游
GET /api/UpstreamHealthCheck/:id

# 批量检测所有上游
POST /api/UpstreamHealthCheck/check

告警通知

故障告警

当上游 DNS 发生故障时,系统可以发送告警通知:

告警触发条件:

  • 上游从健康变为故障
  • 故障持续超过指定时间
  • 可用上游数量低于阈值

告警方式:

  • Web 界面通知
  • 邮件通知(配置 SMTP)
  • Webhook 通知(自定义接口)

告警配置

  1. 进入「系统管理」→「告警配置」
  2. 配置告警规则:
规则说明默认值
启用告警是否开启告警功能
故障阈值触发告警的故障上游数1
通知间隔重复告警间隔300 秒
恢复通知故障恢复是否通知

最佳实践

检测域名选择

推荐使用的检测域名:

域名类型说明
www.baidu.com公网国内访问快,稳定性高
www.qq.com公网国内访问快
dns.google公网全球可用
health.check.local内网内部部署的专用检测域名

避免使用的域名:

  • 不稳定的域名
  • 可能返回不同结果的域名(如 CDN 域名)
  • 可能被防火墙拦截的域名

检测间隔配置

根据环境调整检测间隔:

环境检测间隔超时时间
生产环境30-60 秒3-5 秒
测试环境60-120 秒5-10 秒
开发环境300 秒10 秒

阈值配置建议

避免误报:

  • 失败阈值 ≥ 2(避免单次网络抖动导致误判)
  • 成功阈值 ≥ 1(快速恢复服务)

快速故障转移:

  • 失败阈值 = 1(立即切换)
  • 适用于对延迟敏感的场景

高可用配置示例

生产环境推荐配置:

yaml
上游列表:
  - 阿里云 DNS (223.5.5.5)
  - 腾讯云 DNS (119.29.29.29)
  - 114 DNS (114.114.114.114)

健康检查配置:
  检查间隔: 30 秒
  检测域名: www.baidu.com
  查询类型: A
  超时时间: 3 秒
  失败阈值: 2
  成功阈值: 1

策略配置:
  策略类型: 轮询
  故障自动剔除: 
  恢复自动加入: 

故障排查

健康检查不执行

问题原因解决方案
检查间隔过长配置值太大减小检查间隔
健康检查未启用功能被禁用在配置中启用健康检查
检查线程异常程序内部错误重启服务或查看日志

健康状态不准确

问题原因解决方案
检测域名不可用域名解析失败更换检测域名
网络不稳定网络抖动增加失败阈值
上游限制检测上游屏蔽检测使用其他检测方式

误报故障

问题原因解决方案
单次检测失败网络临时抖动增加失败阈值到 3-5
检测域名问题域名偶尔超时更换更稳定的检测域名
超时时间太短响应慢被误判增加超时时间

API 接口汇总

获取健康检查配置

bash
GET /api/UpstreamHealthCheck/domain

更新健康检查配置

bash
PUT /api/UpstreamHealthCheck/domain
Content-Type: application/json

{
  "domain": "www.baidu.com",
  "type": "A",
  "expected": "",
  "interval": 30,
  "timeout": 5
}

执行健康检查

bash
POST /api/UpstreamHealthCheck/check

获取健康检查历史

bash
GET /api/UpstreamHealthCheck/history?upstream_id=1&limit=100

相关文档

基于 MIT 许可发布