TTL 与 DNS 生效时间:为什么解析没立刻生效

TTL 是解析记录的缓存有效期;改了解析后,旧值会被各级缓存留到 TTL 过期才刷新——所以别指望"秒生效"。

刚改完 DNS 解析,却发现网站还指向旧服务器?这几乎总是 TTL 缓存在作怪,而不是配置出错。理解 TTL,你就能预判生效时间,并在换 IP、迁移服务器前主动把等待时间压到最短。

什么是 TTL

TTL(Time To Live)是每条 DNS 记录附带的一个秒数,告诉全世界的解析器:这条记录可以缓存多久。常见值有 3600(1 小时)、86400(24 小时)。

当你把域名从旧 IP 改到新 IP,权威服务器立刻更新了,但在此之前查询过该记录的递归解析器(运营商 DNS、公共 DNS、你本机)手里还攥着旧值。它们要等各自缓存里的 TTL 倒计时归零,才会回权威服务器重新拉取。这段"新旧并存"的窗口,就是常说的 DNS 传播(propagation)——它本质不是数据在"扩散",而是各处缓存陆续过期。

迁移前:提前把 TTL 调小

关键技巧:改动之前先把相关记录的 TTL 降下来,比如从 86400 改成 300(5 分钟)。

  • 至少提前"旧 TTL 时长"(如原本 24 小时)去调小,让旧的大 TTL 缓存先自然过期;
  • 待全网都以 300 的节奏缓存后,再执行真正的 IP 变更;
  • 这样切换的最坏等待就从一天缩短到几分钟;
  • 迁移稳定后,可把 TTL 调回 3600 以上,降低查询量、提升稳定性。

清理本地缓存

有时全球都好了,只有你自己的电脑还看旧值,因为本机也缓存。刷新方法:

Windows:

ipconfig /flushdns

Linux(按发行版任选其一):

sudo systemd-resolve --flush-caches   # 或新命令 resolvectl flush-caches
sudo systemctl restart nscd           # 若使用 nscd

macOS:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

注意:浏览器有自己的 DNS 缓存,必要时重启浏览器;而运营商递归解析器你无法强制刷新,只能等它的 TTL。

验证是否真正生效

别凭"我这能打开了"下结论,要多角度核对。

查看某条记录当前值与剩余 TTL:

dig A example.com +noall +answer
nslookup example.com            # Windows / 通用

绕过本地缓存,直接问指定公共 DNS:

dig @8.8.8.8 A example.com
dig @1.1.1.1 A example.com

从根域一路追踪解析路径,确认权威服务器已返回新值:

dig +trace A example.com

再配合多地在线查询工具(全球多个节点同时查)看各地是否都翻新。当各主流公共 DNS 与多地节点都返回新 IP,才算真正全球生效。

常见误区

  • "改完立刻生效":除非旧 TTL 本就很小,否则不可能;先看原 TTL。
  • 只测自己电脑:本机/浏览器缓存会骗你,务必换解析器、换地区验证。
  • 改完才想起调小 TTL:此时旧的大 TTL 已被缓存,调小要等下一轮才起效,来不及了。

小结

DNS 没"秒生效",是因为 TTL 决定了旧值在各级缓存里的存活时间。正确姿势:迁移前提前把 TTL 调到如 300,变更后用 ipconfig /flushdns 或 resolvectl flush-caches 清本地缓存,再用 dig +trace、指定公共 DNS 及多地查询确认全球翻新;稳定后把 TTL 调回。把 TTL 管好,生效时间就在你掌控之中。