大多数浏览器如果从DNS服务器获取多个Alogging,其行为如何? 只要可以访问,就坚持一个IP(如果IPclosures,只能使用另一个IP)? 或者他们无时无刻都在切换?
如果大多数当前的浏览器都支持一个IP,那么DNS-RR就足够了,作为一个简单的故障转移解决scheme。
看到我的问题(和答案): 浏览器如何处理多个IP 。
不久之后 – 循环赛DNS并没有提高可用性。 浏览器select一个IP并坚持,即使它没有响应。 (检查FF和铬)。
一旦浏览器的DNScaching过期,主机名再次解决,重复这个过程,无论IP是否回答。
对于基本的HA,您可以使用dynamicDNS或各种基于IP的方法。
编辑:这种行为将发生时,无法访问的主机充当“黑洞”。 如果主机拒绝传入连接,浏览器将尝试一个IP,拒绝并立即使用另一个IP,因此它将很好地进行故障切换。
编辑:编辑我的答案,因为HiPerFreak教育我。
DNS服务器将返回给定主机名的所有Alogging的列表。 轮stream进来的地方在于轮stream如何sorting。 发布的链接是Web浏览器如何使用该列表的一个很好的例子。
轮循机制可以用于一种非常原始的负载均衡forms,但是对于真正的负载平衡来说,这是一个非常糟糕的替代scheme,因为如果轮转机制中的一台主机出现故障,DNS服务器将不会变得更加智能把closures节点的IP地址放在列表中。
每个浏览器都有它自己的处理循环DNS的方法,今天我花了一些时间研究这个问题,并将继续更新我的答案,因为我find了实现的certificate,这将限制我的答案揭露他们的行为的浏览器。
谷歌浏览器
谷歌浏览器(v58使用)将请求一个地址(A,AAAA,CNAME)的所有主机条目,并把它们放入一个数组( address_list )。 然后,Chrome将尝试从第一个到最后一个顺序在每个IP地址上打开一个套接字,而chrome不会尝试最快或最近的IP,它假定第一个IP(由上游dnsparsing器给出)是最好的IP。 在我的testing中,bind和windows dns服务器每个查询都给出了不同的IP顺序,给每个IP带来50/50的带宽分配。 这个function在chrome://net-internals/#events&q=type:SOCKET%20is:active
curl(libcurl / 7.54.0)
Curl也有这个故障转移function,但是--connect-timeout比chrome默认的要长很多,chrome立即失效,curl不会。 如果你使用libcurl,并希望在一个IP失败的循环的dns实例中生存(在chrome中工作,但不在代码中),一定要把这个值指定为lower。
DEFAULT_CONNECT_TIMEOUT:0让我觉得这是curl不可能的。
* After 149990ms connect time, move on!
在这两个浏览器上 ,IP不是粘性的 ,他们遵循DNS中给出的TTL,一旦ttl过期(chrome内部维护,curl请求每个请求),ipselect每次执行如上所述。
这是什么意思? DNS-RR对于某些系统是可以的,但它不是为故障转移而devise的。 您应该期望从DNS看来的所有结果都是(真相的来源)有效并可用于提供stream量。 有许多方法可以确保IP可用性,例如虚拟浮动IP,BGP /路由技巧等。 使用它们 。
在IPv4环境下执行的所有testing,只要有足够的基础架构可供testing,将会返回双栈结果。
我推测这些变化是IPv6-Fallback RFC Happy Eyeballs的一个副作用
他们切换IP,这不是一个故障切换解决scheme。
浏览器让操作系统做名称parsing,而对于Linux来说,总是随机化IP地址,尝试多次访问google.com 。 IP将随机排列。
DNS返回列表中的所有IP,但它们更改列表的顺序,并且此顺序不是随机的,或者在发生1失败时发生更改,但由于负载平衡原因,它们始终以相同顺序返回IP。 当浏览器收到列表,我想它会select列表中的第一个,如果不知道不工作。