我们的 NS 记录中列出了两个 DNS 服务器。昨晚,我们的一个 DNS 服务器宕机了。正如预期的那样,一些 DNS 服务器无法解析我们的主机名。我以为这只是暂时的,一旦我们的 NS 记录的 TTL 到期(1 小时),问题就会解决。
一个多小时后,我仍然在使用 Earthlink、Verizon 和 OpenDNS 服务器的台式机上收到 DNS 超时。我测试了一下其他 DNS 服务器是否在应答:
dig @ns2.example.com www.example.com +short
这有效。
我的问题:
- 有谁能回答为什么即使 TTL 过期后其他 DNS 服务器也没有访问我们的其他 DNS 服务器?
- DNS 服务器是否更喜欢域的主 DNS 服务器(来自记录
SOA
)? - 是否有任何算法可用于从可用的 NS 记录中选择名称服务器?我假设这是特定于实现的,但也许有一些标准适用于此处。
答案1
这真是令人恼火。多个 DNS 服务器本应提高可靠性,但实际上却常常产生相反的效果。
问题在于,客户端等待响应的时间有限,而服务器等待的时间也差不多。假设您有两个 DNS 服务器,A 和 B。假设 A 正常运行,而 B 发生故障。会发生以下情况:
客户端连接到名称服务器 Z 并向其询问信息。Z 选择 B 并发送查询。
客户端超时,因为名称服务器 Z 没有响应。
客户端尝试名称服务器 Y。Y 选择 B 并发送查询。
名称服务器 Z 超时并尝试 A。它得到了正确答案,但客户端不再等待。
客户端超时,因为名称服务器 Y 没有响应。
由于两个名称服务器均无法响应,客户端放弃。
名称服务器 Y 超时并尝试 A。它得到了正确答案,但客户端不再等待。
而且也没有好的解决方案。等待名称服务器回复的时间越长,您需要等待的时间就越长,因为您等待的名称服务器本身等待的时间更长。可以说,问题在于 Y 和 Z 没有足够快地放弃 B。
本质上,如果您的任何一个名称服务器出问题了,那么一些客户端就会因为运气不好而超时,因为他们只尝试了坏的服务器。
从好的方面来看,如果您有两个名称服务器,其中一个出现故障,那么大约 75% 的名称服务器将得到答复,而不是 0%。