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

Mik*_*e T 37 networking linux hosts

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

这对我的主机文件有用吗?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
Run Code Online (Sandbox Code Playgroud)

Kha*_*led 29

hosts 文件不提供这种机制。如果您为同名列出两个 IP,则只会使用第一个。因此,没有主 IP 和辅助 IP 之类的东西。

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

  • 这不是事实,至少不是一概而论。如果使用了主机文件并且有多个条目,我见过的每个解析器都会_返回_所有这些条目给程序,就像 DNS 服务器返回多个 A 或 AAAA 记录时一样。_program_ 的作用各不相同——有些仅使用第一个条目,有些则执行更复杂的操作,这些操作可能符合也可能不符合用户的需求。 (2认同)

Ben*_*ani 16

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

相反,您的选择是...... (没有特别的顺序)

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


Sat*_*ink 5

/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
Run Code Online (Sandbox Code Playgroud)

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

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

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin
Run Code Online (Sandbox Code Playgroud)

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

如果您有一个编码页面从 API 中提取一些数据,并且 API 服务器的 DNS 查找导致页面脚本执行中出现大量挂起时间,则此功能特别有用...从而导致 CPU 消耗过高,否则会导致 CPU 消耗过高看起来是一个简单的页面。为了避免代价高昂的 DNS 查找(特别是如果您的站点每分钟执行数百次查询导致流量很大),您应该使用 /etc/hosts 来解析远程 API 服务器的 FQDN。这将大大减少拉取 API 数据和生成页面的 CPU 使用率。