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 列表。常见做法是“可用性过滤 + 延迟打分 + 权重分配”三段式:
- 可用性过滤:节点健康检查失败、负载超阈值、处于维护窗口的,直接剔除。健康检查通常包含 TCP 握手、HTTP 探针和节点自报负载。
- 延迟打分:对候选节点计算综合延迟分。可用 RTT 探测数据,也可用历史访问日志中的首字节时间(TTFB)做加权。示例公式:
score = 0.6 × RTT_probe + 0.4 × TTFB_history,分数越低越优。 - 权重分配:按节点容量和当前负载分配返回比例。例如 A 节点容量权重 50、B 节点 30、C 节点 20,则 DNS 应答按 5:3:2 轮询返回,避免单点过载。
下面这张图展示了一次完整的 GSLB 调度链路:从用户查询、ECS 携带网段、归属识别,到可用性过滤、延迟打分、Anycast/Unicast 分流,最终返回最优 IP。
调度策略的工程取舍
实际部署中,调度策略需要在精度、稳定性和成本之间平衡。以下是几个常见判断点:
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 静态小文件、公共 API | Anycast 为主 | 就近接入快,抗攻击,无需精细运营商区分 |
| 直播、大文件下载 | Unicast + ECS 精细调度 | 需要按省/运营商选路,避免跨网绕行 |
| 公共解析器用户占比高 | ECS + 解析器 IP 回退 | ECS 提升精度,回退保证兼容性 |
| 节点容量差异大 | 加权轮询 + 健康过滤 | 按容量分配,防止小节点被打满 |
总结来看,DNS 调度与 GSLB 的本质是:用 DNS 作为决策通道,用 ECS 提升用户识别精度,用 Anycast 做粗粒度就近,用 Unicast 做细粒度可控,再用可用性过滤和延迟打分把流量分配到真正健康的节点上。理解这条链路,才能在 CDN 加速出现异常时,快速判断问题出在解析、路由还是节点本身。