我正在尝试解决我的网络应用程序中遇到的 DNS 问题。
它向多个固定的外部域发出多个请求。由于显而易见的原因,我无法将域放在主机中,cloudfront/负载平衡和其他 IP 更改。
我发现,尽管运行超时并处理过时的出站连接,但模拟 DNS 故障会重现我在我的 Web 应用程序中看到的故障。
因此我认为我应该实现本地 DNS 缓存。我选择了 powerdns recoursor 来处理我的出站请求。它每秒将处理 500-1000 个请求,这些请求都发往相同的 8 个左右的域。
我希望实现的目标是减少 DNS 故障,无论是通信错误、DNS 响应缓慢还是 DNS 响应失败。信不信由你,我们之前使用的是谷歌 DNS,偶尔它会无法响应,导致我们的应用程序崩溃,在高峰时段,我们的线程会挂起并消耗资源。
那么我运行本地递归 DNS 的想法正确吗?
我正在考虑在我的 resolv.cond 中与 google 一起运行本地,并打开旋转以及其他配置。
我不确定 powerdns 实际上如何解析查询,我没有设置转发区域,但它仍会在 30 毫秒内返回挖掘结果并从缓存中返回所有后续结果。
您能指出我的逻辑中的漏洞吗?这是否是解决我的 DNS 可靠性问题的一个好方法?
谢谢
答案1
您的计划听起来不错,但请检查 RR 上的 TTL 记录,以查找您需要解析的一小部分域。如果它们的 TTL 非常短(例如少于大约 20 秒),您的本地缓存将不会有太大帮助,因为它仍会在每个 TTL 间隔内查询一次。有时在负载平衡器等中会看到非常短的 TTL。TTL 越长,您的缓存就越有效。
您还可以考虑专门用作递归解析器的软件,例如 Unbound。Unbound 有一个很好的功能,它可以从缓存中重新查询即将过期的域,以防止它们过期。这可以稍微提高弹性。
没有理由在 中同时列出您的新本地缓存和外部服务器/etc/resolv.conf
。如果您有nameserver 127.0.0.1
该文件,那就是您真正需要的。
答案2
我只是想补充一下,你可能想把
options single-request
如果您没有本地 DNS 服务器,则将其放入您的 resolv.conf 文件中。
在较新的系统 (RHEL 6) 上,如果启用了 IPv6,它将尝试同时查找 A 和 AAA 记录。我见过一些 DNS 服务器将此视为滥用(每秒请求过多)并开始丢弃 DNS 查询。
您没有提到您的 Web 服务器,但有些 Web 服务器 (Nginx) 有内部 DNS 缓存。众所周知,它们会缓存不良结果,因此您可能需要在调试期间禁用所有内部缓存。