DNS 缓存:为什么改了域名却不能立即生效
TL;DR
DNS 解析不是一次查询,而是浏览器、操作系统、递归解析器和权威服务器共同完成的缓存链路。本文解释 TTL、递归与权威、A/AAAA/CNAME、迁移节奏,以及 DNSSEC 能解决和不能解决的问题。
DNS 解析不是一次查询,而是浏览器、操作系统、递归解析器和权威服务器共同完成的缓存链路。本文解释 TTL、递归与权威、A/AAAA/CNAME、迁移节奏,以及 DNSSEC 能解决和不能解决的问题。

“我已经把域名指向新服务器了,为什么有人能打开新站,有人还在访问旧站?”这不是 DNS 修改失败,而是 DNS 的缓存机制正在按各自的计时器工作。DNS 记录带有 TTL(Time To Live),递归解析器可以在这段时间内复用旧答案;RFC 1034 把 TTL 定义为资源记录在缓存中可以保留的时间。RFC 1034
DNS 不是“改一个中心表格,全世界立即刷新”。它更像一套分层的分布式目录:权威服务器保存源数据,递归解析器代替大量客户端查询并缓存结果,操作系统和浏览器还可能保留更近一层的缓存。
从域名到 IP,查询经过哪些人
当浏览器访问 www.example.com,客户端通常不会直接询问根服务器。一个简化过程是:
- 浏览器和操作系统先检查本地缓存。
- Stub Resolver 把请求交给配置好的递归解析器。
- 递归解析器若没有可用缓存,先问根服务器“
.com在哪”。 - 再问
.com顶级域服务器“example.com的权威服务器在哪”。 - 最后问
example.com的权威服务器“www的 A 或 AAAA 记录是什么”。 - 递归解析器缓存结果,并把答案返回给客户端。
实际系统还会处理 CNAME 链、IPv4 与 IPv6 双栈、DNSSEC、负面缓存和超时重试。图里的层级是帮助理解的骨架,不代表每次查询都必须完整走一遍。
TTL 不是“全世界刷新时间”
假设一条 A 记录的 TTL 是 300 秒。一个递归解析器在 12:00 查询到旧 IP 后,通常可以把它缓存到 12:05 左右。另一个解析器可能在 12:02 才首次查询,于是它的缓存会保留到 12:07。不同解析器的查询时间不同,就会出现用户在不同网络看到不同结果。
TTL 还不一定决定所有本地缓存行为。操作系统、浏览器、应用内 DNS 缓存、CDN 和中间网络设备都可能有自己的策略。TTL 是缓存资源记录的重要依据,但不是一个能精确控制所有客户端的遥控器。
为什么迁移前要提前降低 TTL
域名迁移常见做法是提前把旧记录的 TTL 降低,等待旧的长缓存自然过期,再切换到新 IP。切换后保留旧服务器一段时间,让仍持有旧答案的客户端继续得到服务;等观察窗口过去,再下线旧站。
降低 TTL 不能追溯性地清除已经缓存的旧记录。如果一条记录昨天的 TTL 是 86400 秒,今天才改成 300 秒,昨天已经拿到旧值的解析器仍可能继续使用旧值,直到原来的缓存周期结束。
迁移前:降低 TTL → 等旧缓存逐渐过期
切换时:修改权威记录 → 新查询获得新地址
观察期:新旧服务器同时可用 → 监控错误与流量
收尾:确认旧缓存基本消退 → 下线旧服务
A、AAAA、CNAME 有什么区别
A记录把名称指向 IPv4 地址。AAAA记录把名称指向 IPv6 地址。CNAME记录把一个名称指向另一个名称,解析器还要继续解析目标名称。
使用 CNAME 能让多个服务共享一个目标,但会增加解析链和故障排查复杂度。根域、CDN、邮件和证书验证还可能受到不同记录类型与服务商限制,不能只记住“域名就是一个 IP”。
DNSSEC 能解决什么
DNSSEC 通过签名验证 DNS 数据来源和完整性,帮助客户端判断答案是否被篡改。但 DNSSEC 不会让缓存更快失效,也不会把旧的合法记录变成新的合法记录。它解决的是“这个答案是否经过权威签名验证”,不是“这个答案是不是最新”。
一份迁移与排查清单
- 先确认修改的是权威 DNS,而不是只改了本地 hosts 文件。
- 同时检查 A、AAAA、CNAME 和 CDN 配置。
- 用多个递归解析器查询,比较它们的 TTL 剩余时间。
- 保留旧服务,直到旧缓存和长尾客户端明显下降。
- 修改 DNS 后不要立刻把所有问题归因于 DNS,TLS、缓存、CDN 和应用路由也可能指向旧目标。
一句话带走
DNS 的“传播慢”本质上是分布式缓存按不同时间开始、不同时间过期。理解权威服务器、递归解析器和 TTL 三层关系,就能把“玄学等待”变成可观测的迁移流程。



