如果大多数浏览器从DNS服务器获得多个A记录,它们的行为如何?是否会坚持使用一个IP只要它可以访问(并且仅在IP断开时才使用另一个IP)?还是他们一直无故切换?
如果大多数当前的浏览器都使用一个IP,那么DNS-RR作为简单的故障转移解决方案对我来说就足够了。
如果大多数浏览器从DNS服务器获得多个A记录,它们的行为如何?是否会坚持使用一个IP只要它可以访问(并且仅在IP断开时才使用另一个IP)?还是他们一直无故切换?
如果大多数当前的浏览器都使用一个IP,那么DNS-RR作为简单的故障转移解决方案对我来说就足够了。
Answers:
每个浏览器都有自己的处理循环DNS的方法,我今天花了一些时间研究这个问题,并且随着我发现实现的证据,将继续更新我的答案,这将使我的答案仅限于暴露其行为的浏览器。
谷歌浏览器
Google Chrome浏览器(已使用v58)将请求地址(A,AAAA,CNAME)的所有主机条目,并将其放入数组(address_list)中。然后,Chrome会尝试按从头到尾的顺序打开每个IP地址上的套接字,chrome不会尝试最快或最接近的IP,它假定第一个IP(由您的上游DNS解析器提供)是最佳IP。在我的测试中,bind和Windows dns服务器为每次查找提供不同的IP顺序,从而给每个IP分配了50/50的带宽分配。此功能在chrome://net-internals/#events&q=type:SOCKET%20is:active
卷毛(libcurl / 7.54.0)
Curl也具有此故障转移功能,但是--connect-timeout
比chrome中的默认值长得多,chrome会立即进行故障转移,而Curl没有。如果您使用libcurl并希望保留一个IP失败的循环dns实例的生存能力(适用于chrome,但不适用于代码),请确保将此值指定得较低。
DEFAULT_CONNECT_TIMEOUT:0让我觉得使用curl无法做到这一点。
* After 149990ms connect time, move on!
在两个浏览器上,IP都不是粘性的,它们遵循DNS中给定的TTL,并且ttl过期后(chrome在内部维护该状态,curl在每个请求上询问),如上所述,每次都会执行ip选择。
这是什么意思?对于某些系统,DNS-RR可以使用,但它不是为故障转移而设计的。您应该期望来自DNS查找的所有结果都是(真相的来源)有效且可用于服务流量。有多种方法可确保IP可用性,例如虚拟浮动IP,BGP /路由技巧等。使用它们。
一旦有足够的基础架构可用于测试,则在仅IPv4的环境中执行的所有测试将返回双堆栈结果。
我推测这些更改是IPv6-Fallback RFC Happy Eyeballs的副作用
更新 RR DNS是一个有用的考虑因素,它只能帮助实现负载平衡,而不能帮助应用程序故障,如果您的节点中有一个503,则您的流量为503s时将为40-60%。假设所有列出的IP都是有效的工作端点(如果可达)
编辑:自HiPerFreak教我以来,一直在编辑我的答案。
DNS服务器将返回给定主机名的所有A记录的列表。轮循机制的出现是它轮换列表的排序方式。莱恩发布的链接很好地说明了网络浏览器将如何使用该列表。
循环可用于一种非常原始的负载平衡形式,但对于真正的负载平衡而言却是非常差的替代,因为如果循环中的主机之一出现故障,DNS服务器将不再是明智之选,并且仍然会将关闭的节点的IP地址放入列表中。
看到我的问题(和答案):浏览器如何处理多个IP。
很快-循环DNS根本无法提高可用性。浏览器选择一个IP并坚持下去,即使它没有响应也是如此。(用FF和镀铬检查)。
浏览器dns缓存过期后,无论IP是否应答,主机名都会再次解析并重复该过程。
对于基本的HA,您可以使用动态DNS或各种基于IP的方法。
编辑:当无法访问的主机充当“黑洞”时,将发生此行为。相反,如果主机主动拒绝传入的连接,浏览器将尝试一个ip,拒绝并立即使用另一个ip,这样它将很好地进行故障转移。
他们切换IP,这不是故障转移解决方案。
浏览器允许操作系统进行名称解析,例如Linux总是随机分配IP地址,请尝试多次托管google.com。IP将以随机顺序出现。