第2章:DNS解析与就近调度

你打开一个网页,几毫秒之内,DNS就把域名变成了IP地址。嗯,这个过程看起来很简单,但背后藏着整个CDN调度的起点。说白了,DNS是就近访问的第一道关卡。如果DNS配错了,后面再好的调度算法也白搭。

2.1 DNS工作原理:从递归到迭代

很多人觉得DNS就是查个表而已。其实它的查询链路比你想象的长得多。我举个实际例子:用户访问 www.example.com,流程是这样的——

  1. 浏览器先查本地缓存。没有命中?那就走第二步。
  2. 向本地DNS递归服务器(通常是运营商分配的)发起查询。
  3. 递归服务器从根域名服务器问到顶级域名服务器(.com),再问到权威服务器(example.com)。
  4. 权威服务器返回www.example.com的IP地址。
  5. 递归服务器把结果缓存并返回给用户。

这里面有一个关键点:递归服务器的位置决定了调度能有多准。为什么?因为GSLB(全局负载均衡)通常只能看到递归服务器的IP,看不到用户真实IP。你想想看,如果你的递归服务器在北京,用户却在洛杉矶,那调度岂不是乱套了?

核心结论:CDN就近调度依赖的是递归服务器的地理位置,而不是最终用户的真实位置。如果递归服务器离用户太远,调度就会“跑偏”。

2.2 基于DNS的GSLB:用权威服务器做负载均衡

GSLB全称是Global Server Load Balancing,翻译过来就是全局负载均衡。它利用DNS的权威服务器来做决策——当递归服务器来查询某个域名时,权威服务器根据请求来源(递归服务器IP)返回不同的IP地址。比如:

  • 上海的用户查img.cdn.example.com,GSLB返回上海节点的IP(比如1.1.1.1)。
  • 纽约的用户查同样域名,GSLB返回纽约节点的IP(比如2.2.2.2)。

我在项目中遇到过这么一个问题:某个海外客户抱怨访问我们CDN慢,排查后发现他的递归服务器在美国中部,但GSLB把他调度到了新加坡节点。为什么?因为GSLB配置时把北美区域和东南亚区域的地理范围重叠了……后来我们调整了IP地理库,问题才解决。

GSLB决策要素说明
递归服务器源IP最常见,但精度受限于递归服务器位置
EDNS Client Subnet (ECS)携带用户真实IP段,精度更高
健康检查状态自动剔除故障节点
负载策略按权重、区域、或自定义规则分配流量

避坑指南:我曾经在给海外客户做方案时,忘开ECS。结果大量用户被调度到错误的地区。后来强制打开ECS,配合白名单灰度上线,才恢复正常。一定要确认你的权威DNS和递归服务器都支持ECS,否则白搭。

2.3 智能DNS解析策略:让调度更聪明

智能DNS就是把GSLB能力再包装一层,加入更精细的分流逻辑。常见的策略有这几种:

  • 基于地理区域的解析:按国家、省份、甚至城市粒度返回不同IP。比如北京的用户走联通节点,上海的用户走电信节点。
  • 基于运营商的解析:移动用户返回移动CDN节点,联通用户返回联通节点,避免跨网拥堵。
  • 基于权重的多IP返回:同一个域名返回多个A记录,权重控制流量比例,适用于A/B测试或灰度发布。
  • 基于健康探测的动态调整:如果某个节点挂了,智能DNS自动不再返回它的IP。

举个例子。某电商平台做双十一活动,需要把30%的流量导到新上线的新加坡节点做压测。他们用智能DNS把东南亚用户(新加坡递归)权重设为30%,其他区域不变。上线后一看,流量平稳,没有出现大范围故障。这就是智能DNS的灵活性。

2.4 从DNS到就近调度的完整链路

我们把这几个环节串起来,用一张图说明白:

DNS就近调度流程图 用户 递归DNS 权威DNS(GSLB) CDN节点A CDN节点B CDN节点C 关键流程说明 1. 用户向递归DNS查询域名 → 2. 递归DNS向权威DNS查询 → 3. 权威DNS根据递归IP和策略返回最优CDN节点IP 4. 用户直接连接该CDN节点获取内容 → 5. 如果节点故障,GSLB自动更换返回的IP

注意:图中“用户直接连接节点”那条线只是理想情况。实际上,用户连接的是GSLB返回的IP,如果CDN节点部署了anycast,用户网络会路由到最近的节点;如果用的是普通IP,就跟DNS抢答没关系了。

2.5 实战:配置一个简单的智能DNS策略

假设我们有一个CDN服务商,域名是 cdn.mycompany.com。北京有节点B1,上海有节点S1。我们希望电信用户解析到B1,联通用户解析到S1。用Bind9的 view 语句可以做:

view "telecom" {
  match-clients { 电信IP段; };
  zone "cdn.mycompany.com" {
    type master;
    file "/etc/bind/zones/db.telecom";
  };
};

view "unicom" {
  match-clients { 联通IP段; };
  zone "cdn.mycompany.com" {
    type master;
    file "/etc/bind/zones/db.unicom";
  };
};

然后在 db.telecom 里写:

cdn.mycompany.com. IN A 1.1.1.1   ; B1的IP
cdn.mycompany.com. IN AAAA 2001::1

在 db.unicom 里写:

cdn.mycompany.com. IN A 2.2.2.2   ; S1的IP

嗯,就是这么简单。但你要注意,这个方案依赖运营商IP段的准确性。我曾经遇到过IP库过期导致用户匹配错误的情况,后来我们每周从APNIC同步一次IP段数据,才解决了这个问题。

2.6 总结几个关键点

  • DNS就近调度的核心是权威服务器根据请求源返回不同结果。
  • 递归服务器的位置决定了调度精度,ECS是重要的辅助技术。
  • 智能DNS策略可以叠加地理、运营商、权重、健康探测等多维度,但配置越复杂,维护成本越高。
  • 不要迷信DNS调度可以解决一切问题,它只能做到“IP级别的就近”,其他优化(比如传输层优化)还得靠别的技术。