DNS 负缓存是什么?NXDOMAIN 为什么也会被缓存?
简化版
DNS 负缓存是指递归解析器会缓存“查不到”的结果,例如 NXDOMAIN 或没有某类记录的响应。
这样可以避免大量客户端反复查询不存在的域名,减轻权威 DNS 压力。负缓存的时间通常由权威区 SOA 记录中的相关 TTL 控制。
工程上要注意:如果刚创建一个新子域,但之前有人查过并缓存了 NXDOMAIN,短时间内可能仍解析不到。
详细版
负缓存常见结果:
NXDOMAIN:域名不存在。NOERROR/NODATA:域名存在,但请求的记录类型不存在。
示例:
dig not-exist.example.com
status: NXDOMAIN
递归解析器可能会缓存这个不存在结果。
如果 5 分钟内你刚好创建了 not-exist.example.com,部分用户仍可能被旧的负缓存影响。
这就是为什么上线新域名前,要提前规划记录,避免先被错误访问产生负缓存。
完整版教学
1. 先说明为什么不存在也要缓存
DNS 缓存不只缓存成功答案。
如果不存在的域名每次都要递归查到权威 DNS,会浪费大量资源。
例如程序拼错域名:
apii.example.com
如果有 10000 个客户端反复查询,权威 DNS 压力会很大。
负缓存的核心价值是把“确定不存在”的结果也临时记住,减少重复查询。
2. NXDOMAIN 和 NODATA 的区别
负响应不只有一种。
| 响应 | 含义 | 示例 |
|---|---|---|
| NXDOMAIN | 域名不存在 | no-such.example.com |
| NOERROR/NODATA | 域名存在但该类型记录不存在 | 查 AAAA 但只有 A |
| SERVFAIL | 查询失败 | 权威不可达或验证失败 |
严格来说,SERVFAIL 通常不应像 NXDOMAIN 那样长期缓存。
面试中要能区分“名字不存在”和“记录类型不存在”。
3. 负缓存 TTL 从哪里来
负缓存 TTL 通常与权威区的 SOA 记录有关。
示例:
example.com. 3600 IN SOA ns1.example.com. admin.example.com. (
2026080201 3600 600 604800 300 )
最后的 300 常被用于负缓存相关 TTL。
不同实现还会结合 SOA 本身 TTL 和协议规则计算。
你不一定要背细节,但要知道负缓存不是无限期的。
4. 负缓存对上线有什么影响
假设你准备上线:
new-api.example.com
但记录还没创建前,测试脚本已经大量查询过这个域名。
递归 DNS 缓存了 NXDOMAIN。
你后来创建 A 记录后,部分递归解析器在负缓存过期前仍返回不存在。
这会造成“我已经配置了,为什么有些地方还解析不到”的现象。
5. 如何降低负缓存影响
工程上可以:
- 提前创建即将上线的 DNS 记录。
- 上线前避免公开访问未配置域名。
- 合理设置 SOA negative TTL。
- 变更前用多个递归 DNS 测试。
- 对关键域名做灰度和监控。
但已经产生的负缓存不能强制让全网立即消失。
你只能等待缓存过期,或者让客户端换用未缓存该负响应的解析器。
6. 和普通 TTL 的区别
普通 TTL 控制成功记录缓存多久。
负缓存控制失败答案缓存多久。
成功记录:api.example.com -> 1.2.3.4
负响应:missing.example.com -> NXDOMAIN
两者都影响 DNS 变更生效时间。
只是负缓存更容易被忽略,因为大家常以为“没查到就不会缓存”。
7. 常见误区与追问
- 误区:DNS 只缓存成功解析结果。 NXDOMAIN 等负响应也可能被缓存。
- 误区:创建记录后全网立刻可见。 如果之前有负缓存,需要等它过期。
- 误区:NXDOMAIN 和 NODATA 是同一回事。 前者是名字不存在,后者是名字存在但类型记录不存在。
- 追问:负缓存 TTL 从哪里来? 通常来自权威区 SOA 记录相关字段和 TTL 规则。
- 追问:SERVFAIL 会长期负缓存吗? 通常不应长期缓存,因为它表示查询失败而不是名字不存在。
- 追问:上线新域名如何避免负缓存? 提前创建记录,避免先访问未配置域名。
8. 加强记忆
负缓存记成“查不到也会记一会儿”。
DNS 变更里,成功记录 TTL 和失败结果 TTL 都会影响生效体验。