AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 774385
Accepted
Naftuli Kay
Naftuli Kay
Asked: 2016-05-03 11:34:05 +0800 CST2016-05-03 11:34:05 +0800 CST 2016-05-03 11:34:05 +0800 CST

客户端通常会在多个 A 记录上实现故障转移/负载平衡吗?

  • 772

通常,像 Amazon 的弹性负载均衡器这样的负载均衡器使用具有多个 A 记录的 DNS 记录集来提供多个负载均衡器实例,这些实例可以处理到请求端点的流量:

$ dig +short my-fancy-elb.us-east-1.elb.amazonaws.com
10.0.1.1
10.0.1.2

如果我尝试以详细模式卷曲此 URL,我注意到这curl似乎是对两个 IP 地址的循环尝试:

$ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected'
* Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.1)
$ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected'
* Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.2)

curl对记录集中描述的 A 记录进行循环处理的事实是由curl二进制文件本身完成的,还是 Linux 内核为它做的事情?

TCP 存在于第 4 层,DNS 存在于第 7 层,所以我想各个二进制文件和库必须实现自己的负载平衡和故障转移:获取给定域名的 DNS 记录集并选择一个 TCP 地址从该集合连接到。

我可以合理地期望像 curl 这样的编程语言、浏览器和库会为我在 A 记录上进行负载平衡和故障转移吗?

domain-name-system tcp
  • 4 4 个回答
  • 2155 Views

4 个回答

  • Voted
  1. Best Answer
    Andrew B
    2016-05-03T13:24:07+08:002016-05-03T13:24:07+08:00

    简短的回答是它会有所不同。

    当答案集中存在多个地址记录时,被查询的 DNS 服务器通常以随机顺序返回它们。操作系统通常会按照接收到的顺序将返回的记录集呈现给应用程序。也就是说,交易双方(名称服务器和操作系统)都有可能导致不同行为的选项。通常不使用这些。/etc/gai.conf例如,在基于 glibc 的系统上,一个鲜为人知的文件控制着这一点。

    Zytrax 书(火箭科学家的 DNS)很好地总结了这个主题的历史,并得出结论认为RFC 6724是应用程序和解析器实现应该遵守的当前标准。

    从这里值得注意的是来自 RFC 6724的选择引用:

       Well-behaved applications SHOULD NOT simply use the first address
       returned from an API such as getaddrinfo() and then give up if it
       fails.  For many applications, it is appropriate to iterate through
       the list of addresses returned from getaddrinfo() until a working
       address is found.  For other applications, it might be appropriate to
       try multiple addresses in parallel (e.g., with some small delay in
       between) and use the first one to succeed.
    

    该标准鼓励应用程序在失败时不要停在第一个地址,但这既不是要求,也不是许多随意编写的应用程序将要实现的行为。除非您确定更大(或至少最重要)百分比的使用应用程序会很好地发挥作用,否则您永远不应仅仅依靠多个地址记录来实现高可用性。现代浏览器往往在这方面做得很好,但请记住,它们不是您要处理的唯一消费者。

    (另外,正如@kasperd 在下面指出的那样,区分这在 HA 和负载平衡中给您带来的好处很重要)

    • 10
  2. Sven
    2016-05-03T11:51:04+08:002016-05-03T11:51:04+08:00

    我的猜测是记录的 DNS TTL 设置得非常低,curl每次都需要重新解析,并且会从 DNS 服务器获取另一个 IP。

    无论curl是内核还是内核都完全不知道这种 DNS 级别的负载平衡发生了,你不能合理地期待这样的事情。

    • 4
  3. Fedor Piecka
    2016-05-03T12:34:38+08:002016-05-03T12:34:38+08:00

    基本的事情是 DNS 服务器通常以伪随机方式循环记录。

    fedor@piecka:~$ dig +short @ns1.yahoo.com yahoo.com
    206.190.36.45
    98.138.253.109
    98.139.183.24
    fedor@piecka:~$ dig +short @ns1.yahoo.com yahoo.com
    98.139.183.24
    206.190.36.45
    98.138.253.109
    fedor@piecka:~$ dig +short @ns1.yahoo.com yahoo.com
    98.139.183.24
    98.138.253.109
    206.190.36.45
    

    在 curl 的情况下,它有自己的 DNS 解析库,它尊重服务器呈现的顺序。

    在https://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/上有一个关于这个主题的故事。那里也提到了 curl 的实现。

    • 1
  4. Danish Rizvi
    2017-01-24T17:27:09+08:002017-01-24T17:27:09+08:00

    curl 对记录集中描述的 A 记录进行循环是由 curl 二进制文件本身完成的,还是 Linux 内核为它做的事情?

    两者都不。它通常是更改 IP 地址的 DNS 服务器。curl 库需要解析主机名以获取每个请求的 IP 地址。它将请求发送到 DNS 服务器,该服务器发回 IP 地址列表。DNS 服务器也可以在同一台机器上进行本地缓存。大多数 DNS 服务器会在每个请求中轮换 IP 列表。因此,随着列表的顶部 IP 发生变化,您在每个请求中都会获得不同的 IP。如果您从一台 linux 机器上 ping www.google.com,您可能每次都会看到不同的地址。

    客户端通常会在多个 A 记录上实现故障转移/负载平衡吗?

    我使用 curl 进行了测试以通过 http 获取文件。当第一个 IP 不可访问(故障转移)时,Curl 能够使用另一个 IP 重试。所以'故障转移'正在使用 curl 处理 http 请求。

    • 1

相关问题

  • Solaris DNS

  • resolv.conf 在经过一段时间后被更改

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve