
我们在一次面向东南亚用户的产品发布中,选择香港作为首选的边缘接入节点。但在实际部署过程中,尽管主干网络带宽充足,部分用户依旧遇到了DNS解析响应延迟的问题。作为架构负责人,我开始着手在香港服务器部署DNS边缘加速节点,并重点优化其缓存策略与失效机制。本文就是这次实战过程的完整复盘。
一、部署目标与基础设施
目标定位:
- 减少DNS解析时间(尤其对CN2/国际用户)
- 支撑多租户解析缓存,降低权威DNS压力
- 快速响应上游失效并自动容错切换
所用硬件配置(香港机房):
- 服务器型号: Dell R6525 双路服务器
- 处理器: AMD EPYC 7302P (16核32线程)
- 内存: 128GB DDR4 ECC
- 存储: 2TB NVMe SSD ×2(RAID 1)
- 网络接口: 双口10Gbps(绑定使用)
- 运营线路: CN2 GIA + PCCW 双线接入
- 系统平台: Debian 12 Minimal
二、DNS加速节点软件架构与核心组件
部署采用主流的开源方案为基础,辅以定制策略:
核心组件:
- Unbound(递归缓存):高性能DNS缓存守护进程
- BIND 9(权威DNS):仅在极端场景作回源保障
- dnsdist:做为前置负载与策略中间层
- Redis:用于缓存状态同步与集群协调
- Keepalived:用于DNS VIP的HA切换机制
网络架构示意(逻辑层):
[客户端] → dnsdist → Unbound → BIND(权威) or 上游递归
↑
[Redis同步]
↓
[多节点DNS状态协调]
三、缓存策略配置要点(以Unbound为例)
1. 缓存时间与TTL管控
cache-max-ttl: 86400 # 最大缓存时间为1天
cache-min-ttl: 60 # 最小缓存时间为60秒
prefetch: yes # 启用预拉取机制
prefetch-key: yes # 针对DNSSEC记录也开启预取
推荐配置理由:兼顾高频解析与低频冷记录,避免瞬间缓存击穿。
2. 拒绝缓存失效记录
serve-expired: yes
serve-expired-ttl: 3600 # 过期记录保活1小时
serve-expired-client-timeout: 1800
作用:当上游不可达时,仍能使用已过期记录临时撑住用户请求。
3. 限制缓存污染与攻击面
unwanted-reply-threshold: 100
防止DNS反射攻击造成缓存投毒。
四、失效机制与主备容灾设计
1. Redis + Lua 实现记录一致性通知:
每当Unbound缓存更新、失效或踢除记录时,通过内置Lua hook推送至Redis Pub/Sub频道,其他节点自动清理或预取。
2. Keepalived 实现VIP自动漂移:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
virtual_ipaddress {
103.x.x.1
}
track_script {
chk_unbound
}
}
chk_unbound 脚本每10秒检测一次Unbound响应,如异常即触发漂移。
3. dnsdist健康检查+熔断:
addServer({address="127.0.0.1:5353", checkInterval=5, checkTimeout=1, upThreshold=2, downThreshold=3})
当Unbound服务连续3次无响应时,dnsdist会临时移除目标节点。
五、性能验证与测试数据
使用 dig 与 dnsperf 工具分别做了如下测试:

说明:失效机制在真实环境下显著提升DNS解析的稳定性,尤其在与国内主站或海外POP协同时。
六、补充建议与运营经验
- 避免使用 public DNS 作为上游:推荐使用运营商本地权威DNS或设定专属递归路径。
- 每月进行缓存命中率审计:可结合Unbound日志与Grafana进行可视化监控。
- 合理规划TTL与业务类型匹配:如CDN类业务建议TTL控制在5分钟内;游戏类可适当延长。
这次在香港部署DNS边缘加速节点的实践,不仅解决了核心业务访问时延高的问题,还为我后续拓展至新加坡、东京等地的节点打下了标准化基础。如果你也正面临海外访问的DNS瓶颈,不妨尝试将缓存与失效机制体系化整合,这可能是解锁低时延体验的关键一环。











