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

2021-08-02 04:13:43 +08:00
 waibunleung

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

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

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

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

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

9104 次点击
所在节点    DNS
68 条回复
mytsing520
2021-08-02 13:23:30 +08:00
@crystom
阿里云的 DNS,如果买的是企业版本,可以作为从服务器直接对外,隐藏掉自己的主服务器
dzdh
2021-08-02 13:27:02 +08:00
运营商缓存怎么破
XiaoxiaoPu
2021-08-02 13:35:00 +08:00
自研 DNS 服务器,不需要传统 DNS 协议的主从同步。跟 Web 服务器的高可用架构没啥区别,区别只是用户协议是 DNS 协议。
waibunleung
2021-08-02 14:12:56 +08:00
@XiaoxiaoPu 有稍微被点拨了一下~
web 服务器保证高可用我大概知道些套路,但是我对应不过去。DNS 服务器这一块,服务器故障转移怎么做?解析的记录是怎么同步到不同机房的里面去的?集群又是怎么建起来的?
waibunleung
2021-08-02 14:14:35 +08:00
@nuk 虽然用户不会直接设置自建的 DNS 地址,但是通过解析和查询,流量还是会到自建 DNS 这一层的呀~
XiaoxiaoPu
2021-08-02 14:56:43 +08:00
@waibunleung

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

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

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

「 UDP/TCP 层:接入 4 层负载均衡」
是否在 DNS 之上再加一层 LVS ?
XiaoxiaoPu
2021-08-02 17:04:51 +08:00
@waibunleung LVS 就是 4 层负载均衡
v2clay
2021-08-02 17:15:18 +08:00
想的不多,想的太多。
高可用不是由 dns 决定的。
高可用是由多台服务器集群实现
dns 通过解析不同的 ip 地址,来实现负载均衡。
waibunleung
2021-08-02 17:27:15 +08:00
@v2clay 你误会我意思了,整个系统有整个系统的高可用设计,每一次有每一层的高可用性设计。就像数据库是这个 web 系统的一部分,但是数据库怎么保证自身的高可用?这里问的就是 DNS 怎么保证自身的高可用?
waibunleung
2021-08-02 17:30:03 +08:00
@XiaoxiaoPu
「 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP 」
这个可否理解为:多个机房里面都有一个 dns 服务器集群,每个 dns 集群有不同的 ip ?如果是这样的话,dns 集群内的故障转移,是通过 keepalived 之类的健康检查机制来剔除故障的 NS 吗?
gBurnX
2021-08-02 19:39:25 +08:00
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
2021-08-02 20:26:08 +08:00
@gBurnX 大佬!等的就是你这样的解答
可是我还是有疑问,正如你所说,我 dig 到公司在不同机房里配置了共 6 台 ns 服务器(其实就是南北*3 个不同运营商各一台),那如果这些 ns 后面都是一个集群的话,这个集群是与普通 web 集群一样的吗? DNS 集群内怎么做障转移?不同集群之间怎么做故障转移?
v2clay
2021-08-02 21:07:35 +08:00
@waibunleung # 自己搭建,那就 dns 主从集群。商业 dns 解析服务商 dnspod,底层也差不多用的这个技术。
v2clay
2021-08-02 21:19:38 +08:00
@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
2021-08-02 21:20:20 +08:00
其实吧,我认为,DNS 是一个深坑,得针对不同的场景。比如入向的 DNS (被访问)和出向的 DNS (主动访问)是完全不同的。就拿出向的 DNS 来讲,一个简单的例子就是你家里的 DNS 分流,访问国内国外要用不同的 DNS,如果你家里有两条,甚至多条宽带,要分流,如何做 DNS 分流。## 所以,针对场景不同,实现方式也不同。
v2clay
2021-08-02 21:28:44 +08:00
@waibunleung #31 集群的真正目的是为了保证集群内各个服务的记录相同。
不用剔除机制,完全没有必要。
dns 客户端配置多个 集群内的 dns 服务器,就可以保证高可用。
当有一台有问题,没关系,剩下的接着顶上。
加上报警措施,有足够的时间处理。
ETiV
2021-08-02 21:41:22 +08:00
帮你 @naizhao,DNSPod 创始人
gBurnX
2021-08-02 23:56:52 +08:00
@waibunleung

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

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

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

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

另外你也别钻牛角尖,你说配置 2 个 A 记录,不能完全保证业务不受影响,按你这个说法,无论配置多少个 A 记录,也不能完全保证业务不受影响。目前业界的现状是,除开银行这种机构,其他大部分对高可用并不需要极端的需求,双节点冗余,或者说双机热备,在业界是一种非常常规的做法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793060

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX