在 Windows 系统中,有此文件C:\WINDOWS\system32\drivers\etc\hosts
。此文件允许我们将特定 IP 地址默认为主机名。
现在的问题是,我是否可以将多个 IP 地址设置为一个主机名。例如,我可以这样做吗:
192.168.244.128 gateway.net
192.168.226.129 gateway.net
并期望浏览器可以解析它们两个,看看哪一个可以起作用并指向那个?
如果没有,还有其他方法可以获得我想要的行为吗?
注意:我在自己的局域网中部署此应用程序,因此不需要互联网。
答案1
通常情况下,您不会使用主机来执行此操作,而是使用 DNS。如果您为区域中的一个名称分配多个 A 记录,大多数 DNS 都会提供所谓的“循环”。
然后,它会执行的操作是,第一个请求通过后会收到192.168.244.128
,下一个请求会收到192.168.226.129
,依此类推。但是,根据设计,您的本地计算机将缓存其 DNS 解析,并且通常会反复使用相同的 IP 地址,直到过期(生存时间,TTL)。
答案2
是的,您可以这样做,我已经用它来测试循环 DNS 场景,而无需实际在 DNS 中输入主机。
当应用程序调用 gethostbyname 时,它会返回完整的 IP 地址列表(可能按随机顺序排列 - 取决于库/操作系统)。
答案3
我认为你的做法是错误的。如果我的假设有误,请告诉我。
设想:
- 您有两台 Windows 服务器运行相同的 Web 应用程序,可能在 IIS 上。
- 您希望您的应用程序具有容错能力,以便如果其中一台服务器出现故障,您的应用程序仍然可用。
- 您希望这种容错功能对浏览器透明,以便用户可以继续使用相同的主机名(即 gateway.net)访问应用程序
你想做的事被称为轮询 DNS(又称穷人负载平衡),但您尝试从客户端执行此操作。即使我刷新 DNS 缓存,这似乎也没有达到预期的效果(至少在我的 Windows XP 机器上)。Windows 将仅解析文件中的第一个 IP。尽管如此,循环 DNS 不具备容错能力,因此这不会帮助您实现想要的效果。
建议的解决方案:
硬件负载均衡器:一些品牌名称是 Alteon、Big-IP、Barracuda。它的作用基本上是为您的用户提供一个单一 IP 来连接,并将请求转发到 Web 服务器。如果其中一个服务器不可用,那么它将不再向其转发流量。这是一个昂贵的选择。
网络负载平衡服务:这是 Windows Server 上提供的 Microsoft 技术,它将为您提供单个集群 IP。它以不同的方式实现与硬件负载平衡器相同的结果。您需要做的就是配置它。
答案4
从http://www.unc.edu/atn/lsf/docs/7.0.5/lsf_config_ref/index.htm?hosts.5.html~main
IPv4 示例
192.168.1.1 主机A 主机B 192.168.2.2 主机A 主机C 主机-C
在此示例中,hostA 有 2 个 IP 地址和 3 个别名。别名 hostB 指定第一个地址,别名 hostC 和 host-C 指定第二个地址。LSF 使用官方主机名 hostA 来标识两个 IP 地址属于同一主机。