概述
每个 DNS 应答都带有 TTL,解析器可以在该时间内缓存,客户端还可能缓存更久。实用规则是:在需要灵活切换之前先把 TTL 调低,然后等待至少两个旧 TTL 周期让缓存过期。切换记录与调低 TTL 同时进行没有意义,因为解析器已经持有旧值。
步骤
- 分别查询权威服务器和公共解析器,记录地址与 TTL:
dig +noall +answer api.example.com A
dig @1.1.1.1 +noall +answer api.example.com A
dig @8.8.8.8 +noall +answer api.example.com A
- 在切换前至少两个旧 TTL 周期,把 TTL 调低到 60 秒:
curl -s -X PATCH \
"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"ttl":60}'
- 等待旧 TTL 过期后,确认所有解析器返回的 TTL 都不高于 60。
- 切换记录,连续查询确认只剩新地址。
验证
预期切换后 dig +short 只返回新的负载均衡地址,两个公共解析器在 TTL 窗口内收敛。若某个解析器仍返回旧地址,用 dig +trace 查看是否还有第二个权威服务器或 CNAME 链。
注意事项
- 无法主动刷新第三方解析器缓存,只能等待 TTL 到期。
- 部分服务商强制最小 TTL,代理记录通常使用固定值,需要提前确认。
- 不要在切换期间反复来回修改记录,会延长不一致时间。
- JVM、移动 SDK 和连接池可能忽略 TTL,迁移期间应保留旧地址可达或增加重新解析逻辑。