我有一个通过 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
- 它不是为此目的而设计的。
反而,您的选择是......(无特定顺序)
- 正确配置网络,以便在链接断开时路由发生变化
- 使用托管服务(例如 loaddns.com 或 dnsmadeeasy.com 等)进行 DNS 循环负载平衡(这不是一个好主意TM )
- 使用本地 L3 负载均衡器处理出站流量(HAProxy?),并根据需要定义后端
- 增强 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 中与主机名相关的所有条目,而不是在第一个条目处停止。