AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 16118
Accepted
niXar
niXar
Asked: 2009-06-01 01:37:49 +0800 CST2009-06-01 01:37:49 +0800 CST 2009-06-01 01:37:49 +0800 CST

最具弹性的(私有)DNS 集群形式?

  • 772

我正在使用由 MAN(桥接)链接的两个数据中心进行设置,并且在 RedHat Cluster、DRBD 和类似事物的故障转移模式下,它们之间的一切都加倍。

我为每个位置都有一个 DNS 服务器,但事实证明,在 /etc/resolv.conf 中同时拥有这两个服务器并没有多大帮助;如果一个失败,客户端等待 10 秒左右的一半时间。换句话说,它将它们用于负载平衡,而不是故障转移。所以我将两台服务器配置为使用带有 ucarp (≈VRRP) 的 VIP。

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

有没有办法用任播/多播等来做到这一点?

编辑:原来任播在我的场景中对我没有任何好处,我只有静态路由,大多数流量实际上是通过一座桥。

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

linux domain-name-system cluster multicast
  • 11 11 个回答
  • 3036 Views

11 个回答

  • Voted
  1. David Pashley
    2009-06-05T03:48:02+08:002009-06-05T03:48:02+08:00

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

    选项轮换超时:2

    rotate 使解析器随机选择您的一个名称服务器,而不是使用第一个,除非它超时。timeout:2 将 dns 超时减少到两秒,而不是默认值。

    (注意:这是在 Debian/Ubuntu 上测试的,但我认为这不是 Debian 特定的更改)

    • 6
  2. Best Answer
    Murali Suriar
    2009-06-01T01:44:02+08:002009-06-01T01:44:02+08:00

    Anycast DNS 将允许您在所有客户端中配置一个解析器 IP;客户端请求将被转发到“最近”(从网络路由的角度来看)服务器。

    如果您将任播 VIP 的广告与健康检查联系起来(例如,为知名域请求 A 记录),那么如果您的其中一个服务器出现故障,它的路由将被撤回。一旦网络重新融合,所有请求都将被转发到其他设备,而无需任何手动重新配置。

    在实施方面,这可以通过使用硬件设备(例如 F5 Big IP、Citrix Netscaler)或通过您自己的配置来完成。您可以在您的 DNS 服务器上运行一个路由守护程序(例如 Quagga),或者使用一些自定义脚本登录到您的路由器以更改每个任播 VIP 的状态。

    • 5
  3. BrianEss
    2009-09-23T22:16:40+08:002009-09-23T22:16:40+08:00

    修复客户端 - 使用更好的解析器。

    lwresd 是 Bind 的一部分。它作为本地服务运行。您将 libc 配置为通过 /etc/nsswitch.conf 使用它,因此除了静态编译的程序外,使用它对所有程序都是透明的。

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

    • 3
  4. ZaphodB
    2009-06-02T12:41:25+08:002009-06-02T12:41:25+08:00

    我在两个 Linux 虚拟服务器 (IPVS) 负载均衡器上运行了一个内部 BGP 任播递归 DNS 集群,它的工作原理就像一个魅力。

    此处描述了基本设置:太棒了:抱歉,不允许新用户添加超链接...(请参阅下面的链接以及稍后的链接)

    将 VRRP 用于服务 IP 的问题在于它会在您的两台服务器之间徘徊,因此您的名称服务器需要快速绑定到它,以便能够在故障转移的情况下响应查询。您可以像在我的 IPVS 设置中一样通过 NAT 来解决此问题,但我建议使用活动服务检查进行负载平衡,以便您知道何时出现问题。

    请注意,虽然有使用多播的 DNS 实现(例如 Apple Bonjour/mdns),但它们通常不太适合依赖或大容量递归 DNS 服务,并且通常也仅限于在同一冲突域(即 LAN)中使用。

    • 2
  5. Mathieu Chateau
    2009-06-10T12:57:18+08:002009-06-10T12:57:18+08:00

    简单的笨方法:

    在 resolv.conf 中要求您的 linux 在 dns 服务器上更加积极:选项超时:0.1 轮换

    所以超时很快,轮换让他使用两者来循环负载,没有任何 VIP/VRRP/工作人员需要管理,只有 2 个 dns 服务器在做他们的工作......

    • 2
  6. netlinxman
    2009-06-01T08:53:09+08:002009-06-01T08:53:09+08:00

    Anycast 经常被用来解决这个需求。Anycast DNS 是使用路由和寻址策略来影响单个源(DNS 客户端)和几个地理上分散的目标之间的最有效路径,这些目标“侦听”接收器组中的服务 (DNS)。在 Anycast 中,相同的 IP 地址用于寻址每个侦听目标(在本例中为 DNS 服务器)。第 3 层路由动态处理从我们的源(DNS 客户端)到其最合适的(DNS 服务器)目标的数据包的计算和传输。

    请访问 www.netlinxinc.com 了解关于 Anycast DNS 的完整系列博客文章。在那里,您将找到如何配置 Anycast DNS 的方法。该系列涵盖了使用静态路由、RIP 的任播 DNS,我将很快发布有关 OSPF 和 BGP 的秘诀。

    • 1
  7. Alex J
    2009-06-01T02:57:02+08:002009-06-01T02:57:02+08:00

    如果在交换发生之前有几秒钟的 DNS 故障是可以接受的,您可以创建一个简单的 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
    
    • 0
  8. Matt Simmons
    2009-06-01T03:33:48+08:002009-06-01T03:33:48+08:00

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

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

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

    • 0
  9. carlito
    2009-06-04T21:31:45+08:002009-06-04T21:31:45+08:00

    您希望 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。

    #!/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
    
    • 0
  10. eliott
    2009-06-05T09:37:10+08:002009-06-05T09:37:10+08:00

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

    DNS1 = vip1 主要,vip2 次要 DNS2 = vip2 主要,vip1 次要

    然后让您的每台客户端机器在解析器中都有两个 ip。这样,负载就会分布在名称服务器上,但如果一个出现故障,另一个就会接管额外的负载。

    • 0

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 从 2003 年迁移到 2008 年 Microsoft 群集技术

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve