当 DNS 服务器发生故障时避免 DNS 超时

当 DNS 服务器发生故障时避免 DNS 超时

我们有一个小型数据中心,其中大约有 100 台主机指向 3 个内部 DNS 服务器(bind 9)。当其中一个内部 DNS 服务器不可用时,我们就会遇到问题。此时,指向该服务器的所有客户端的运行速度都会变得非常缓慢。

问题似乎在于,现有的 Linux 解析器实际上没有“故障转移”到其他 DNS 服务器的概念。您可以调整它使用的超时和重试次数(并设置轮换以便它能够遍历列表),但无论使用何种设置,如果主 DNS 服务器不可用,我们的服务运行速度都会大大降低。目前,这是我们服务中断的最大原因之一。

我的理想答案是“RTFM:像这样调整 /etc/resolv.conf...”,但如果这是一个选项,我还没有看到它。

我想知道其他人如何处理这个问题?

我认为有三种可能的解决方案:

  • 使用 linux-ha/Pacemaker 和故障转移 IP(因此 DNS IP VIP“始终”可用)。可惜,我们没有良好的隔离基础设施,如果没有隔离,Pacemaker 就无法很好地工作(根据我的经验,如果没有隔离,Pacemaker 会降低可用性)。

  • 在每个节点上运行本地 DNS 服务器,并让 resolv.conf 指向 localhost。这可行,但需要监控和管理的服务会更多。

  • 在每个节点上运行本地缓存。人们似乎认为 nscd 已“损坏”,但 dnrd 似乎具有正确的功能集:它将 DNS 服务器标记为启动或关闭,并且不会使用“关闭”的 DNS 服务器。

任意广播似乎仅在 IP 路由级别起作用,并且取决于服务器故障的路由更新。多播似乎是一个完美的答案,但 bind 不支持广播或多播,我能找到的文档似乎表明多播 DNS 更适合服务发现和自动配置,而不是常规 DNS 解析。

我是否遗漏了一个明显的解决方案?

答案1

有几个选项。两者都会将 DNS 负载分散到您的 DNS 服务器上。

  • 尝试options rotate在 resolv.conf 中使用。这将最大限度地减少主服务器宕机的影响。如果其他服务器之一宕机,则会减慢操作速度。
  • 在不同的客户端上使用不同的名称服务器顺序。这样,如果主 DNS 服务器发生故障,某些客户端仍可正常运行。这样可以分散 DNS 服务器故障的影响。

这些选项可以与 结合使用options timeout:1 attempts:5。如果减少超时,请增加尝试次数,以便处理缓慢的外部服务器。

根据您的路由器配置,您可能能够配置 DNS 服务器以在主 DNS 服务器关闭时接管其 IP 地址。这可以与上述技术结合使用。

注意:我已经运行多年,从未发生过意外的 DNS 中断。正如其他人所说,我会努力解决导致 DNS 服务器故障的问题。上述步骤还有助于解决配置错误的 DNS 服务器(指定无法访问的名称服务器)。

答案2

查看“man resolv.conf”。您可以向 resolv.conf 添加超时选项。默认值为 5,但向 resolv.conf 添加以下内容应将其缩短至 1 秒:

选项超时:1

答案3

集群软件(例如 heartbeat 或 pacemaker/corosync)是您的好帮手。例如,我们按如下方式设置 pacemaker/corosync:

  • 将每台服务器与另一台服务器配对
  • 每对有 2 个 DNS VIP,通常每个上一个
  • 如果绑定或服务器发生故障,VIP 将在几毫秒内转移到另一台服务器

生产时间是 24x7,但我们坚信每台服务器发生故障都不会对客户产生影响。选项轮换只是一种解决方法,我不会那样做。

答案4

如果名称服务器因维护而停机,则正常程序是提前减少该域的 SOA 中的超时,以便在维护发生时,更改(例如在维护之前删除 NS 记录并在维护后将其放回原位)可以快速传播。请注意,这是一种服务器端方法 - 更改解析器是一种客户端方法,并且...除非您可以与每个客户端交谈并让他们在其机器上进行此调整...否则这可能不是正确的方法。好吧,我想您确实说过数据中心中只有一百个客户端使用内部 DNS 服务器,但是当您只需更改区域时,您真的想更改一百个客户端上的配置吗?

我会告诉你需要调整 SOA 中的哪些值,但是当我在网上浏览以查找确切的信息时,我遇到了这个问题。

相关内容