DNS Round Robin:只要在线,浏览器是否会坚持使用一个IP?


14

如果大多数浏览器从DNS服务器获得多个A记录,它们的行为如何?是否会坚持使用一个IP只要它可以访问(并且仅在IP断开时才使用另一个IP)?还是他们一直无故切换?

如果大多数当前的浏览器都使用一个IP,那么DNS-RR作为简单的故障转移解决方案对我来说就足够了。


1
我无法直接回答您的问题,但我会向您指出,您必须同时处理浏览器和操作系统级别的缓存!玩得开心:)
SpacemanSpiff 2012年


1
@Iain-很棒的链接
SpacemanSpiff

后端有几台计算机?如果两台具有主动-被动功能的计算机都可以,请获取第三个IP地址,然后使用心跳在物理计算机之间进行故障转移。另外,我认为ultramonkey支持基于源IP分配后端,这与单个客户端几乎相同。您可能还可以通过使每个后端都设置一个唯一的cookie,并根据cookie来为后端配置一个前端Web服务器代理,来一起破解某些东西。(Apache的mod_rewrite可能可以做到。)
2012年

有一个涵盖所有的浏览器没有单一的规则,因此在最起码你需要指定哪一个/那些你感兴趣的问题。
约翰哈德尼斯

Answers:


7

每个浏览器都有自己的处理循环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都是有效的工作端点(如果可达)


2

编辑:自HiPerFreak教我以来,一直在编辑我的答案。

DNS服务器将返回给定主机名的所有A记录的列表。轮循机制的出现是它轮换列表的排序方式。莱恩发布的链接很好地说明了网络浏览器将如何使用该列表。

循环可用于一种非常原始的负载平衡形式,但对于真正的负载平衡而言却是非常差的替代,因为如果循环中的主机之一出现故障,DNS服务器将不再是明智之选,并且仍然会将关闭的节点的IP地址放入列表中。


DNS服务器始终分发所有地址。浏览器是由谁来决定使用哪个浏览器的(这在这里和其他地方多次使用)。另外,操作系统会将所有IP传递给浏览器。
HiPerFreak 2012年

2
@HiPerFreak经常看到的配置(特别是对于大量的A记录)是DNS分发一些地址(尽管不是全部,通常是为了确保它们适合512字节的UDP数据包并且不会产生不必要的开销) ,通常顺序会变化。
the-wabbit 2012年

我正在考虑2或3个IP。
HiPerFreak 2012年

@HiPerFreak:我只是想说您是对的,如果该名称存在多个A记录,则DNS服务器在查询名称时会分发所有A记录。我有一个DNS服务器,并且在ping主机名进行确认时刚刚通过Wireshark捕获了数据包。谢谢-我今天学到了一些东西!:)
Ryan Ries 2012年

2

看到我的问题(和答案):浏览器如何处理多个IP

很快-循环DNS根本无法提高可用性。浏览器选择一个IP并坚持下去,即使它没有响应也是如此。(用FF和镀铬检查)。

浏览器dns缓存过期后,无论IP是否应答,主机名都会再次解析并重复该过程。

对于基本的HA,您可以使用动态DNS或各种基于IP的方法。

编辑:当无法访问的主机充当“黑洞”时,将发生此行为。相反,如果主机主动拒绝传入的连接,浏览器将尝试一个ip,拒绝并立即使用另一个ip,这样它将很好地进行故障转移。


2
也许这在最近几年发生了变化,但是我可以确认,在Firefox中进行多次刷新后,IP确实发生了变化,尽管变化并不频繁。可能这个答案已经过时了吗?
Yeti

我的研究(从2015年开始)是Chrome,Firefox和MSIE的行为不如Sandman4所述。MSIE的显着不同之处在于,如果第一个失败,则在尝试连接到列出的下一个地址之前,它需要完整的TCP超时。
symcbean

0

他们切换IP,这不是故障转移解决方案。

浏览器允许操作系统进行名称解析,例如Linux总是随机分配IP地址,请尝试多次托管google.com。IP将以随机顺序出现。


他们为什么无缘无故地这样做呢?只要运行中的IP可以重用,就有意义吗?
HiPerFreak 2012年

1
它用于负载平衡。
Stone


@HiPerFreak:之所以不坚持使用已知的IP,是因为名称解析不知道该IP是现在有效还是过去有效。浏览器不会只使用一个IP,因为名称解析告诉它使用不同的IP。:-)
肖恩·赖夫施耐德

@Sean:正如在问题解答中所讨论的那样,名称解析为浏览器提供了所有IP,然后浏览器决定使用哪个IP。浏览器知道哪些IP起作用了,哪些不起作用。因此,这不是原因。
HiPerFreak 2012年

0

DNS返回列表中的所有IP,但它们会更改列表的顺序,并且此顺序不是随机的,也不会在1失败时更改,但出于负载平衡的原因,它们始终以相同的顺序返回IP。当浏览器收到列表时,我想它会在列表中选择第一个(如果不称为无效)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.