Domain IP Lookup

一个主机名,多条 A 记录

第 1 个答案

93.184.216.34

第 2 个答案

93.184.216.35

第 3 个答案

93.184.216.36

解析器会返回所有记录,通常按轮换顺序

基础设施与运维

为什么一个域名会有多个 IP 地址

4 分钟阅读

查询一个大型网站,常常会返回三个、四个甚至八个地址。换到另一个国家再查一次,列表可能完全不同。造成这种现象的有四种不同的机制,它们的含义也大相径庭。

一个主机名,多条 A 记录

第 1 个答案

93.184.216.34

第 2 个答案

93.184.216.35

第 3 个答案

93.184.216.36

解析器会返回所有记录,通常按轮换顺序

一个主机名,多条 A 记录。解析器会把它们全部返回,通常按轮换的顺序。

1. DNS 轮询

最简单的做法:为同一个名称发布多条 A 记录。解析器按轮换的顺序返回它们,于是不同的客户端会优先尝试不同的服务器。

同一个名称上的三条 A 记录
example.com.    300    IN    A    93.184.216.34
example.com.    300    IN    A    93.184.216.35
example.com.    300    IN    A    93.184.216.36

它无需任何基础设施就能分配负载。但它的局限也很严重:DNS 没有健康检查。如果其中一台服务器宕机,它的地址仍会继续被分发,直到有人手动删除这条记录,大约三分之一的访问者会因此遇到失败。

2. 地理路由(GeoDNS)

在这种方式下,权威域名服务器会检查查询来自哪里,并返回与该位置相适应的应答。欧洲的访问者得到的是法兰克福的地址,亚洲的访问者得到的是新加坡的地址。

这就是为什么两个人在同一时刻查询同一个域名,会合理地得到不同的答案。两者都没有过期,也都没有错,因为域名服务器就是有意给出了不同的回复。

核心要点

使用地理路由时,域名并不存在唯一正确的答案。答案取决于是谁在询问,以及从哪里询问。

3. Anycast(任播)

Anycast 是四种方式中最优雅的一种,完全在 DNS 之下的层面工作。同一个地址会同时从多个位置通告,而互联网路由会把每个数据包送到网络意义上最近的那个位置。

地理路由Anycast
工作层面DNS 层路由层(BGP)
返回的地址因地区而异始终相同
故障切换速度需等待 DNS TTL数秒,路由会重新收敛
能否在查询中看出?能,应答各不相同不能,看起来就是一个普通地址

1.1.1.1 就是众所周知的例子:全球各地都是同样的四个数字,背后却由数百个独立的数据中心提供服务。DNS 查询看不出 Anycast,而这正是它如此有效的原因。

4. 双栈:A 与 AAAA 同时存在

这是最常见、也最不起眼的原因。同时发布 IPv4 和 IPv6 的域名会把两者都返回,客户端选择自己支持的那一种。

根本不是负载均衡,而是两个地址族
example.com.    3600    IN    A       93.184.216.34
example.com.    3600    IN    AAAA    2606:2800:220:1::248

双栈客户端通常优先使用 IPv6,失败时回退到 IPv4。请参阅 A 和 AAAA 记录。

客户端如何处理这份列表

拿到多个地址只是故事的一半,接下来会发生什么由客户端决定,而如今的行为比过去聪明得多。

相关的机制是 Happy Eyeballs,定义在 RFC 8305 中。浏览器同时拿到 IPv6 和 IPv4 地址时,不会先尝试一个、等到超时后再尝试另一个。它会先发起 IPv6 连接,等待一小段时间(通常约 250 毫秒),如果还没有连上,就并行发起 IPv4 尝试。先完成的获胜,另一个则被丢弃。

实际的结果是,列表中的某个失效地址只会降低速度,而不会导致彻底失败。这只是一张安全网,而不是可以放任不管的理由:失效的地址仍然会让每位访问者在回退之前白白等待一段时间。

当 DNS 不是合适的工具时

人们常常想用 DNS 轮询来充当负载均衡器。有必要清楚地认识到它做不到什么。

能力DNS 轮询真正的负载均衡器
健康检查没有,宕机的服务器仍留在列表中数秒内移除故障后端
流量加权没有,大致均分可按后端设置权重
会话保持没有支持
故障切换速度需等待 TTL 过期即时
成本免费需要运行或付费使用的一项服务

坦率的总结是:DNS 轮询分配负载尚可,处理故障却很糟糕。如果一台服务器宕机时,不能让相应比例的访问者一并受影响,就需要健康检查,也就是需要负载均衡器、Anycast 服务商,或会执行健康检查并自动撤下故障记录的托管 DNS 服务。

如何区分它们

您观察到的现象最可能的原因
多个 IPv4 地址,每次都一样DNS 轮询
不同国家得到不同的地址地理路由
一个地址,在各地都很快Anycast
点分地址与冒号地址混合出现双栈,并非负载均衡
地址反向解析到 CDN 主机名CDN 边缘节点
从不同解析器查询,以发现地理路由
dig +short example.com @1.1.1.1
dig +short example.com @8.8.8.8

这对您查询域名意味着什么

它改变了您对单个答案应该给予多大分量的判断。

  • 多个地址是健康的表现。它们通常说明存在冗余,而不是配置有误。
  • 您的答案并不通用。使用地理路由或 CDN 时,别处的人看到的是另一个结果,而且两者都是正确的。
  • 不要把它们硬编码。地址会轮换、被替换,也会被重新分配。务必在建立连接时解析名称。
  • 顺序没有任何意义。轮换往往是有意为之,第一个地址并不是主地址。

查询工具会列出它收到的每一条 A 和 AAAA 记录,而不是只显示第一条,因此您可以一次看到完整的已发布记录集,批量模式还能让您方便地并排比较多个域名。

需要查看某个域名的公网 DNS 地址?使用 Domain IP Lookup 工具。

常见问题