4. DNS调度与全局负载均衡

当用户请求 cdn.example.com 时,真正决定他连到哪个边缘节点的,往往不是 HTTP 层,而是 DNS 层。DNS 调度是 CDN 全局负载均衡(GSLB)的第一道决策入口:它要在几十毫秒内,根据用户所在网络位置、各节点健康状态和实时延迟,返回一个“最合适”的边缘 IP。理解这一层,才能理解为什么同一个域名在不同城市、不同运营商解析出的地址不同,也才能排查“解析对了但访问慢”这类问题。

智能DNS解析:从静态记录到策略决策

传统权威 DNS 只做“域名→固定 IP”的映射,而智能 DNS(GSLB 权威服务器)把解析过程变成一次策略计算。它接收递归解析器的查询,提取来源 IP、查询类型、EDNS 扩展信息,再结合节点健康库和调度策略,动态生成应答。核心流程是:识别用户归属 → 过滤可用节点 → 按策略排序 → 返回最优 IP 集合。

归属识别通常依赖 IP 地理库和 AS 号库,把来源 IP 映射到“国家/省/市 + 运营商 + 自治域”。例如来源 IP 属于中国电信广东 AS4134,则优先匹配广东电信节点。这里有一个关键限制:权威服务器看到的往往是递归解析器的 IP,而不是终端用户 IP。如果用户使用 114.114.114.114 或 8.8.8.8,权威侧只能看到解析器位置,调度精度会明显下降。这正是 EDNS Client Subnet 要解决的问题。

EDNS Client Subnet:把用户网段带进解析链路

EDNS Client Subnet(ECS,RFC 7871)允许递归解析器在查询中携带用户所在网段的前缀(如 203.0.113.0/24),权威服务器据此做更精细的调度,同时响应中回带相同 scope,便于缓存按网段区分。典型交互如下:

; 递归解析器 → 权威服务器(携带 ECS)
example.com. IN A
OPT: ECS 203.0.113.0/24

; 权威服务器 → 递归解析器(按该网段调度)
example.com. 30 IN A 198.51.100.10
OPT: ECS 203.0.113.0/24 (scope /24)

ECS 的收益是调度精度提升,代价是缓存命中率下降——不同 /24 网段可能得到不同答案,公共解析器需要为每个网段分别缓存。工程上通常设置前缀长度上限(如 IPv4 最多 /24,IPv6 最多 /56),既保护用户隐私,又避免缓存碎片化。若递归解析器不支持 ECS,权威侧应回退到基于解析器 IP 的粗粒度调度,而不是直接返回错误。

Anycast 与 Unicast 混合调度

Anycast 让多个边缘节点宣告同一个 IP 前缀,由 BGP 路由把用户引导到“网络距离最近”的节点。它的优势是天然就近、抗 DDoS、故障时路由自动收敛;缺点是路由选择基于 BGP 跳数/策略,未必等于真实应用延迟,且同一 IP 难以做细粒度的运营商级区分。

Unicast 则为每个节点或每组节点分配独立 IP,由 DNS 精确指定。它可控性强,能按省份、运营商、容量权重精细分配,但依赖 DNS 生效速度和客户端缓存。实际生产系统多采用混合调度:

  • Anycast 承载通用入口:静态资源、公共 API 使用 Anycast IP,快速就近接入并吸收攻击流量。
  • Unicast 承载精细调度:直播、大文件、需要按运营商优化的业务,用 DNS 返回特定节点 IP。
  • 健康联动:Anycast 节点故障由 BGP 撤销路由;Unicast 节点故障由 DNS 摘除记录,两者互为补充。

基于延迟和可用性的流量分配算法

调度器最终要输出一个排序后的 IP 列表。常见做法是“可用性过滤 + 延迟打分 + 权重分配”三段式:

  1. 可用性过滤:节点健康检查失败、负载超阈值、处于维护窗口的,直接剔除。健康检查通常包含 TCP 握手、HTTP 探针和节点自报负载。
  2. 延迟打分:对候选节点计算综合延迟分。可用 RTT 探测数据,也可用历史访问日志中的首字节时间(TTFB)做加权。示例公式:score = 0.6 × RTT_probe + 0.4 × TTFB_history,分数越低越优。
  3. 权重分配:按节点容量和当前负载分配返回比例。例如 A 节点容量权重 50、B 节点 30、C 节点 20,则 DNS 应答按 5:3:2 轮询返回,避免单点过载。

下面这张图展示了一次完整的 GSLB 调度链路:从用户查询、ECS 携带网段、归属识别,到可用性过滤、延迟打分、Anycast/Unicast 分流,最终返回最优 IP。

终端用户 203.0.113.45 递归解析器 携带 ECS /24 GSLB 权威调度 ① 归属识别 ② 可用性过滤 ③ 延迟打分 ④ 权重分配 节点健康与延迟库 RTT / TTFB / 负载 / 探针 Anycast 入口 同一 IP 前缀,BGP 就近 抗 DDoS,路由自动收敛 Unicast 精细调度 独立 IP,按省/运营商分配 DNS 摘除故障节点 返回最优 IP 列表 198.51.100.10 (权重 5) 198.51.100.22 (权重 3) 延迟打分示例(分数越低越优) 节点A:0.6×18ms + 0.4×22ms = 19.6 节点B:0.6×25ms + 0.4×20ms = 23.0 节点C:0.6×40ms + 0.4×35ms = 38.0 排序:A > B > C,按权重返回

调度策略的工程取舍

实际部署中,调度策略需要在精度、稳定性和成本之间平衡。以下是几个常见判断点:

场景推荐策略原因
静态小文件、公共 APIAnycast 为主就近接入快,抗攻击,无需精细运营商区分
直播、大文件下载Unicast + ECS 精细调度需要按省/运营商选路,避免跨网绕行
公共解析器用户占比高ECS + 解析器 IP 回退ECS 提升精度,回退保证兼容性
节点容量差异大加权轮询 + 健康过滤按容量分配,防止小节点被打满
ECS 前缀长度建议:IPv4 不超过 /24,IPv6 不超过 /56。过长的前缀会显著降低公共解析器缓存命中率,反而增加权威服务器压力。
DNS 调度存在 TTL 生效延迟。若节点故障后仅靠 DNS 摘除,客户端可能仍缓存旧 IP 直到 TTL 过期。因此关键业务应同时依赖 Anycast 路由收敛或客户端重试机制,不能只靠 DNS。

总结来看,DNS 调度与 GSLB 的本质是:用 DNS 作为决策通道,用 ECS 提升用户识别精度,用 Anycast 做粗粒度就近,用 Unicast 做细粒度可控,再用可用性过滤和延迟打分把流量分配到真正健康的节点上。理解这条链路,才能在 CDN 加速出现异常时,快速判断问题出在解析、路由还是节点本身。