我正在使用由 MAN(桥接)链接的两个数据中心进行设置,并且在 RedHat Cluster、DRBD 和类似事物的故障转移模式下,它们之间的一切都加倍。
我为每个位置都有一个 DNS 服务器,但事实证明,在 /etc/resolv.conf 中同时拥有这两个服务器并没有多大帮助;如果一个失败,客户端等待 10 秒左右的一半时间。换句话说,它将它们用于负载平衡,而不是故障转移。所以我将两台服务器配置为使用带有 ucarp (≈VRRP) 的 VIP。
有没有办法让我的两个 DNS 服务器都启动,例如,始终响应同一个 IP?如果一个 NS resquest 得到两个答案,这没什么大不了的。
有没有办法用任播/多播等来做到这一点?
编辑:原来任播在我的场景中对我没有任何好处,我只有静态路由,大多数流量实际上是通过一座桥。
有趣的是,如果有可能的话,让两个 DNS 服务器响应同一 IP 上的请求的方法。
您可以通过在 resolv.conf 中设置几个选项来大大缓解问题:
rotate 使解析器随机选择您的一个名称服务器,而不是使用第一个,除非它超时。timeout:2 将 dns 超时减少到两秒,而不是默认值。
(注意:这是在 Debian/Ubuntu 上测试的,但我认为这不是 Debian 特定的更改)
Anycast DNS 将允许您在所有客户端中配置一个解析器 IP;客户端请求将被转发到“最近”(从网络路由的角度来看)服务器。
如果您将任播 VIP 的广告与健康检查联系起来(例如,为知名域请求 A 记录),那么如果您的其中一个服务器出现故障,它的路由将被撤回。一旦网络重新融合,所有请求都将被转发到其他设备,而无需任何手动重新配置。
在实施方面,这可以通过使用硬件设备(例如 F5 Big IP、Citrix Netscaler)或通过您自己的配置来完成。您可以在您的 DNS 服务器上运行一个路由守护程序(例如 Quagga),或者使用一些自定义脚本登录到您的路由器以更改每个任播 VIP 的状态。
修复客户端 - 使用更好的解析器。
lwresd 是 Bind 的一部分。它作为本地服务运行。您将 libc 配置为通过 /etc/nsswitch.conf 使用它,因此除了静态编译的程序外,使用它对所有程序都是透明的。
lwresd 监控已配置名称服务器的性能和可用性(这是标准的绑定行为)。如果主机不可用,lwresd 将从服务器退出并将所有查询发送到其他配置的服务器。由于它在每个主机上本地运行,它通常应该将所有查询发送到最近的服务器。
我在两个 Linux 虚拟服务器 (IPVS) 负载均衡器上运行了一个内部 BGP 任播递归 DNS 集群,它的工作原理就像一个魅力。
此处描述了基本设置:太棒了:抱歉,不允许新用户添加超链接...(请参阅下面的链接以及稍后的链接)
将 VRRP 用于服务 IP 的问题在于它会在您的两台服务器之间徘徊,因此您的名称服务器需要快速绑定到它,以便能够在故障转移的情况下响应查询。您可以像在我的 IPVS 设置中一样通过 NAT 来解决此问题,但我建议使用活动服务检查进行负载平衡,以便您知道何时出现问题。
请注意,虽然有使用多播的 DNS 实现(例如 Apple Bonjour/mdns),但它们通常不太适合依赖或大容量递归 DNS 服务,并且通常也仅限于在同一冲突域(即 LAN)中使用。
简单的笨方法:
在 resolv.conf 中要求您的 linux 在 dns 服务器上更加积极:选项超时:0.1 轮换
所以超时很快,轮换让他使用两者来循环负载,没有任何 VIP/VRRP/工作人员需要管理,只有 2 个 dns 服务器在做他们的工作......
Anycast 经常被用来解决这个需求。Anycast DNS 是使用路由和寻址策略来影响单个源(DNS 客户端)和几个地理上分散的目标之间的最有效路径,这些目标“侦听”接收器组中的服务 (DNS)。在 Anycast 中,相同的 IP 地址用于寻址每个侦听目标(在本例中为 DNS 服务器)。第 3 层路由动态处理从我们的源(DNS 客户端)到其最合适的(DNS 服务器)目标的数据包的计算和传输。
请访问 www.netlinxinc.com 了解关于 Anycast DNS 的完整系列博客文章。在那里,您将找到如何配置 Anycast DNS 的方法。该系列涵盖了使用静态路由、RIP 的任播 DNS,我将很快发布有关 OSPF 和 BGP 的秘诀。
如果在交换发生之前有几秒钟的 DNS 故障是可以接受的,您可以创建一个简单的 shell 脚本来执行此操作。非工作伪代码如下:
如果您在站点的任何位置使用负载平衡器,您应该能够将它们配置为将 DNS 作为虚拟服务。
我的 Kemp Loadmaster 1500 可以设置为通过故障转移进行循环。这将使用他们的服务检查来确保每台 DNS 服务器每隔几秒钟就启动一次,并在两台服务器之间分配流量。如果一个人死了,它就会从 RR 池中退出,只有“up”的服务器会被查询。
您只需将您的 resolv.conf 指向负载均衡器上的 VIP。
您希望 DNS 可靠。在设置中增加大量复杂性将在出现问题时导致绝对的噩梦。
一些建议的解决方案仅在冗余 DNS 服务器位于同一站点时才有效。
根本问题是 DNS 客户端按设计损坏。它不记得服务器何时无法访问,并不断尝试连接到同一个无响应的服务器。
NIS 通过让 ypbind 保持状态来处理这个问题。一个笨拙的解决方案,但它通常有效。
这里的解决方案是依靠供应商来实现这个问题的合理解决方案。IPV6 的情况变得更糟,因为 AAAA 请求增加了浪费在超时上的时间长度。我已经看到协议失败(例如 sshd 连接),因为由于单个无法访问的 DNS 服务器,它们花费了大量时间等待 DNS 超时。
在此期间,如前所述,编写一个脚本,将 resolv.conf 替换为仅包含有效名称服务器的脚本。与供应商共享此脚本,以演示您被迫实施的不干净的解决方案。
这还没有经过认真测试,它假设一个像我一样解析的 nslookup 和一个支持“-q”的 grep。
每 5 分钟左右从 cron 中运行一次。
我并不是认真地建议任何人实际使用 cron 和 shell 脚本来进行关键故障转移管理,错误处理的惊喜实在是太大了。这只是一个概念证明。
要真正测试这一点,请更改顶部的“nameservers =”行,将顶部的 resolv_conf 更改为 /etc/resolv.conf 而不是 /tmp/resolv.conf,以及包含 example.com 的 resolv.conf 的默认标头.
如果您替换 resolv.conf,您可能需要重新启动 nscd。
我会首先尝试复制您的 VRRP,但需要额外的 VIP。对于每个 VIP,交替主节点和备份节点。
DNS1 = vip1 主要,vip2 次要 DNS2 = vip2 主要,vip1 次要
然后让您的每台客户端机器在解析器中都有两个 ip。这样,负载就会分布在名称服务器上,但如果一个出现故障,另一个就会接管额外的负载。