将多个 IP 分配给 hosts 文件中的 1 个条目

将多个 IP 分配给 hosts 文件中的 1 个条目

我有一个通过 VPN 连接到内部数据库的 Web 服务器。Web 服务器到数据库有 2 个 IP(主 IP 和辅助 IP)。如何设置我的 /etc/hosts 文件,以便在主 IP 不可用时使用辅助 IP?

这对我的 hosts 文件有用吗?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary

答案1

hosts 文件不提供这种机制。如果您为同一个名称列出两个 IP,则只会使用第一个。因此,不存在主 IP 和辅助 IP。

此外,hosts 文件不处理 URL。它只处理问题中提供的名称。URL 包含完整路径和协议,例如http://host/path/to/resource

答案2

您无法通过文件提供弹性或循环负载平衡/etc/hosts- 它不是为此目的而设计的。

反而,您的选择是......(无特定顺序)

  1. 正确配置网络,以便在链接断开时路由发生变化
  2. 使用托管服务(例如 loaddns.com 或 dnsmadeeasy.com 等)进行 DNS 循环负载平衡(这不是一个好主意TM )
  3. 使用本地 L3 负载均衡器处理出站流量(HAProxy?),并根据需要定义后端
  4. 增强 Web 应用程序本身的弹性

答案3

/etc/hosts 不支持循环,但您可以编写一个简单的 bash 脚本来用 sed 替换带有 #RoundRobin 注释标记的条目(或您希望使用的任何其他标记,只需在脚本中的 grep 行中反映它即可)。

#!/bin/bash
fqdnips=( $(nslookup sub.domain.com|grep Address:|awk -F\  '{ print $2 }'|grep -v '#') )

new=`printf "${fqdnips[@]}"`
old=`grep "#RoundRobin" /etc/hosts|awk -F\  '{ print $1 }'`
sed -i "s/$old/$new/g" /etc/hosts

上述脚本抓取 nslookup 对 sub.domain.com 的输出并将其存储在数组中。然后它将最上面的值打印到 $new 并抓取在 /etc/hosts 中分配的标签 #RoundRobin 的现有值...最后,它执行 sed 替换

/etc/hosts 文件条目如下所示

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin

最后,将此脚本放在根的 crontab 中,每小时左右运行一次,现在您将拥有一个 /etc/host 循环。

如果您有一个编码页面,该页面正在从 API 中提取一些数据,并且 API 服务器的 DNS 查找导致页面脚本执行中出现大量挂起时间,这将特别有用……导致原本看似简单的页面的 CPU 消耗很高。为了避免昂贵的 DNS 查找(特别是如果您的网站每分钟进行数百次查找,因为流量很大),您应该使用 /etc/hosts 来解析远程 API 服务器的 FQDN。这将大大减少提取 API 数据和生成页面的 CPU 使用率。

答案4

请注意,至少在 macOS 上,与其他答案所说的相反,系统解析器将返回 /etc/hosts 中与主机名相关的所有条目,而不是在第一个条目处停止。

相关内容