DNS 能做的不只是返回 IP

基本的 DNS 行为是「给一个名称,回一个地址」。但托管型 DNS 服务(NS1、UltraDNS 这类)把回答这一步变成了可编程的决策点——同一个名称,可以依提问者的位置、各端点的延迟、当下的健康状态,返回不同的答案。

这在跨境架构里很有用:亚洲的用户导到亚洲节点、欧洲的导到欧洲,不需要在应用层做任何事。但这套机制建立在一个前提上,而那个前提经常不成立——下表第三行就是问题所在。

调度方式 依据什么决定 限制
轮询(round robin) 依序轮流返回各个地址 完全不看位置或健康状态
加权分配 预先设定的流量比例 可控分布,但仍不看位置
地理路由(GeoDNS) 提问的递归解析器所在位置 不是用户的位置——除非有 ECS
延迟路由 测量到各端点的网络延迟 量的同样是解析器到端点,非用户
健康检查故障转移 端点是否通过健康检查 切换受 TTL 限制,不是即时的
常见的 DNS 流量调度方式与各自的判断依据。

先看各种调度方式分别依据什么。

三种会判断错的情况

以下三种都很常见,而且共通点是用户与解析器不在同一个地方:

  1. 用户改用公共 DNS 8.8.8.8、1.1.1.1 这类公共解析器采用任播(anycast),分散在全球。台湾的用户向 8.8.8.8 发问,实际响应的可能是新加坡或香港的节点,权威服务器看到的就是那个位置。用户只是在设置里改了一行 DNS,您的地理路由就失准了,而这完全不在您的控制范围内。
  2. 企业内部解析器集中在总部 许多企业把 DNS 查询统一导向总部的内部解析器。于是分公司在东京的员工,查询却是从台北发出——GeoDNS 会把他们全部导到台北节点。这种情况在日志上看起来完全正常,因为从权威服务器的角度,那确实是来自台北的查询。
  3. 电信与移动网络的解析器位置 运营商的解析器不一定部署在用户所在的区域,跨境情境下尤其明显。中国三大运营商各自的解析器架构不同,这也是同一个网站对电信与移动用户表现不一致的原因之一。

ECS 补上了什么,又补不上什么

EDNS Client Subnet(ECS,定义于 RFC 7871)就是为了解决这个问题:递归解析器在转发查询时,附带用户 IP 的网段片段,让权威服务器能依用户而非解析器判断位置。NS1 这类服务的地理过滤功能,官方文档也明说在解析器支持 ECS 时效果最好。

但它有三个限制。第一,不是所有解析器都会发送 ECS——这牵涉隐私,部分解析器刻意不传送,您无法要求对方配合。第二,发送的是网段而非完整 IP,精细度有限。第三,它增加了权威服务器的缓存负担,因为同一个名称要针对不同网段保留不同答案。

如果地理准确度是关键需求,任播(anycast)在结构上优于 GeoDNS。任播的路由发生在网络层,依实际的 BGP 路径决定用户连到哪个节点——那是用户的真实位置,不经过解析器这一层。这也是 CDN 通常不依赖 GeoDNS 做节点选择的原因。

健康检查与故障转移没有想象中快

托管 DNS 的健康检查会检测端点是否存活,失效时自动改返回备援地址。但这个切换要真正生效,必须等用户手上的缓存过期——也就是那笔记录的 TTL。TTL 设 300 秒,就有最长五分钟的用户仍会拿到指向故障端点的答案。

所以 DNS 层的故障转移适合处理「持续数分钟以上的故障」,不适合当作即时的高可用机制。若要秒级切换,那是负载均衡器或任播网络的工作,不是 DNS 的。这一点与 TTL 的行为直接相关,跟一般的 DNS 变更是同一套机制。

三个层次的判断

评估要不要用 GeoDNS 时,依序确认这三项:

一、你的用户用什么解析器?

这决定 GeoDNS 对你有多准。一般消费者大量使用公共 DNS,企业用户则常走内部解析器——两者都会降低准确度。如果用户集中在少数地区、且多用当地电信的解析器,准确度会高得多。

二、导错节点的后果有多严重?

如果只是延迟高一些,概率性的准确度可以接受。但如果涉及数据落地、合规区隔(例如某些数据不得离境),就不能依赖 GeoDNS——那需要在应用层做明确判断,而不是靠一个看不到用户的机制。

三、你要的是优化还是故障转移?

两者对 TTL 的要求相反。优化希望 TTL 长一点以减少查询;故障转移希望 TTL 短一点以加快切换。要同时做到就得取舍,或者把故障转移交给更下层的机制处理。

配置前该确认的三件事

在引入之前,这三项会决定它能不能达到你的期待:

  1. 确认服务商支持 ECS 且已启用 支持与启用是两件事,部分服务需要在配置中明确开启。没开的话,所有查询都会依解析器位置判断。
  2. 确认 TTL 与你的切换需求兼容 先想清楚可以接受多久的切换延迟,再回推 TTL。事后才发现 TTL 太长,那些已经发出的答案不会因为你改配置而失效。
  3. 确认有办法验证实际行为 从不同地区、不同解析器实际查询,看返回的是哪个地址。只从自己的网络测试,量到的永远是同一个答案——那证明不了地理路由有没有在运作。

小结

GeoDNS 的根本限制是权威服务器看不到用户,只看得到解析器。ECS 缓解了这个问题但不能消除它,因为发不发 ECS 由解析器决定,不由你决定。把它当成尽力而为的优化是合理的,当成精确的流量控制则会在出问题时无法解释。

若您需要的是可靠的就近接入而非概率性的猜测,任播架构在结构上更适合——路由决策发生在网络层,依用户的实际连接路径而非解析器位置。我们的 CDN 服务即属此类,并可在不接入中国大陆节点的前提下部署。

参考资料