域名解析多 IP 就能做到高可用?

2022-10-24 16:18:32 +08:00
 MartinWu

我刚刚做了个测试,测试环境如下:

服务器 A ,IP 192.168.0.3

服务器 B IP 192.168.0.4

两台服务器都启动了一个 http 服务,端口是 7891

然后,我在本地 hosts 文件添加了以下的信息

192.168.0.3  test.com
192.168.0.4  test.com

在这个环境下,我 curl test.com:7891 当然是能访问的。这时候基本上都是访问了 192.168.0.3:7891 了。

curl 的输出符合预期。

然后我现在把 A 的 http 服务关了,超出我预期的情况发生了。curl 依然能返回 http 服务的返回数据。

我 curl -v 看了下,出现了类似这样的信息:

Trying 192.168.0.3:7891...
* connect to 192.168.0.3 port 7891 failed: 拒绝连接*   
Trying 192.168.0.4:7891...
* Connected to test.com (192.168.0.4) port 7891 (#0)

这超出我的意料了。而后我也尝试了下最新版本的 chrome ,也有这样的特性。

这是一直以来所有的 http 客户端都有的特性吗?

2913 次点击
所在节点    程序员
30 条回复
Admstor
2022-10-24 16:36:22 +08:00
不能
多解析实际上更多用在负载平衡里(手段之一)
jifengg
2022-10-24 16:36:37 +08:00
看一些架构师的文章,会提到这个技巧,当你的一个出口负载已经完全无法承载压力了,就让 DNS 服务器来帮你分流吧。
但是,走到这一步的话,要考虑的事情也是很多的。不到迫不得已,没必要这么做。比如数据一致性等。

另一个,“尝试一个 host 下所有的 ip”,应该不是所有 http 客户端的特性,还是要看语言具体的实现的。
MartinWu
2022-10-24 16:37:51 +08:00
@Admstor 不能是指什么?
Admstor
2022-10-24 16:40:47 +08:00
你这个只是本机测试,你感觉可以用
但是放到线上环境
你的客户的并不一定支持尝试其他解析 IP
此外你的业务也不可能是单一页面单一节点
MartinWu
2022-10-24 16:41:23 +08:00
@jifengg 所应该是刚好我测试的 curl 和 chrome 这两个 http 客户端有这个特性了。了解。
Seulgi
2022-10-24 16:42:18 +08:00
这不是客户端的功能. 这是 dns 解析服务器的功能. 云服务厂商都提供了这个服务, dns 可以解析多个 ip, 而且可以指定入网的 ip 段来制定解析对应的 ip, 具体就是我指定联通网请求 dns 返回 123 的 ip, 电信网请求 dns 返回 456 的 ip.
eason1874
2022-10-24 16:50:40 +08:00
浏览器在好多年前就会自动切换了,多 IP 的网站,浏览器访问一个 IP 超时之后,自动刷新使用到下一个 IP

但是 DNS 解析多个 IP 一般只用来做负载均衡,不用来做高可用,因为超时要等待好几秒,用户有可能还没等到切换 IP ,就以为网站打不开从而关掉页面了
MartinWu
2022-10-24 16:51:38 +08:00
@Admstor 不是,我只是第一次知道了有些 http 客户端有此特性,因此想求证下此特性是否是一个比较旧的 http rfc 了。 还不打算用于线上环境的。
MartinWu
2022-10-24 16:52:31 +08:00
@eason1874 了解。。这个超时是 dns 服务器决定的,还是客户端自身决定的?
MartinWu
2022-10-24 16:58:59 +08:00
@Seulgi 你说的应该跟我想说的不是一回事。我想说的这个特性,是能够在访问 test.com--> 192.168.0.3 --> 192.168.0.3:7891 拒绝访问时,就切到了 test.com--> 192.168.0.4 --> 192.168.0.4:7891 ,这已经不但但是 dns 协议了,此切换还涉及了 tcp 协议。
isno
2022-10-24 17:00:04 +08:00
看看我写的高可用?
https://isno.github.io/ 下一章节:负载均衡和网关
opengps
2022-10-24 17:05:01 +08:00
这里的目的,是分散可用,从而表现成一种高可用.你的测试仅代表你一个客户端,不适合这个解释。
在公网下很显然全球各地,每个区域都有不同的可用性结论,多 dns 解析可以经过一些逻辑,就近选用 dns
ThirdFlame
2022-10-24 17:05:18 +08:00
这应该是 curl 和 chrome 自己加戏了。
正常情况下,取得解析结果中的某一个结果,例如 192.168.0.3 。 然后尝试连接,如果出错,那就停止。 并没有规定要去尝试其他的解析结果。

另外如果 192.168.0.3 端口能够正常连接,但是返回 500 ,而 192.168.0.4 正常,返回 200 。 这个时候 curl 和 chrome 并不会去尝试连接 192.168.0.4 。

所以仅仅依靠 dns 解析,无法实现高可靠。
eason1874
2022-10-24 17:09:12 +08:00
@MartinWu 客户端吧,而且不同客户端的超时时间不一样,它们也不会特意缓存 IP 有效性,现在 A 超时自动切换到 B ,过一会儿 DNS 缓存失效了,它再次解析再次使用 A 地址也是可能的,然后再等超时再切换
cheng6563
2022-10-24 17:10:44 +08:00
DNS 可以用来做负载均衡,但做不了高可用。
因为 DNS 层层缓存,更新起来非常慢,有些垃圾网络环境甚至一天不更新的。
Ansen
2022-10-24 17:16:23 +08:00
你的 hosts 貌似只第一个生效,你可以 ping 一下看看
MartinWu
2022-10-24 17:21:35 +08:00
@ThirdFlame 你的回答是最直接,最全面解答了我的疑问了。。感谢。
MartinWu
2022-10-24 17:22:26 +08:00
@cheng6563 嗯嗯,这个的确是。
optional
2022-10-24 18:25:28 +08:00
这个只能负载均衡降低单 ip 负载,其它甚至会导致 sSLA 降低
1423
2022-10-24 18:54:32 +08:00
@MartinWu 上面的是错误的。。这不是加戏,是按文档的规范行为

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/889418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX