我们的域名由 Enom 托管。DNS 记录由 Enom 的印度经销商 Pugmarks 管理。我们希望将 DNS 记录管理服务从 Enom/Reseller 切换到 AWS Route53,但保留 Enom 作为域名注册商。
域的 DNS 记录的 TTL 为 300(5 分钟)。我检查了名称服务器的 TTL,发现它是 3600(1 小时)。
当我们将 Enom 名称服务器替换为 Route53 名称服务器时,Enom 立即停止解析该域名。随后,ISP DNS 服务器在 TTL 过期后也停止解析。我们的网站流量下降(如 Google 分析中观察到的)。这种影响是可以理解的。
过了一会儿,通过公共/开放名称服务器(如:4.2.2.2 -- 4.2.2.6 和 8.8.8.8 & 8.8.4.4)查询域的 NS 记录,我们得到了指向 Route53 的更新记录:即
dig NS <domain.com> @8.8.4.4.
上述命令显示了 Route53 名称服务器记录。同样,所有其他记录也成功显示(A、CNAME 等),表明这些 DNS 服务器已成功获取名称服务器更改。此时,我们在 Google Analytic 中观察到美国流量扩展。
但是,印度的流量仍然为零。我查询了两家不同的印度 ISP(不对外开放/仅对 ISP 用户开放)的几台 DNS 服务器。这些服务器没有返回任何记录。我们等了 4 个小时,希望 ISP 能赶上记录的变化,但徒劳无功。
奇怪的是,美国地区能够获得新记录,而我们尝试的印度 ISP(至少 5 个)都无法发现这一变化。除了这里的 ISP,网络上的所有其他 DNS 测试工具都能够发现这一变化。这导致流量大幅下降,这是一个主要问题,因为该网站的目标受众是用户。
经过 4 小时的等待和观察,我们将条目切换回 Enom 名称服务器。几秒钟内,印度 ISP 就能够解析记录,就好像它一直在向 Enom 服务器查询记录一样,尽管 TTL 为 1 小时。(Route53 将继续解析,因此美国流量保持不变)
我有两点疑惑:
- 印度 ISP 为该域名缓存 NS 超过 1 小时,可能长达 48 小时
- 一些与印度地区有关的问题我并不了解。
就我而言,第 1 点是主要嫌疑。以下是关联提供有关域的详细信息。它显示父名称服务器的 TTL 为 48 小时,而本地名称服务器的 TTL 为 1 小时。这会导致问题吗?
我想将 DNS 管理转移到 Route53,并且不能停机超过 6 小时。我们尝试过最多 4 小时,但都徒劳无功。
为什么会发生这种情况?解决的办法是什么?
一个替代方案可能是将所有 DNS 记录保留为 49 小时 TTL(TTL 大于父级 NS 记录的 TTL),然后在记录传播此 TTL 更改后切换名称服务器。然而,这不是万无一失的,但可以尝试。
答案1
(这是一个老问题,但仍然值得回答)
显然,您所做的是:您准备好新的名称服务器来权威地回答有关您的域的问题。然后您切换注册(即,将dnsindia.com
负责的父 DNS 服务器的 NS 条目更改为com
指向新的 DNS 服务器);与此同时,旧名称服务器停止回复有关的问题dnsindia.com
(或使用 NXDOMAIN 或其他内容回复)。
因此,影响(尤其是对您的主要受众)如下:1 小时后,印度 ISP 的 DNS 解析器中缓存的任何数据都会过期 - 但只有您的条目的数据,例如 A 记录www.india.com
。因此,解析器会尝试查询相应的名称服务器以获取新数据。但是,信息哪个要查询的服务器尚未过期:该信息来自该com
区域,TTL 为 48 小时(因此可能仍高达 47 小时,假设平均为 24 小时);由于这指的是旧提供商处现已停用的 DNS 服务器,因此会发生您观察到的故障。另一方面,查询远程解析器将会成功,因为它不太可能具有父 NS 记录的缓存副本。
如何正确做到这一点?可以采用以下策略(按优先顺序递减):
a) 确保旧 DNS 服务器在转换后至少 48 小时内(父 TTL)继续为您的区域提供服务,但不要太久。实际上,这是我大多数时候使用的方法;旧服务器管理员只需记住在以后删除区域即可。
b) 确保旧的 DNS 服务器允许递归查询(至少针对您的区域,并且至少持续 48 小时);请注意,某些区域的“官方”DNS 服务器通常允许不是允许递归查询
c) 在移动区域之前,将所有记录的本地 TTL 更改为 96 小时。然后等待 48 小时再进行移动。这样,解析器通常应该在缓存中保存一份 DNS 记录副本,该副本的保存时间比过时的 NS 记录更长。这种方法并不完美,而且会出现问题,尤其是当域之间存在“交叉引用”或记录的查询频率低于主记录时。
d) 或者,在移动区域之前减少父母TTL 为 1 小时(或您认为可以接受的尽可能多的停机时间),等待 48 小时并进行移动。但是,可能无法在父区域中将 TTL 更改为如此低的值。(他们不想如此频繁地被查询)即使如此,您也必须考虑他们的区域更新时间表