必须留档的四样
- 生效配置快照 —— 含各区域的实际下发值,而不是「设计值」
- 基线数据 —— 否则下一个接手的人无法判断当前是否正常
- 回滚演练的实测耗时 —— 决定阈值该设多严
- 例外清单 —— 哪些终端或域名没纳入(这类信息最容易只在某个人脑子里)
运行手册
可以照着做的上线流程。与部署实践的分工是:那页决定「选哪种方案」,本页决定「怎么把它推上去并且能退回来」。
多数团队把回滚放在最后 —— 那正是它来不及用的原因。每两步之间都有一道闸门,条件不满足就不要进入下一步。
如果回滚通道不预先建好,故障时的「回退」往往只有一条路:临时改回明文。 那等于把刚建立的全部保护一次性撤掉,而且没人来得及评估这个决定。
更重要的是要演练一次。没演练过的回滚方案,在真出问题时通常会发现:
演练的产出是一个数字:从决定回退到恢复服务,实际需要多久。这个数字要写进值班手册, 因为它决定了「阈值该设多严」—— 若切回要 20 分钟,就不该等到失败率 5% 才动手。
加密 DNS 常见的问题不是「坏」,而是「慢了一点」「偶发失败」。没有基线,这两种问题都会无法判定。
# 建议至少采集这些(换成你自己的域名与解析器)
for d in $(cat domains.txt); do
dig @127.0.0.1 "$d" +noall +stats +time=3
done
# 或直接用 reset 工具类持续打点,按区域分组
# 关键:同时记录【解析器】与【协议】,否则事后无法归因
要测的不只是延迟,还要区分失败的类型:
NXDOMAIN —— 域名确实不存在(正常结果,不是故障)SERVFAIL —— 解析器活着但无法给出答案(常见于 DNSSEC 校验失败或上游异常)把这三类混在一个「失败率」里,是后面无法定位问题的常见原因。
第一批选技术团队与测试终端,理由不是「他们重要」,而是他们出事会告诉你, 而普通用户出事只会默默换个网络或放弃。
这批重点看的是兼容性而不是性能:
准出条件:无兼容性异常,且失败率未超过基线。任一项不满足,就原地排查,不要放量 —— 带着未解释的异常扩大范围,后面会无法归因。
第一批成功不代表第二批会成功,因为覆盖的网络路径变了。这个阶段最容易暴露的问题是按区域分布的:
准出条件:各区域指标都在可接受范围内,且不存在单点依赖。 发现某区域只能走一个上游时,先补第二上游再继续。
放量不等于结束。这个阶段要盯的是悄悄劣化,而不是明显故障:
回退开关要保留至少一个版本周期 —— 有些问题(例如特定应用的兼容性) 要等到某个业务场景真正被触发才暴露。
「回滚」不是一种动作。选哪种决定了故障持续多久、以及这次上线会不会白做。
| 方式 | 代价 | 适用时机 |
|---|---|---|
| 切换上游 换解析器,保留加密 |
低。保护不丢失,通常秒级到分钟级 | 某个上游退化或不可用时的首选。多数「回滚」其实应该是这个 |
| 切回旧配置 回到变更前状态 |
中。需要终端层面的配置下发或重启 | 协议层本身有问题、且切换上游无效时 |
| 退回明文 关闭加密 |
高。保护归零,且事后往往没人再把它打开 | 只应在没有其它手段、且已明确记录原因时使用 |
告警只会告诉你「失败了」。下面这组判别方法决定你往哪个方向查。
| 现象 | 多半是 | 一步确认 |
|---|---|---|
| 只有某些域名失败,其它正常 | 上游或权威侧问题,与加密无关 | 换一个解析器问同一个域名,若仍失败则是域名侧问题 |
| 所有域名都失败,且无响应(不是报错) | 严格模式下证书校验失败,或加密通道不通 | 看是否 DNSOverTLS=opportunistic 下能恢复 |
| 失败率随区域变化 | 该区域的出口策略或链路质量问题 | 按区域分组看指标,确认是否集中于某一出口 |
| 间歇性失败,重试可恢复 | 多个上游之间结果不一致,或某个上游抖动 | 分别对每个上游连续 dig,比对成功率 |
| 延迟整体上升但失败率正常 | 解析器变远,或缓存命中率下降 | 看缓存命中率与 P95,而不是只看均值 |
这几条与排错与运维里的单机判断树是互补的: 那页面向「一台机器打不开」,本页面向「一批终端失败率上升」。判据相同,但前者靠命令、后者靠分组指标。
不是为了流程好看,而是因为下一次排查会依赖这些记录。
「设计配置」与「生效配置」往往不一致:某台机器手工改过、某个区域漏下发、某个终端回退了但没人记录。
所以快照要从终端侧反查(例如 resolvectl status 的输出汇总),
而不是直接复制配置管理系统的预期值。这两者的差异,正是下次故障排查里最耗时的部分。