DNS Round Robin:浏览器只要在线就坚持一个IP吗?

HiP*_*eak 19 domain-name-system failover high-availability round-robin

如果大多数浏览器从 DNS 服务器获得多个 A 记录,它们会如何表现?只要可以访问就坚持使用一个IP(并且只有在IP关闭时才使用另一个)?或者他们总是无缘无故地切换?

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

Jac*_*ans 12

每个浏览器都有自己的处理循环 DNS 的方法,我今天花了一些时间研究这个问题,并将继续更新我的答案,因为我找到了实施证明,这将限制我对暴露其行为的浏览器的答案。

谷歌浏览器

谷歌浏览器(使用 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/Routing技巧等,使用它们

一旦有足够的基础设施可供测试,所有在仅 IPv4 环境中执行的测试将返回双栈结果。

我推测这些变化是 IPv6-Fallback RFC Happy Eyeballs的副作用

更新 一个有用的考虑,RR DNS 只能协助负载平衡,而不是应用程序故障,如果您的一个节点有 503,如果您的流量为 503,您将提供 40-60% 的服务。假设列出的所有 IP 都是有效的工作端点(如果可达)


use*_*895 8

所有现代浏览器均实现此 https://www.rfc-editor.org/rfc/rfc8305 Happy Eyeballs 版本 2:使用并发实现更好的连接

粗略地说,这意味着将使用连接速度最快的服务器。IPv6 具有更高的优先级。

  • 截至 2020 年 12 月。是的,HE v1 很久以前就已经实现了,但我正在写有关 HE v2 的文章,它于 2017 年 12 月获得批准。一年前的 2019 年底,HE v2 尚未在 Chrome 中实现。但现在它起作用了。HE v2 意味着将选择 ping 最近的服务器 IP 进行连接。如果 IP 关闭,将尝试下一个服务器。在 IP 下,我指的是 IPv6 和 IPv4,其中 IPv6 优先。我做了一些实验,我可以确认至少现代 Chrome、Firefox 和 Opera 总是选择 ping 最近的服务器。2019年底Chrome选择了随机IP地址 (3认同)

Sto*_*one 0

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

浏览器让操作系统进行名称解析,例如 Linux 总是随机化 IP 地址,尝试主机 google.com几次。IP 将以随机顺序出现。

  • 顺序随机化实际上发生在 DNS 服务器上,而不是客户端上。 (2认同)