假设我为给定域提供了 2 个 IP(循环 DNS)。
如果其中一个 IP 没有响应,客户端会尝试连接到另一个 IP 吗?或者它们将无法与域建立通信?
答案1
DNS 轮询不能很好地替代负载平衡器。DNS 服务器将继续分发发生故障的节点的 IP,因此部分用户可以使用您的服务,而部分用户则无法使用。
当客户端进行 DNS 查询时,DNS 服务器返回全部与该名称关联的 IP 地址。DNS 服务器会针对每个查询轮换该列表的顺序,从而实现这一神奇效果。但是,应用程序必须实现“遍历”列表直至找到可用的 IP 的功能。有些应用程序不会这样做。
奇怪的是,Windows Telnet 就是这样一个应用程序,它足够聪明,可以遍历返回 IP 的链接列表。例如,如果您尝试 telnet 到 google.com,您可以亲自看到这种行为。您会注意到它需要长的最终失败。这是因为 google.com 有很多 IP 地址,而 telnet 客户端正在尝试每一个。
答案2
使用负载均衡器仍然会留下单点故障。如果您的负载均衡器离线,您的网站就会瘫痪。
与上述答案相反,大多数 HTTP 客户端已经做支持尝试 DNS 查询返回的每个 IP 地址,直到有一个 IP 地址返回有效响应。请参见此处:
http://blog.engelke.com/2011/06/07/web-resilience-with-round-robin-dns/
看来作者已经测试了以下浏览器并发现它们运行良好。
Windows 7 上的 Chrome 11 Windows 7
上的 Firefox 4.0 Windows 7
上的 Internet Explorer 8 Windows 7
上的 Opera 11 Windows 7
上的 Safari 5
Windows XP 上的 Internet Explorer 7(明显延迟后)
Windows XP 上的 Firefox 4.0(明显延迟后)
Android 2.3.3 上的 Android 原生浏览器
iOS 4.3.3 上的 iPhone 原生浏览器
使用循环法无法实现负载平衡服务器的所有功能,例如能够监控两台服务器的响应时间,如果另一台服务器的响应速度不够快,则将更多流量路由到其中一台服务器。从弹性方面来说,我认为循环法 DNS 可能是一种更好的解决方案,因为不再存在单点故障。
答案3
虽然循环 DNS 通常不会对其提供地址的服务器的状态提供反馈,但是如果您为每个地址配备某种负载平衡器(包括基于路由器的技巧),则可能会有所帮助。
当出现故障时,有一些技巧可以更新 DNS;如果发生这种情况,具有适当短 TTL 的循环 DNS 可以作为伪负载平衡器。