第4章:DNS智能路由与全局负载均衡

各位同学,今天我们来聊聊多云架构里最核心的一个环节——DNS智能路由。说实话,很多人觉得DNS不就是个域名解析嘛,有什么好讲的?但我在生产环境里踩过的坑,十有八九都跟DNS策略配置不当有关。

你想想看,当你的业务部署在多个云上,用户访问时到底该去哪个机房?是离他最近的?还是负载最轻的?还是某个特定区域的?这就是我们今天要解决的问题。

4.1 基于延迟的DNS解析策略

延迟策略,说白了就是「谁快找谁」。用户发起DNS查询时,权威DNS服务器会根据用户IP所在位置,返回延迟最低的后端IP。

我记得有一次帮一家游戏公司做全球加速,他们用了AWS和阿里云双云部署。一开始配置的是简单的轮询,结果东南亚用户经常连到美西节点,延迟飙到300ms。后来改成延迟策略,东南亚用户自动解析到阿里云新加坡节点,延迟降到30ms以内。

核心原理:DNS服务器维护一张延迟探测表,定期从全球探测点向各后端发起健康检查和延迟测量。查询时匹配用户来源区域,返回最优IP。

配置示例(以AWS Route 53为例):

# 延迟路由策略配置
Resource "aws_route53_record" "www" {
  zone_id = "Z123456"
  name    = "www.example.com"
  type    = "A"

  latency_routing_policy {
    region = "ap-southeast-1"  # 新加坡区域
  }
  set_identifier = "aws-singapore"
  ttl            = 60
  records        = ["1.2.3.4"]

  latency_routing_policy {
    region = "us-west-2"       # 美西区域
  }
  set_identifier = "aws-oregon"
  ttl            = 60
  records        = ["5.6.7.8"]
}

我的经验:TTL值别设太大。我习惯设60秒,这样故障切换时能快速生效。但也不要低于30秒,否则DNS查询量暴增,容易被上游DNS服务器限流。

4.2 基于地理位置的DNS解析策略

地理位置策略跟延迟策略有点像,但逻辑不同。它是根据用户IP所属的国家或地区,强制返回指定区域的IP。比如中国用户必须解析到国内节点,欧洲用户必须解析到法兰克福节点。

为什么要用地理位置策略?嗯,这里有两个场景:

  • 合规要求:某些国家要求数据不出境,比如俄罗斯、印度
  • 内容本地化:不同地区展示不同内容,比如电商的本地化价格

我曾经遇到过一个坑:某客户用了地理位置策略,但没配置默认兜底。结果有个来自南极科考站的用户,IP归属地识别失败,直接解析失败,业务挂了半天。后来我加了一条「默认指向美西节点」的兜底规则,问题解决。

注意:地理位置策略依赖IP地理库,但IP库更新不及时是常态。建议定期(每月)更新IP库,并配置兜底策略。

4.3 基于权重的DNS解析策略

权重策略,就是按比例分配流量。比如你有两个集群,A集群性能强,B集群是新上的。你可以设权重为7:3,让70%流量走A,30%走B。

这个策略在灰度发布时特别好用。我习惯的做法是:

  1. 新版本先上线到B集群,权重设成1:99
  2. 观察半小时,没问题就调到10:90
  3. 逐步增加到50:50,最后全量切换

配置示例(以Azure Traffic Manager为例):

# 权重路由配置
az network traffic-manager endpoint create \
  --name "endpoint-primary" \
  --profile-name "my-profile" \
  --resource-group "my-rg" \
  --type "azureEndpoints" \
  --target-resource-id "/subscriptions/.../primary" \
  --weight 70

az network traffic-manager endpoint create \
  --name "endpoint-secondary" \
  --profile-name "my-profile" \
  --resource-group "my-rg" \
  --type "azureEndpoints" \
  --target-resource-id "/subscriptions/.../secondary" \
  --weight 30

关键点:权重总和不必是100。DNS服务器会按比例计算。比如权重设成2和1,效果就是66.7%和33.3%。

4.4 健康检查机制

讲完路由策略,咱们得聊聊健康检查。没有健康检查的智能路由,就像闭着眼睛开车——迟早出事。

健康检查的核心逻辑:DNS服务器定期向后端IP发送探测请求(HTTP/HTTPS/TCP),如果连续N次失败,就把该IP标记为「不健康」,不再返回给用户。

我见过最典型的翻车案例:某公司健康检查只检查了Web服务的80端口,但数据库挂了。结果DNS认为后端正常,用户请求进来后页面报500错误。嗯,这就是检查维度不够的问题。

我的建议是分层检查:

检查层级 检查内容 频率 超时时间
L4(网络层) TCP端口连通性 每10秒 5秒
L7(应用层) HTTP 200状态码 每30秒 10秒
业务层 自定义API返回「ok」 每60秒 15秒

避坑指南:我曾经把健康检查间隔设成5秒,结果后端扛不住探测流量,CPU被打满。后来改成10秒+3次失败阈值,既保证灵敏度,又不会误杀。

4.5 策略组合与实战建议

实际项目中,很少只用单一策略。我常用的组合拳是:

  • 主策略:延迟优先,保证用户体验
  • 兜底策略:地理位置,满足合规要求
  • 灰度策略:权重,用于版本发布
  • 安全网:健康检查,自动剔除故障节点

举个例子,我去年帮一个金融客户做多云架构,他们的配置是这样的:

# 伪代码示例
策略优先级:
1. 如果用户IP在中国 → 解析到阿里云(合规要求)
2. 如果用户IP在欧洲 → 解析到AWS法兰克福(延迟最优)
3. 其他地区 → 按延迟自动选择
4. 所有后端都配置健康检查,失败3次自动摘除
5. 权重策略用于灰度发布,平时不启用

最后提醒:DNS缓存是个大问题。就算你秒级切换,用户本地的DNS缓存可能还保留着旧IP。建议把TTL设小(60秒),同时在客户端做降级处理——比如前端加一层重试逻辑。

好了,这一章的内容就到这里。DNS智能路由看起来简单,但真正用好需要结合业务场景反复调优。下一章我们会讲故障检测与自动切换,到时候会用到今天讲的健康检查机制。