(私人)DNS集群的最有弹性的forms?

我正在做一个由两个数据中心连接的城域网(桥接)的设置,并且所有的数据中心之间都是双倍的,使用RedHat Cluster,DRBD和事物的故障转移模式。

我有一个DNS服务器的每个位置,但事实certificate,在/etc/resolv.conf都没有多大帮助; 如果发生故障,客户一半的时间等待10秒左右。 换句话说,它使用它们进行负载平衡,而不是故障切换。 所以我configuration了两台服务器,使用一个带有ucarp的VIP(≈VRRP)。

有没有办法让我的两个DNS服务器都启动,例如,始终对同一个IP进行响应? 如果一个NS获得两个答案,这没什么大不了的。

有没有办法做到这一点Anycast /多播等?

编辑:原来任播在我的情况下不会对我有任何好处,我只有静态路由,而且大多数stream量实际上是通过一个桥梁。

有趣的是,有两个DNS服务器应答同一个IP上的请求,如果这是可能的话。

Anycast DNS将允许您在所有客户端中configuration一个parsing器IP; 客户端请求将被转发到“最接近”(从networking路由angular度来看)服务器。

如果您将任播VIP的广告与健康检查相关联(例如请求一个知名域名的Alogging),那么您的服务器中一台服务器出现故障将被撤销。 一旦networking重新融合,所有的请求将被转发到其他设备,而无需任何手动重新configuration。

就实施而言,可以通过使用硬件设备(例如F5 Big IP,Citrix Netscaler)或通过您自己的configuration来完成。 您可以运行在您的DNS服务器上运行的路由守护程序(例如Quagga),或者有一些自定义脚本login到您的路由器,以便更改每个Anycast VIP的状态。

您可以通过在resolv.conf中设置几个选项来大量减轻问题:

选项旋转超时:2 

旋转让parsing器随机挑选一个名称服务器,而不是使用第一个名称服务器,除非超时。 timeout:2将dns超时减less到两秒,而不是默认值。

(注意:这是在Debian / Ubuntu上testing的,但我不认为这是Debian特有的变化)

修复客户端 – 使用更好的parsing器。

lwresd是绑定的一部分。 它作为本地服务运行。 您可以通过/etc/nsswitch.confconfigurationlibc来使用它,因此对于除静态编译的程序之外的所有程序都是透明的。

lwresd监视configuration名称服务器的性能和可用性(这是标准的绑定行为)。 如果主机不可用,lwresd将退出服务器并将所有查询发送到其他configuration的服务器。 由于它在每台主机上本地运行,因此通常应将所有查询发送到最近的服务器。

我在两台Linux虚拟服务器(IPVS)负载均衡器上运行一个内部的BGP任播recursionDNS集群,它像一个魅力。

这里描述的基本设置:很好:对不起,新用户不允许添加超链接…(请参阅下面的链接和稍后的链接)

服务IP使用VRRP的问题是,它将在两台服务器之间漫游,因此您的名称服务器将需要快速绑定,以便在故障转移的情况下能够响应查询。 你可以通过NAT来解决这个问题,就像我的IPVS设置一样,但是我build议使用主动服务检查进行负载均衡,以便知道什么时候出现问题。

请注意,尽pipe有些DNS实现可以使用多播(例如Apple Bonjour / mdns),但它们通常不适用于依赖性或大容量recursionDNS服务,并且通常也限制在同一冲突域(即LAN)内使用。

简单的愚蠢的方式:

要求你的linux在resolv.conf中的dns服务器上更积极:options timeout:0.1 rotate

所以超时是快速和旋转使他使用循环负载,没有任何VIP / VRRP /员工pipe理,只有2 DNS服务器做他们的工作…

任播是经常用来解决这个要求。 任播DNS是使用路由和寻址策略来影响单个来源(DNS客户端)和几个地理上分散的目标之间的最有效path,这些目标在接收者组中“侦听”服务(DNS)。 在Anycast中,使用相同的IP地址来寻址每个监听目标(这种情况下的DNS服务器)。 第3层路由dynamic地处理从我们的源(DNS客户端)到最合适的(DNS服务器)目标的数据包的计算和传输。

请参阅www.netlinxinc.com了解Anycast DNS的全部博客文章。 在那里你会发现如何configurationAnycast DNS的食谱。 本系列已经介绍了使用静态路由(Static Routing,RIP)的Anycast DNS,我将很快在OSPF和BGP上发布配方。

如果在交换发生之前可以接受几秒的DNS故障,则可以创build一个简单的shell脚本来执行此操作。 非工作伪代码如下:

#!/bin/sh localns=192.168.0.1 remotens=192.168.0.2 currentns=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'` while 1; do if ping -W1 -q -c3 -i0.5 $localns > /dev/null 2>&1; then # Local DNS is up [ $currentns != $localns ] || echo "nameserver $localns" > /etc/resolv.conf currentns=$localdns else; # Local DNS is down [ $currentns != $remotens ] || echo "nameserver $remotens" > /etc/resolv.conf currentns=$remotedns sleep 2 # Will detect failures in no more than 5 secs 

如果您在站点的任何位置使用负载平衡器,则应该能够将它们configuration为将DNS作为虚拟服务。

我的Kemp Loadmaster 1500s可以设置为通过故障转移进行循环。 这将使用他们的服务检查,以确保每个DNS服务器每隔几秒钟,并在两台服务器之间划分stream量。 如果一个人死亡,它会退出RR池,只有“up”服务器被查询。

您只需将resolv.conf指向负载均衡器上的VIP即可。

你想DNS是可靠的。 在设置中添加大量的复杂性将会在事情中断时导致绝对的恶梦。

一些build议的解决scheme仅在冗余DNS服务器位于同一站点时才起作用。

根本的问题是DNS客户端按devise破坏了。 它不记得什么时候服务器是不可访问的,并且一直试图连接到同一个不响应的服务器。

NIS通过让ypbind保持状态来处理这个问题。 一个笨拙的解决scheme,但它通常工作。

这里的解决scheme是依靠供应商实现合理的解决scheme来解决这个问题。 IPV6越来越糟糕,因为AAAA请求增加了浪费在超时时间上的时间。 我看到协议失败(例如sshd连接),因为他们花了很多时间等待DNS超时,因为只有一个不可达的DNS服务器。

在此之前,如前所述,编写一个脚本,将resolv.confreplace为仅包含有效名称服务器的脚本。 与供应商分享这个脚本来展示你被迫执行的不清楚的解决scheme。

这没有经过严格的testing,它假定一个nslookup像我的parsing,和一个支持“-q”的grep。

每5分钟左右运行一次cron。

我并不是认真地build议任何人使用cron和shell脚本进行严格的故障转移pipe理,但是error handling方面的意外太大了。 这只是一个概念的certificate。

为了真实地testing它,可以更改顶部的“nameservers =”行,将顶部的resolv_conf更改为/etc/resolv.conf而不是/tmp/resolv.conf,并将resolv.conf的默认标题包含example.com 。

如果您replace了resolv.conf,则可能需要重新启动nscd。

 #!/bin/bash # full list of nameservers nameservers="127.0.0.1 192.168.0.1 192.168.1.1" # resolv.conf filename, change to /etc/resolv.conf for production use resolv_conf="/tmp/resolv.conf" # for tracking during the test failed_nameservers="" good_nameservers="" # test loop for nameserver in $nameservers; do if nslookup localhost $nameserver | grep -q 'Address.*127\.0\.0\.1'; then good_nameservers="$good_nameservers $nameserver" else failed_nameservers="$failed_nameservers $nameserver" fi done # if none succeded, include them all if [ -z "$good_nameservers" ]; then good_nameservers="$nameservers" fi # error reporting, consider writing to syslog if [ -n "$failed_nameservers" ]; then echo warning: failed nameservers $failed_nameservers fi # create the temporary replacement resolv.conf new_rc="$resolv_conf.new.$$" echo domain example.com > $new_rc echo search example.com >> $new_rc for nameserver in $good_nameservers; do echo nameserver $nameserver >> $new_rc done # don't deploy a corrupt resolv.conf if ! grep -q nameserver $new_rc; then echo warning: sanity check on $new_rc failed, giving up exit 1 fi # keep a backup if [ -f $resolv_conf ]; then rm -f $resolv_conf.previous ln $resolv_conf $resolv_conf.previous fi # deploy the new one mv $new_rc $resolv_conf 

我会首先尝试复制您的VRRP,但需要额外的VIP。 对于每个VIP,交替主节点和备份节点。

DNS1 = vip1 primary,vip2 secondary DNS2 = vip2 primary,vip1 secondary

然后让每台客户端机器在parsing器中都有ips。 这样,负载分散在名称服务器上,但是如果一个服务器出现故障,另一个服务器只承担额外的负载。

你有没有在两个站点负载均衡的机会? 如果不是,你可以与LVS一起成长。

在负载均衡器上的每个站点上都有一个dns服务地址。 然后,主动/被动负载均衡两个DNS服务器上的每个VIP,有利于本地的。