我正在设置一个由 MAN(桥接)连接的两个数据中心,并且它们之间的所有内容都是双倍的,处于故障转移模式,使用 RedHat Cluster、DRBD 和类似的东西。
我在每个位置都安装了一台 DNS 服务器,但事实证明,在 /etc/resolv.conf 中同时安装两台服务器并没有多大帮助;如果其中一台服务器出现故障,客户端有一半的时间要等待 10 秒左右。换句话说,客户端使用它们进行负载平衡,而不是故障转移。因此,我将两台服务器配置为使用带有 ucarp(≈VRRP)的 VIP。
有没有办法让我的两个 DNS 服务器同时运行,并且始终响应同一个 IP?如果一个 NS 请求得到两个答案,那也没什么大不了的。
有没有办法使用任播/多播等来实现这一点?
编辑:事实证明,在我的场景中任播对我没有任何好处,我只有静态路由,而且大多数流量实际上是通过桥梁的。
有趣的是,如果可能的话,让两个 DNS 服务器响应同一 IP 上的请求。
答案1
任播 DNS 允许您在所有客户端中配置一个解析器 IP;客户端请求将被转发到“最近的”(从网络路由角度来看)服务器。
如果您将任播 VIP 的广告与健康检查绑定(例如,请求知名域的 A 记录),那么如果您的一台服务器发生故障,其路由将被撤销。一旦网络重新收敛,所有请求都将转发到另一台设备,而无需任何手动重新配置。
在实现方面,这可以通过使用硬件设备(例如 F5 Big IP、Citrix Netscaler)或通过您自己的配置来实现。您可以运行在 DNS 服务器上的路由守护程序(例如 Quagga),或者使用一些登录到路由器的自定义脚本来更改每个任播 VIP 的状态。
答案2
您可以通过在 resolv.conf 中设置几个选项来大大缓解问题:
选项旋转超时:2
rotate 使解析器随机选择您的一个名称服务器,而不是使用第一个,除非它超时。timeout:2 将 dns 超时减少到两秒,而不是默认值。
(注意:这是在 Debian/Ubuntu 上测试的,但我不认为这是 Debian 特有的改变)
答案3
修复客户端 - 使用更好的解析器。
lwresd 是 Bind 的一部分。它作为本地服务运行。您可以通过 /etc/nsswitch.conf 配置 libc 来使用它,因此除了静态编译的程序外,它对所有程序都是透明的。
lwresd 监控已配置名称服务器的性能和可用性(这是 Bind 的标准行为)。如果某个主机不可用,lwresd 将退出某个服务器并将所有查询发送到其他已配置的服务器。由于它在每个主机上本地运行,因此它通常会将所有查询发送到最近的服务器。
答案4
简单愚蠢的方法:
要求你的 Linux 在 resolv.conf 中对 DNS 服务器更加积极:options timeout:0.1 rotate
因此超时很快,并且轮换让他使用两者来循环负载,无需管理任何 VIP/VRRP/员工,只有 2 个 dns 服务器在做他们的工作......