健康检查
健康检查是 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 查询场景
检测流程
检查周期
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 等待间隔 │────▶│ 执行检测 │────▶│ 更新状态 │
└──────────┘ └──────────┘ └────┬─────┘
▲ │
└──────────────────────────────────┘- 等待间隔:等待配置的检测间隔时间
- 执行检测:向每个上游发送检测请求
- 更新状态:根据检测结果更新健康状态
- 循环执行:重复上述流程
状态判定
健康 → 故障:
- 连续 N 次检测失败(N 为失败阈值)
- 标记为故障状态
- 从可用上游列表中移除
故障 → 健康:
- 连续 N 次检测成功
- 标记为健康状态
- 重新加入可用上游列表
配置说明
全局健康检查配置
- 进入「上游管理」→「健康检查」
- 配置检查参数:
| 参数 | 说明 | 默认值 | 建议值 |
|---|---|---|---|
| 检查间隔 | 多久检查一次 | 30 秒 | 30-60 秒 |
| 检查域名 | 用于 DNS 探测的域名 | www.baidu.com | 稳定的域名 |
| 超时时间 | 等待响应时间 | 5 秒 | 3-5 秒 |
| 失败阈值 | 连续失败次数 | 3 次 | 2-3 次 |
| 成功阈值 | 连续成功次数 | 2 次 | 1-2 次 |
检测域名配置
可配置专用的检测域名:
- 进入「上游管理」→「健康检查域名」
- 点击「新增检测域名」
- 配置检测域名:
| 字段 | 说明 | 示例 |
|---|---|---|
| 检测域名 | 用于健康检查的域名 | 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%"
}
}手动检测
单上游检测
对单个上游执行即时健康检查:
- 在上游列表中找到目标上游
- 点击「检测」按钮
- 等待检测结果
批量检测
对所有上游执行即时健康检查:
- 点击「批量检测」按钮
- 系统并行检测所有上游
- 查看批量检测结果
API 手动检测
bash
# 检测单个上游
GET /api/UpstreamHealthCheck/:id
# 批量检测所有上游
POST /api/UpstreamHealthCheck/check告警通知
故障告警
当上游 DNS 发生故障时,系统可以发送告警通知:
告警触发条件:
- 上游从健康变为故障
- 故障持续超过指定时间
- 可用上游数量低于阈值
告警方式:
- Web 界面通知
- 邮件通知(配置 SMTP)
- Webhook 通知(自定义接口)
告警配置
- 进入「系统管理」→「告警配置」
- 配置告警规则:
| 规则 | 说明 | 默认值 |
|---|---|---|
| 启用告警 | 是否开启告警功能 | 是 |
| 故障阈值 | 触发告警的故障上游数 | 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