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


29

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

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

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary

Answers:


26

主机文件不提供这种机制。如果您列出两个具有相同名称的IP,则仅使用第一个。因此,不存在主IP和辅助IP。

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


在OP问题中编辑了标题和命名,以消除对URL /主机的混淆。
dmourati

14

您无法通过该/etc/hosts文件提供弹性或轮询负载平衡-并非为此目的而设计的。

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

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

DNS循环负载平衡通常没有弹性。选择一个,不尝试其他。
AnttiRytsöläCircles请参阅2012年

另一个选择是使用netcat或其他软件将连接转发到IP。如果一个IP丢失,则更改转发。
AnttiRytsöläCircles请参阅2012年

1
@anttiR DNS RR本身没有弹性,但是可以通过托管DNS服务提供商使用。我已经编辑了答案,并给出了一些示例以使其更加清晰。
Ben Lessani-Sonassi 2012年

我怀疑它与数据库一起使用是否会很好。他们倾向于获取并坚持使用一个IP。另一方面,互联网网站会很好用。
AnttiRytsöläCircles请

那将取决于主机的解析器。如果将DNS解析器设置为非缓存服务-或直接轮询DNS注册器数据库,则它将起作用。但是就像我说的那样,这不是一个好主意,它只是一个主意
Ben Lessani-Sonassi 2012年

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

上面的脚本为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

最后,将此脚本放置在根目录的crontab中,使其每隔一个小时左右运行一次,您现在将获得一个/ etc / host轮询。

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


dns缓存不会减轻每分钟数百次查找的麻烦吗?
Xalorous

我不控制DNS服务器,这是我可以在CentOS Web服务器上设置的东西吗?
Satalink


0

是的,它将起作用。

但是,搜索机制只是执行列表,直到找到匹配项。

因此,尽管所写问题的答案为是,但这将是一个挑战。但是没有什么是无法克服的。

尝试以下操作:每个IP地址确实确实需要具有不同的名称。


1
不,这行不通。在/ etc / hosts中第二次出现值将永远不会被使用。而且,如果他用另一个主机名重命名了第二个IP地址,那么现在他必须在自己的应用程序中执行一些操作来进行负载平衡。如果DNS或DNS +负载平衡器是正确的答案,那将是昂贵且费力的。
Xalorous

0

实现此目标的简单方法是仅使用公共DNS服务,例如AWS Route53。您可以为每个A记录输入多个IP地址,并具有优先级

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

只要不涉及任何证书,就可以正常工作,甚至不违反任何规范或最佳实践。

NSLookup或其他域查询将返回两个地址。您的应用需要能够处理此问题。是的,该域需要是一个公开注册的域,而不仅仅是本地主机名。


浏览器将能够处理此问题,如果10个不可用,它将回退到20个。这肯定取决于应用程序,并且还应该在其中检查可用性-如果您想绕开设置更复杂的内容且负载平衡价格昂贵。
bortran

A记录没有优先级字段。一些权威的DNS服务具有记录权重,但这是通过概率地包括或排除记录来完成的。
Matt Nordhoff

0

易于设置,请按照说明进行操作:

  1. 安装dnsmasq
  2. 编辑/etc/resolv.conf并将“名称服务器127.0.0.1”设置为第一个DNS
  3. 添加普通DNS作为替代(例如Google)第二行“ nameserver 8.8.8.8”
  4. 确保/ etc / hosts文件中有两个必需的记录
  5. 现在,请检查命令主机abc.efg.datastore.com

    ,该命令应使用RR-DNS响应两条记录,因此,如果列表中的一个节点处于关闭状态-您的应用程序将连接到另一个

1
IP堆栈在咨询DNS之前会自动检查主机文件。我相信它是IP定义的一部分,但是我知道Windows和Linux都遵循这种模式。他不需要dnsmasq,并且如果以这种方式更改/etc/resolv.conf,则将失去与真实DNS服务器的连接。
Xalorous

不正确,他可以在resolv.conf中放入多行,因此下一行可以是“ nameserver 8.8.8.8”,例如,+ nscd用于缓存现有记录,这种方法正好解决了所描述的问题
Ihor Kolodyuk,

那不是你告诉他要做的。您告诉他将他的名称服务器设置为回送。您没有说将回送添加为名称服务器。但是,如果主机未运行命名的主机,或者即使主机未运行命名主机,也没有在回送上侦听,则对该地址的dns查询将无法得到答复。只需将地址添加到hosts文件中即可解决这些问题,但是如果它们具有相同的主机名,则只会使用第一个,我们将从头开始。答案是在具有加权别名的DNS中设置虚拟主机,或者在数据库中使用负载平衡器。
Xalorous

正是我告诉他的,dnsmasq充当了域名服务器代理。这种方法有效。
Ihor Kolodyuk,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.