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


17

我们有一个小型数据中心,其中约有一百台主机指向3个内部dns服务器(绑定9)。当内部dns服务器之一不可用时,就会出现我们的问题。那时,指向该服务器的所有客户端开始执行时都非常缓慢。

问题似乎是库存的Linux解析器实际上并没有“故障转移”到其他dns服务器的概念。您可以调整超时和重试次数(并设置轮换以使它可以在列表中使用),但是如果主dns服务器不可用,则无论使用哪种服务,服务执行的速度都会慢得多。目前,这是我们最大的服务中断源之一。

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

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

我可以看到3种可能的解决方案类型:

  • 使用linux-ha / Pacemaker和故障转移ips(因此dns IP VIP始终可用)。las,我们没有好的围栏基础设施,没有围栏的起搏器也无法很好地工作(以我的经验,Pacemaker会在没有围栏的情况下降低可用性)。

  • 在每个节点上运行本地dns服务器,并使resolv.conf指向localhost。这会起作用,但是它将为我们提供更多监视和管理服务。

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

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

我是否缺少明显的解决方案?


2
我建议除了找到您要的解决方案(我无法为您提供解决方案)之外,您还应该研究真正的根本问题并解决DNS服务器的可靠性问题。
John

根本问题是:为什么这些DNS服务器经常停机以使您对此感到烦恼?考虑使用BuddyNS之类的专门服务来复制DNS 。您的延迟将大大降低,正常运行时间将不再使您烦恼/etc/resolv.conf的调整。
michele 2012年

Answers:


15

有两个选择。两者都会在您的DNS服务器之间分配DNS负载。

  • 尝试options rotate在resolv.conf中使用。这将最大程度地减少主服务器宕机的影响。如果其他服务器之一关闭,它将减慢动作。
  • 在不同的客户端上使用不同的名称服务器顺序。如果主DNS服务器关闭,这将允许某些客户端正常运行。这分散了停止服务的DNS服务器的影响。

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

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

注意:我运行数年没有计划外的DNS中断。正如其他人指出的那样,我将致力于解决导致DNS服务器出现故障的问题。上面的步骤还有助于通过指定无法访问的名称服务器来配置错误的DNS服务器。


4

签出“ man resolv.conf”。您可以在resolv.conf中添加一个超时选项。缺省值为5,但是将以下内容添加到resolv.conf会将其降低到1秒:

选项超时:1


重新阅读了第二段之后,我在Centos和Debian VPS上尝试了以上内容。在关闭主要dns之后,解析程序的性能完全符合预期。运行tcpdump,我什至可以看到解析器尝试第一个服务器,然后尝试下一个。您看到什么行为?
Niall Donegan

1
有两种解决的大用例:短期进程(如命令行工具)和长期进程,并且相同的解析器配置必须对两者都起作用。对于短命(单次查找),设置短超时将很快进行故障转移。但是,如果您正在查找在那个时间无法解析的外部地址:您将得到一个找不到的名称,因为如果解析器不会在一秒钟之内再次返回,则解析器将放弃该查询。(不在房间内;更多内容请参见下
一条

长期进程将重试每个查找,超时,然后移至下一个服务器。但是它似乎并没有缓存服务器的“故障”。
尼尔·卡汀

3

您的朋友在这里可以使用心跳或起搏器/同步等群集软件。例如,我们按照以下步骤设置起搏器/同步:

  • 将每台服务器与另一台服务器配对
  • 每对有2个dns vip,通常每对一个
  • 如果绑定或服务器失败,vip会在毫秒内移动到另一台服务器

生产时间为24x7,但我们坚信,每台服务器都应有可能在不影响客户的情况下发生故障。选项轮换只是一种解决方法,我不会那样做。


3

在每个节点上运行本地dns服务器,并使resolv.conf指向localhost。这会起作用,但是它将为我们提供更多监视和管理服务。

FWIW,这是我针对此问题找到的唯一可行的解​​决方案。您确实需要限制服务器仅监听本地主机,但是它完全消除了用户注意到我们环境中DNS中断的情况。

一个有趣的副作用是,如果localhost服务器由于某种原因而关闭,则标准解析程序库似乎比标准情况下处理故障转移的速度要快得多。

我们已经这样做了大约3年了,我还没有看到一个与在本地主机上运行的dns服务器的故障/中断有关的问题。


2

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

我会告诉您要调整SOA中的哪些值,但是当我遇到此问题时,我正在网上冲浪以查找确切的信息。


3
该答案仅适用于权威DNS。问题是有关客户端软件进行的递归DNS查找。
安德鲁B

1

也许您可以将DNS服务器放在负载均衡器后面?显然,LVS可以平衡UDP。显然,您的LB具有很高的可用性,因此它不是单点故障。


0

我知道这听起来有些陈词滥调,但是如何构建一个更稳定,更可靠的DNS基础结构作为该问题的永久解决方案。


我们有一个相当灵活的DNS基础设施。但是,由于dns服务器出现故障(或重新启动,进行了操作系统升级或其他原因),我们每年停电2到3次。
尼尔·卡汀

1
好吧,应该安排非生产时间进行重启和升级。至于其余的,似乎您正在通过每年发生几次的事情做出很大的贡献。对于似乎很少发生的问题,额外的基础设施,时间,金钱和管理开销是否值得?
joeqwerty 2011年

8
如果您的工作时间为24x7,会发生什么?DNS应该失败到第二/第三/ x服务器,并将另一台服务器的失败缓存一段时间。默认5秒钟的超时足以使服务中断,具体取决于负载。
Ryaner 2011年

0

更加以网络为中心的解决方案将使用两个具有相同(专用)IP和Anycast路由的DNS服务器。(到目前为止,我尚未在此线程中注意到此答案,但这是这里使用的。)

只要两者都启动,就使用最近的服务器。如果其中一个发生故障,则该IP的流量将被路由到另一个节点,直到再次出现。如果您有两个或多个位置或数据中心,这尤其有意义。

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.