![名称服务器的容错能力](https://linux22.com/image/491436/%E5%90%8D%E7%A7%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E5%AE%B9%E9%94%99%E8%83%BD%E5%8A%9B.png)
我有 3 台服务器,每台都运行一个名称服务器和一个网络服务器。今天,其中 2 台服务器宕机了。我以为最后一台服务器会处理此后的所有未来请求,但这种情况似乎只发生一小部分时间。其他时候,请求会超时。
在我的每台服务器上,都有以下区域条目:
ns1 IN A <SERVER IP 1>
ns2 IN A <SERVER IP 2>
ns3 IN A <SERVER IP 3>
example.com. IN A <SERVER IP 1>
example.com. IN A <SERVER IP 2>
example.com. IN A <SERVER IP 3>
www IN CNAME example.com.
我是否应该在每台服务器上只保留 example.com 的单个 A 记录?我希望设置我的服务器,以便当其他服务器发生故障时,任何服务器都可以透明地处理所有请求。
答案1
您设置的是DNS 循环;虽然这将提供负载均衡,它不会提供透明的动态故障转移。这是因为当客户端查询 A 记录“example.com”时,虽然它们将收到所有 3 个服务器 IP,但它们通常会缓存一个 IP,以用于将来与该域名的连接。即使您将区域的 TTL 设置为较低,在公共互联网上,您也无法控制您和您的客户端之间有多少个缓存解析器,更不用说客户端计算机上可能发生的 DNS 条目的应用程序级别缓存(例如 Internet Explorer,维护自己的 DNS 缓存)。
你所期待设计的是高可用性。这将需要硬件设备或某种形式的软件集群。硬件选项包括 Citrix Netscaler、F5 ig IP 或 Foundry NetIrons。除非您为托管许多应用程序的大型企业工作,否则购买自己的设备很可能不切实际。可能值得与您的托管提供商核实,因为许多提供商会提供对共享 HA 设备的访问权限,但需要额外付费。
基于软件的选项包括Microsoft 网络负载平衡在 Windows 上,或乌卡普在 Linux 上;如果不知道您的确切要求以及您当前的基础设施,很难更具体。SF 上还有其他几个问题可能会有所帮助 - 请查看高可用性和聚类标签尤其如此。
答案2
可能发生的情况是,当 3 个服务器中的 2 个发生故障时,第三个服务器对此毫不知情,并继续为已发生故障的服务器提供 A 记录。DNS 服务器不会在返回的结果中优先考虑自己的 IP - 根据软件的不同,它可能会按顺序或随机地从 A 记录中挑选。因此,在 3 次中有 2 次,它会向发生故障的 2 个服务器返回 A 记录。
要在 DNS 内完全解决这个问题,您需要某种 DNS 负载平衡器(在系统上,或作为第三方设备/服务)。
在每个 DNS 服务器上保留单个 A 记录将允许每个服务器独立运行,但最终可能会导致第一台服务器(相对于其他两台)负载过大(即:ns1 映射到 server1 并在其区域中有一个 server1 A 记录,它很可能是客户端首先查询的服务器,因此如果它启动,它将获得几乎所有的流量)。
因此,它会起作用,但可能不会像你希望的那样起作用。
答案3
你是指主节点还是解析器?
如果它是主解析器,则有很多人托管它们。对于您自己的基础设施中的解析器,故障转移是有问题的,因为大多数解析器库只会按优先顺序尝试所有解析器。第一个解析器失败意味着将尝试第二个和第三个解析器,但只有在经过可怕的长时间延迟后才会尝试,这将极大地破坏性能(对于像邮件服务器这样需要在其关键执行路径中进行名称解析的东西)。
因此,冗余并不是唯一的问题,而要持续提供高性能——如果某些解析器发生故障,性能就不能下降。我们现在使用 LVS 来平衡内部解析器的负载,因为事实证明,这是获得足够性能和冗余以实现大量名称解析的唯一方法。