一个主机名,多条 A 记录
第 1 个答案
93.184.216.34
第 2 个答案
93.184.216.35
第 3 个答案
93.184.216.36
解析器会返回所有记录,通常按轮换顺序
为什么一个域名会有多个 IP 地址
查询一个大型网站,常常会返回三个、四个甚至八个地址。换到另一个国家再查一次,列表可能完全不同。造成这种现象的有四种不同的机制,它们的含义也大相径庭。
一个主机名,多条 A 记录
第 1 个答案
93.184.216.34
第 2 个答案
93.184.216.35
第 3 个答案
93.184.216.36
解析器会返回所有记录,通常按轮换顺序
1. DNS 轮询
最简单的做法:为同一个名称发布多条 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 工具。
常见问题
相关阅读
为什么查询结果显示的是 CDN,而非源站
访客
查询该域名
CDN 边缘节点
104.21.x.x
DNS 返回的就是它
源站服务器
真实 IP,从不暴露
为什么 CDN 会隐藏源站 IP,而且这正是用意
查询一个域名,却得到了 Cloudflare 的地址?这说明系统运转正常。下面讲讲它背后是什么,以及您为什么看不穿。
几乎每个 DNS 区域都会遇到的记录
什么是 DNS A 记录?何时需要 AAAA 记录
真正把您的域名指向服务器的那条记录:它的结构、对应的 AAAA 记录,以及最容易让网站出故障的四个错误。
一次递归 DNS 查询,逐跳详解
浏览器
想访问 example.com
解析器
运营商 / 1.1.1.1
根 + TLD
谁负责 .com?
权威服务器
真正的答案
这条链路上的每一跳本身都是一次 DNS 查询,之后都会被缓存
DNS 如何工作:从域名到 IP 地址
互联网的电话簿,从头到尾追踪一遍:从输入域名,到第一个数据包抵达服务器,这短短几毫秒里究竟发生了什么。