负缓存是什么
不存在的名字也会被缓存:解析器按一定时长记住失败结果,这就是「记录删了却还查得到」「新建子域却查不到」的原因。规则写在 RFC 2308 中,负缓存的时长由权威区的起始授权记录相关字段决定。
两种失败要分开看
名字不存在与名字存在但没有该类型的记录,是两种不同的结果,缓存语义与时长也可能不同。排查时先看应答里的状态码,再看权威段有没有给出起始授权记录,才能判断这个结论会被缓存多久。
基本信息
| 名字不存在 | 对应 NXDOMAIN,会被负缓存 |
|---|---|
| 无数据 | 名字存在但缺少该类型记录 |
| 规范 | RFC 2308 规定负缓存有效期 |
| 时长来源 | 起始授权记录中的最小生存时间与记录生存时间取较小者 |
典型使用场景
- 子域刚上线却短时间查不到
- 删除记录之后解析仍返回旧结论
- 排查不同解析器结果不一致
- 规划变更窗口时估算最长生效时间
查看负缓存窗口
查看负缓存窗口
dig example.com SOA +short # 看起始授权记录相关字段
dig @8.8.8.8 nonexist.example.com A +all | grep -i status # 看状态码
dig nonexist.example.com A +noall +authority # 看权威段给出的时间窗口结果与影响
| 结果 | 含义 | 影响 |
|---|---|---|
| 名字不存在 | 该名字没有记录 | 会被负缓存,新建同名记录后仍可能查不到 |
| 无数据 | 名字存在但缺该类型 | 部分解析器同样会缓存这个结论 |
| 解析失败 | 查询过程失败 | 通常不会被长期缓存,会立即重试 |
| 正常应答 | 有对应记录 | 按记录自身的生存时间缓存 |
上线新子域前不要做「先建再删再建」这类操作:负缓存会让新记录在这段时间内查不到,表现成「配置明明正确却不解析」。
起始授权记录里的最小生存时间既参与负缓存时长计算,也常被误当成「没有显式生存时间时的默认值」:不同实现的取值逻辑并不完全一致,看版本说明最稳妥。
排查时优先用与客户端同路径的解析器复现:不同解析器持有的负缓存状态不同,换一个解析器可能完全正常,从而误判为「已经恢复」。