V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waibunleung
V2EX  ›  DNS

DNS 问题,研究到凌晨 4 点还是没有结论...救救孩子吧

  •  
  •   waibunleung · 127 天前 · 7336 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看了 DNS 解析相关的内容,然后就好奇 dig 了一下公司的一些域名,发现自建了好多二级域名服务器。这么多服务器明显是为了容灾+分流,然后我就在想,DNS 服务器的高可用是怎么保证的?

    于是我:
    1.搜索了相关的 DNS 集群搭建,发现都是介绍 dns 主从服务器搭建的比较多,说一主多从就算是一个集群,但我觉得这点能力是不太够支撑高可用的
    2. 找了下有没有相关大厂 DNS 这块的高可用设计,找到阿里的,但是关于一些细节的描述并没有,看完之后似懂非懂 -> https://zhuanlan.zhihu.com/p/115909472
    3. 404 网站找了一番,也是多数关于 DNS 主从服务器的搭建,帮助不算太大

    无奈的我只能在这里发帖问问大家,希望有相关经验的家人们能够点拨一下~

    dns 解析这一层,是怎么保证高可用的?
    用集群冗余备份大概率没跑了,但是集群内部是怎么同步数据的?集群中的每一个节点都向外提供服务吗?
    一个进群可能不够,那多个集群之间又是怎么同步的呢?

    真的感觉自己知道的太少了~

    68 条回复    2021-08-16 14:34:24 +08:00
    mytsing520
        1
    mytsing520  
       127 天前
    根据楼主提供的阿里文档,接下来所有都是我个人的推( che )论( dan ),如果讲的不对请指出,我没有做过这个规模的,大佬请轻喷。

    回到 DNS 本身。除了提升 DNS 服务器本身的服务质量,为了确保高可用,主要通过负载均衡技术实现。你在互联网上看到的一个 IP 地址,其背后会有 N 台服务器来提供支撑。就算有一台挂了,SLB 也会马上抛弃之,确保无论如何最后至少会有一台服务器依然在提供服务。当然,真遇到了 DNS 服务器本身的故障,运维团队也不是吃素的。
    同一个主域名下,多组 DNS 的部署,可确保每组 DNS 在一个较大的数据范围内,其承担的解析工作量接近相等。
    至于有些厂商针对子域名单独做了 NS (比如 qq.com ),技术层面上面已经做了回答,我想更多的出于管理层面的考虑,毕竟大厂业务多,域名也多。
    希望这能回答清楚你的“dns 解析这一层,是怎么保证高可用的?”这个问题。

    至于同步数据,为了安全起见,首先订明管理端与实际提供解析服务的服务器分离。
    DNS 管理员配置域名解析后,该结果将会保存到数据库。阿里的文档中,负责存储和下发角色的数据库,通过使用集群和多副本存档等技术手段,确保数据的可靠性。
    最后,通过数据库向部署的 DNS 下发域名解析配置。文档中提及“应用机房部署与数据库解耦,可以任意机房部署”,这里的“应用机房”就是我们 dig 时看到的那些,他只需要负责接收配置结果并应用于承担外部流量,所以部署在哪里实际上只有事先会比较重要,后期按客户所在地适当调整即可。

    至于文中提及的 anycast 、解析结果正确性、安全防护,则是日常应用阶段的延展了。
    mytsing520
        2
    mytsing520  
       127 天前
    至于 DNS 服务本身的架构,你可以是主从架构,也可以是全主。
    但在域名委派体系里面,上级域只会给下级域一个主要的服务地址。
    mytsing520
        3
    mytsing520  
       127 天前
    更正:2 楼答复中,将“至于 DNS 服务本身的架构”更正为“至于 DNS 服务本身”。读着读着感觉有问题。
    wd
        4
    wd  
       127 天前 via iPhone
    没太明白楼主的点.. dns 记录挺小的,一个公司内部自己的 dns 记录一般不会很多,因为一般流量入口就是一个 nginx 之类的 lb 集群,这样比如新建一个域名的时候通过 cname 到 lb 的 dns 就行。这样一般变更其实很少,要就是 lb 加减机器的时候会有变更。
    另外一个,dns 会有 ttl 的,现代一般 ttl 都很小,例如 5 分钟,那么即使集群同步有问题,也就几分钟的 cache,不会有太大问题。(当然可能会有长尾效应,但是毕竟没多少)
    Ariver
        5
    Ariver  
       127 天前 via iPhone
    看看网络自顶向下
    说的很详细
    你找的那些都是针对自己的,不是解释 DNS 整体方案的。
    baozhibo
        6
    baozhibo  
       127 天前
    从网络层解决这个问题。可以了解一下 lvs 代理
    huangmingyou
        7
    huangmingyou  
       127 天前
    dns 主从直接有同步协议的。不过完全可以手工同步 zone 配置文件,通过 git,rsync 等同步。 有些 dns 服务器是用 mysql 做数据存储的。例如 powerdns 。
    binsys
        8
    binsys  
       127 天前
    DNS 高可用不是用 anycast 保证嘛?
    waibunleung
        9
    waibunleung  
    OP
       127 天前
    @wd 是外部的自建 DNS,不是内部的,内部的也有,但是我更感兴趣外部的。内部的全部走内部域名 rpc 的
    waibunleung
        10
    waibunleung  
    OP
       127 天前
    @Ariver 具体是书里面的那一部分?
    waibunleung
        11
    waibunleung  
    OP
       127 天前
    @binsys 你这个是很全局的,我想问的是自建的 NS,是怎么保证其高可用的?
    Ariver
        12
    Ariver  
       127 天前
    @waibunleung 我只记得在书的前几章,tcp 开始之前,讲到了 dns
    mytsing520
        13
    mytsing520  
       127 天前
    @binsys 外面是 anycast,后面是 LB 负载
    nuk
        14
    nuk  
       127 天前
    二级域名服务器不一定是为了分流和灾容,也可能只是为了有自己的 SOP 而已,又不是提供公共 DNS,要啥高可用,顶了天设两个 ns 地址让 dns 自己同步,你发的那个专栏就是公共 DNS,自建 DNS 根本不能比。
    waibunleung
        15
    waibunleung  
    OP
       127 天前
    @mytsing520 老哥可以加个微信交流下吗?
    waibunleung
        16
    waibunleung  
    OP
       127 天前
    @nuk 用户访问规模也不小,1 亿的 pv,为什么 DNS 层不需要高可用呢?我看至少是设置了 6 个 NS 。
    Ariver
        17
    Ariver  
       127 天前
    dns 本地是有缓存的
    waibunleung
        18
    waibunleung  
    OP
       127 天前
    @Ariver 本地有缓存难道就不需要高可用了吗....你这样说是想说明什么问题呢?就是我知道本地有 DNS 缓存,然后呢....
    nuk
        19
    nuk  
       127 天前
    @waibunleung 因为用户不会直接设置 DNS 为自建的 DNS 啊,多少 pv 对于自建 DNS 基本上差别不太大,DNS 本身就会流量放大,缓存是一定要的,至于设置 6 个 ns 服务器,我看是吃饱了撑的。
    crystom
        20
    crystom  
       127 天前
    购买国内这些普通的 dns,好像没有办法做主备同步,例如同时购买 2 个云的 dns,没法兼容
    mytsing520
        21
    mytsing520  
       127 天前
    @crystom
    阿里云的 DNS,如果买的是企业版本,可以作为从服务器直接对外,隐藏掉自己的主服务器
    dzdh
        22
    dzdh  
       127 天前
    运营商缓存怎么破
    XiaoxiaoPu
        23
    XiaoxiaoPu  
       127 天前
    自研 DNS 服务器,不需要传统 DNS 协议的主从同步。跟 Web 服务器的高可用架构没啥区别,区别只是用户协议是 DNS 协议。
    waibunleung
        24
    waibunleung  
    OP
       127 天前
    @XiaoxiaoPu 有稍微被点拨了一下~
    web 服务器保证高可用我大概知道些套路,但是我对应不过去。DNS 服务器这一块,服务器故障转移怎么做?解析的记录是怎么同步到不同机房的里面去的?集群又是怎么建起来的?
    waibunleung
        25
    waibunleung  
    OP
       127 天前
    @nuk 虽然用户不会直接设置自建的 DNS 地址,但是通过解析和查询,流量还是会到自建 DNS 这一层的呀~
    XiaoxiaoPu
        26
    XiaoxiaoPu  
       127 天前
    @waibunleung

    「 DNS 服务器这一块,服务器故障转移怎么做?」
    IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP
    UDP/TCP 层:接入 4 层负载均衡

    「解析的记录是怎么同步到不同机房的里面去的?」
    数据存储于高可用数据库,DNS 服务器不用关注数据的跨机房同步问题。

    「集群又是怎么建起来的?」
    解析记录都在数据库里,DNS 服务器本身就是无状态的了,可以任意横向扩展。
    waibunleung
        27
    waibunleung  
    OP
       127 天前
    @XiaoxiaoPu
    「 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP 」
    现在通过 dig 来看,多个二级域名解析的 NS 就是多个机房 ip,有没有上 anycast 不知道,看不出来

    「 UDP/TCP 层:接入 4 层负载均衡」
    是否在 DNS 之上再加一层 LVS ?
    XiaoxiaoPu
        28
    XiaoxiaoPu  
       127 天前
    @waibunleung LVS 就是 4 层负载均衡
    v2clay
        29
    v2clay  
       127 天前
    想的不多,想的太多。
    高可用不是由 dns 决定的。
    高可用是由多台服务器集群实现
    dns 通过解析不同的 ip 地址,来实现负载均衡。
    waibunleung
        30
    waibunleung  
    OP
       127 天前
    @v2clay 你误会我意思了,整个系统有整个系统的高可用设计,每一次有每一层的高可用性设计。就像数据库是这个 web 系统的一部分,但是数据库怎么保证自身的高可用?这里问的就是 DNS 怎么保证自身的高可用?
    waibunleung
        31
    waibunleung  
    OP
       127 天前
    @XiaoxiaoPu
    「 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP 」
    这个可否理解为:多个机房里面都有一个 dns 服务器集群,每个 dns 集群有不同的 ip ?如果是这样的话,dns 集群内的故障转移,是通过 keepalived 之类的健康检查机制来剔除故障的 NS 吗?
    gBurnX
        32
    gBurnX  
       127 天前
    1.用户电脑层的 DNS 高可用:比如 Windows 与 Linux,DNS 可以填两个。如果其中一个 DNS 地址因故障没有响应,那么就换另一个。

    如果用户电脑直接接入公网,那么这两个 DNS,是自动获取到的运营商的两个 DNS 。

    如果用户电脑,接入了自己的路由器、交换机或猫,则 DNS 只需要填一个上层设备的 IP 即可,由上层设备提供 DNS 解析服务。或者直接填运营商的 DNS 也行。


    2.用户中间设备层的 DNS 高可用,比如路由器、交换机、猫等,这些设备,DNS 也可以填两个。一般是直接获取运营商的两个 DNS,或者获取更上层设备的 DNS 地址。


    3.运营商层的 DNS 高可用:运营商发放给用户的 DNS 地址,是一个 [虚拟 IP] ,一般是代理服务器或负载均衡服务器持有该地址,此设备它本身并不直接提供 DNS 服务。然后此设备负责把用户的 DNS 请求,转发给 DNS 服务器集群。


    4.公司做 DNS 高可用的方法:

    买入两条线路,每条线路配置一个公网 IP,然后把这个公网 IP,做到公司域名的解析记录里。也就是对 xx.comwww.xx.com 写两条 A 记录。这样用户进行 DNS 解析时,就会解析到两个 IP 地址。正常的浏览器,会选择一个 IP 地址进行访问,如果发现故障,正常的浏览器会切换到另一个 IP 地址,来实现高可用。问题是,很多手机浏览器,没有切换功能。因此如果两个 IP,有一个挂了,那么手机浏览器就无法访问了。

    有钱的公司,会买入多线条路,甚至在不同城市买入线路,来防止某个城市整体断电导致网站与服务不可用。
    waibunleung
        33
    waibunleung  
    OP
       127 天前
    @gBurnX 大佬!等的就是你这样的解答
    可是我还是有疑问,正如你所说,我 dig 到公司在不同机房里配置了共 6 台 ns 服务器(其实就是南北*3 个不同运营商各一台),那如果这些 ns 后面都是一个集群的话,这个集群是与普通 web 集群一样的吗? DNS 集群内怎么做障转移?不同集群之间怎么做故障转移?
    v2clay
        34
    v2clay  
       126 天前
    @waibunleung # 自己搭建,那就 dns 主从集群。商业 dns 解析服务商 dnspod,底层也差不多用的这个技术。
    v2clay
        35
    v2clay  
       126 天前
    @gBurnX #32 第四条,其实是业务层面的,与 dns 集群高可用无关。配置 2 个 A 记录,不能完全保证业务不受影响。

    @waibunleung #33 web 里,如 nginx 负载均衡,自动切换,利用的是类似心跳检查,间隔几秒发送 http/s,不可达直接切换。dns 集群没有这个功能。dns 集群简单粗暴,就是配置多个服务器,这几个服务通过主从集群同步 dns 记录,保证每台 dns 服务器的记录相同。然后把这个多个 dns 服务器的 ip 配给 dns 客户端(电脑 /路由器 /手机等)。dns 客户端收到一个 dns query,会同时向多个配置 dns server ip 发请求。客户端配了多少个 dns server,就向多少个发,总有一个回有响应。简单、粗暴,有效。
    nbsn
        36
    nbsn  
       126 天前
    其实吧,我认为,DNS 是一个深坑,得针对不同的场景。比如入向的 DNS (被访问)和出向的 DNS (主动访问)是完全不同的。就拿出向的 DNS 来讲,一个简单的例子就是你家里的 DNS 分流,访问国内国外要用不同的 DNS,如果你家里有两条,甚至多条宽带,要分流,如何做 DNS 分流。## 所以,针对场景不同,实现方式也不同。
    v2clay
        37
    v2clay  
       126 天前
    @waibunleung #31 集群的真正目的是为了保证集群内各个服务的记录相同。
    不用剔除机制,完全没有必要。
    dns 客户端配置多个 集群内的 dns 服务器,就可以保证高可用。
    当有一台有问题,没关系,剩下的接着顶上。
    加上报警措施,有足够的时间处理。
    ETiV
        38
    ETiV  
       126 天前
    帮你 @naizhao,DNSPod 创始人
    gBurnX
        39
    gBurnX  
       126 天前
    @waibunleung

    Q:这个集群是与普通 web 集群一样的吗?
    A:web 集群有很多种搭建方式。如果 web 集群里,每个节点都是平等的负载节点,且上级是代理或负载均衡设备,那么这种 ns 集群就和 web 集群相同。

    Q:DNS 集群内怎么做障转移?
    A:提供故障转移的,是上级代理或负载均衡设备。这些设备会定期检查集群中每个节点的状态,如果节点挂了,上级代理或负载均衡设备就不会把外部请求转发给这些故障节点。其次,当代理或负载均衡设备,把外部请求转发到这些节点时,也会检查它是否能在规定时间内接受响应,如果超时,则上级代理或负载均衡设备,就认为该节点故障,然后会把请求转发给别的健康节点。

    Q:不同集群之间怎么做故障转移?
    A:我在前面说过,一家公司会有多条线路。如果一条线路对应的是一个集群,那么该集群故障后,那么该线路对应的 IP 都无法响应,那么客户端会使用 A 记录返回的其他 IP 进行 dns 解析。
    gBurnX
        40
    gBurnX  
       126 天前
    @v2clay

    你完全搞错了,dns 高可用是一个整体工程,我第一条回复的第 4 点,正是这个链条的末端。

    另外你也别钻牛角尖,你说配置 2 个 A 记录,不能完全保证业务不受影响,按你这个说法,无论配置多少个 A 记录,也不能完全保证业务不受影响。目前业界的现状是,除开银行这种机构,其他大部分对高可用并不需要极端的需求,双节点冗余,或者说双机热备,在业界是一种非常常规的做法。
    sutra
        41
    sutra  
       126 天前
    你拿 bind 跑个 DNS server 就懂了。
    realpg
        42
    realpg  
       126 天前
    没你想象那么复杂……

    多建几个,不需要集群,增删改查时候,多个服务器都应用一遍即可……
    waibunleung
        43
    waibunleung  
    OP
       126 天前
    @realpg 「增删改查,多个服务器都应用一遍即可」这句话怎么理解?
    waibunleung
        44
    waibunleung  
    OP
       126 天前
    @v2clay 茅塞顿开!
    sutra
        45
    sutra  
       126 天前
    「增删改查,多个服务器都应用一遍即可」 - DNS 服务器自带。
    waibunleung
        46
    waibunleung  
    OP
       126 天前
    @gBurnX 「提供故障转移的,是上级代理或负载均衡设备。这些设备会定期检查集群中每个节点的状态,如果节点挂了,上级代理或负载均衡设备就不会把外部请求转发给这些故障节点。」
    意思是在 DNS 之上还会有一层负载均衡(如 LVS )来将请求分摊到不同机器?如果是这样的话,整个请求的链路会不会显得复杂? dns query->dns 负载均衡->dns sever->LVS 负载均衡->real server ?
    waibunleung
        47
    waibunleung  
    OP
       126 天前
    @sutra 你的意思是,不需要 dns 集群,多建立几个 dns 的服务器,然后有什么解析记录就往各个 DNS 服务器上面添加一下,然后就可以了?
    sutra
        48
    sutra  
       126 天前
    DNS 服务软件本身带有类似 master/slave 的广播和增量更新功能。
    waibunleung
        49
    waibunleung  
    OP
       126 天前
    @sutra 这不就是主从吗?
    ishalla
        50
    ishalla  
       126 天前
    我本来觉得我很懂的,进来看 LZ 讲得我完全不懂了。。
    DNS 解析的高可用不就是在一个域名下面解析两个 IP 地址,仅此而已吗?哪里来的主从、群集。。
    不会有群集,就是买两条网络,DNS 服务器上填写两个 A 记录,确实这样很可能会双活,两个解析的网络都有流量,但可以通过设置 TTL 实现理论分流——但也只是理论而已,实际使用场景其实大部分时间还是双活,企业级解决方案一般这都是默认接受的风险点。
    包括主楼提到的阿里云背后其实也是这样的机制,但阿里云是给一个 DNS 地址填写两个 CNAME,探测到一个域名宕了就切换到另一个,通过设置权重判断主备线。
    waibunleung
        51
    waibunleung  
    OP
       126 天前
    @ishalla 你知道这么多为什么不早说说出来交流一下?
    sleepm
        52
    sleepm  
       126 天前
    https://www.root101.net/highly-available-bind-dns-cluster-design-million-user
    是集群,不过,master 不是主要负责回应查询的而是同步记录的
    ishalla
        53
    ishalla  
       126 天前
    @waibunleung 刚刚开始摸鱼。。前面那么多楼越看越迷茫,越说越不懂,又花了一点时间思考,这个问题属于架构范畴,我以为 v2 都是搞开发的,也很少带架构玩。。
    像你司这样能被 dig 到好几个地址,还要考虑内网外网的问题,甚至 flushdns 一下就得到不同结果了,因为内网还可能引入了 F5 、Palo Alto 之类的产品,会附带所谓的智能 DNS,其实说穿了就是 Nginx,如果考虑 Nginx 配置分流,本楼所有回复都是不全面的。。
    所以不能靠 dig 结果去猜测想象,大致明白一个原理就行了,企业级解决方案很复杂的,真感兴趣找 infra team 了解吧。
    waibunleung
        54
    waibunleung  
    OP
       126 天前
    @sleepm 你的链接返回了一个 xml
    waibunleung
        55
    waibunleung  
    OP
       126 天前
    @ishalla v2 也有搞架构的吧
    「大致明白一个原理就行了,企业级解决方案很复杂的」
    就是想知道大概的 DNS 可用性方面的保证,感兴趣的是这方面
    gBurnX
        56
    gBurnX  
       126 天前
    @waibunleung 觉得复杂,可以去看看系统架构图,或者 tcp 的各种功能实现图...dns 这都算是最简单的了。
    sleepm
        57
    sleepm  
       126 天前
    @waibunleung 试了下,还真是
    谷歌搜 highly-available-bind-dns-cluster-design-million-users 然后点 root101.net 那个
    waibunleung
        58
    waibunleung  
    OP
       126 天前
    @gBurnX 系统架构图是哪些?我的意思是找网上的架构图来看?
    Showfom
        59
    Showfom  
       126 天前
    @waibunleung #16 你得看 DNS 的查询次数,多少 PV 对 DNS 服务器的性能相关性有但是不是特别大,因为用户使用的 ISP 的 DNS 没准等下都是同一个出口呢

    一亿 PV 每天而已,自建两台 DNS 服务器也可以撑起来的
    dizangcn009
        60
    dizangcn009  
       126 天前
    @gBurnX #40 话不投机半句多
    realpg
        61
    realpg  
       125 天前
    @Showfom #59
    对国内,十亿 PV 每天的项目,三个最小的云服务器 2C4G 啥的都能 handle,轻松加愉快
    实际生产环境 handle 过
    也不用集群,dns 集群,高可用啥的都没啥用,对 dns 这种东西根本不需要集群也不需要负载

    一个数据库服务器兼配置器(记录保存器),多个最小配置的 vps 作为 dns 服务器,分布在三个供应商的不同地区机房就够了
    Showfom
        62
    Showfom  
       125 天前
    @realpg #61 是这样的,DNS 基本不需要集群和备份,负载不够了就加机器嘛,况且用户的本地运营商的递归 DNS 都缓存了一大堆,流量越大的域名他们缓存的更久= =尤其是移动
    realpg
        63
    realpg  
       125 天前
    @Showfom #62

    所以我看之前那些搞笑级别的回复,真的一头雾水。
    DNS 协议层就不需要这些,碰瓷概念非得给搞出来

    我这边做过本地大项目的 DNS (不是互联网项目,民生刚需项目,天天访问量恐怖),因为主要服务省内,所以省内两大城市两个最小的 VPS,阿里云腾讯云 2C4G 两个省外备份,轻松扛下来。

    基本一天就运营商的递归 dns 请求一些记录,以及极少数瞎改 DNS 的境外请求
    Showfom
        64
    Showfom  
       125 天前
    @realpg #63 因为他们没实战经验呀
    mytsing520
        65
    mytsing520  
       119 天前
    我就自己搞了两台 1C1G 的配置在那里玩,权威 DNS
    hermanzeng
        66
    hermanzeng  
       118 天前
    不同的场景需要到的高可用方式不同,不同的用户请求来源采用的架构不同。
    比如在普通家庭场景,可能部署单台 bind 就能满足自己的日常需要。
    在 10w qps 左右,通过多台 Bind/powerdns 单机可能就能抗住;
    在往上了,可能会通过 ospf 方式播布 vip,后端多台 server ;
    百万 QPS 的话,通过 dpdk 增加 dns 服务器的转发处理性能;
    在用户来源上,针对国内的场景,通过多地多运营商去做服务部署可能就可以满足需求;
    在海外的场景,通过 anycast 的服务 IP 在全球播布;

    在数据同步上,bind 上的数据来源可以是自己写脚本生成的 zone file,各后端都可以跑这个脚本生成这个 zone file,也可以是生成到 master 后通过主从同步到各机器。
    还可以根据业务的实际需求做设计,比如放到同一 db,通过时间戳的方式做数据同步;等等。
    waibunleung
        67
    waibunleung  
    OP
       118 天前
    @hermanzeng 太棒了,想请教一下,流量调度也是可以通过 DNS 来实现的吗?比如想控制 10%的流量去这个机房,90%的流量去那个机房这样子?
    hermanzeng
        68
    hermanzeng  
       113 天前
    @waibunleung 在支持权重设置的权威是可以,比如 DNSPod ;这里取决于权威实现。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2736 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 13:05 · PVG 21:05 · LAX 05:05 · JFK 08:05
    ♥ Do have faith in what you're doing.