改一条地址记录很容易,预测每个解析器何时停止使用旧应答却很难。生存时间(TTL)值随 DNS 响应传播,控制通常情况下的缓存新鲜度。在迁移那一刻降低 TTL,并不能改写更早被缓存下来的应答。

至少提前一个旧 TTL 降低 TTL。两个示意递归缓存,在权威切换后不同时间内仍保留旧应答。迁移与观察期间,新旧端点都服务预期主机名。权威证据、递归缓存状态、A 与 AAAA 记录、CNAME 链及 SOA 决定的否定 TTL 应分别检查。过期应答、应用缓存与长连接,使 TTL 无法成为统一下线期限。
TTL 随每个应答传播。切换前做好准备,让两侧持续有效,并结合旧端点流量与余量决定下线和回滚。

在事件前降低 TTL

如果既有记录是一天的 TTL,至少要在计划切换前一个旧 TTL 时就把它降低。这样在权威记录仍指向旧端点时,缓存有时间去取较短的值。确切间隔应写进变更计划,而不是在迁移中即兴执行。

单独记录权威服务器的应答。下面两条探针比较系统配置的解析器与公共递归解析器,并不天然属于权威查询:

dig +noall +answer www.example.test A
dig @1.1.1.1 +noall +answer www.example.test A

要取得权威证据,应向该区域实际的名称服务器发起非递归查询,并检查 AA 标志、状态、答案与权威部分。递归解析器的剩余 TTL 反映其当前缓存状态,不同解析器可以合理地不同。还应检查服务使用的 AAAA 与 CNAME 链,不能只检查 A。

让两侧都保持有效

切换期间,保持旧端点与新端点都能为预期主机名提供服务。TLS 名称、重定向与应用配置在两侧必须一致。权威记录改变后立刻移除旧端点,会给仍持有先前应答的客户端造成本可避免的停机。

否定应答也会被缓存。一个最近返回 NXDOMAIN 的名字,其出现可能很慢才可见,因为根据区域的权威数据,否定响应可能仍留在递归缓存里。

观察后恢复 TTL

一旦权威与具有代表性的递归应答都指向新端点,且旧缓存窗口已过,就恢复正常 TTL。在变更记录中保留旧值、新值、权威应答与回滚条件。

TTL 不是所有客户端统一的下线期限。解析器在解析失败时可能提供过期数据,长连接与应用缓存也可能超过 DNS 新鲜期。应观察旧端点流量并预留余量;把 DNS 改回去同样有缓存窗口。对否定应答,应检查由 SOA 决定的否定 TTL,不能假设新 A 记录的 TTL 适用。

来源