最近看了 DNS 解析相关的内容,然后就好奇 dig 了一下公司的一些域名,发现自建了好多二级域名服务器。这么多服务器明显是为了容灾+分流,然后我就在想,DNS 服务器的高可用是怎么保证的?
于是我:
1.搜索了相关的 DNS 集群搭建,发现都是介绍 dns 主从服务器搭建的比较多,说一主多从就算是一个集群,但我觉得这点能力是不太够支撑高可用的
2. 找了下有没有相关大厂 DNS 这块的高可用设计,找到阿里的,但是关于一些细节的描述并没有,看完之后似懂非懂 -> https://zhuanlan.zhihu.com/p/115909472
3. 404 网站找了一番,也是多数关于 DNS 主从服务器的搭建,帮助不算太大
无奈的我只能在这里发帖问问大家,希望有相关经验的家人们能够点拨一下~
dns 解析这一层,是怎么保证高可用的?
用集群冗余备份大概率没跑了,但是集群内部是怎么同步数据的?集群中的每一个节点都向外提供服务吗?
一个进群可能不够,那多个集群之间又是怎么同步的呢?
真的感觉自己知道的太少了~
1
mytsing520 2021-08-02 04:46:08 +08:00
根据楼主提供的阿里文档,接下来所有都是我个人的推( che )论( dan ),如果讲的不对请指出,我没有做过这个规模的,大佬请轻喷。
回到 DNS 本身。除了提升 DNS 服务器本身的服务质量,为了确保高可用,主要通过负载均衡技术实现。你在互联网上看到的一个 IP 地址,其背后会有 N 台服务器来提供支撑。就算有一台挂了,SLB 也会马上抛弃之,确保无论如何最后至少会有一台服务器依然在提供服务。当然,真遇到了 DNS 服务器本身的故障,运维团队也不是吃素的。 同一个主域名下,多组 DNS 的部署,可确保每组 DNS 在一个较大的数据范围内,其承担的解析工作量接近相等。 至于有些厂商针对子域名单独做了 NS (比如 qq.com ),技术层面上面已经做了回答,我想更多的出于管理层面的考虑,毕竟大厂业务多,域名也多。 希望这能回答清楚你的“dns 解析这一层,是怎么保证高可用的?”这个问题。 至于同步数据,为了安全起见,首先订明管理端与实际提供解析服务的服务器分离。 DNS 管理员配置域名解析后,该结果将会保存到数据库。阿里的文档中,负责存储和下发角色的数据库,通过使用集群和多副本存档等技术手段,确保数据的可靠性。 最后,通过数据库向部署的 DNS 下发域名解析配置。文档中提及“应用机房部署与数据库解耦,可以任意机房部署”,这里的“应用机房”就是我们 dig 时看到的那些,他只需要负责接收配置结果并应用于承担外部流量,所以部署在哪里实际上只有事先会比较重要,后期按客户所在地适当调整即可。 至于文中提及的 anycast 、解析结果正确性、安全防护,则是日常应用阶段的延展了。 |
2
mytsing520 2021-08-02 04:51:28 +08:00
至于 DNS 服务本身的架构,你可以是主从架构,也可以是全主。
但在域名委派体系里面,上级域只会给下级域一个主要的服务地址。 |
3
mytsing520 2021-08-02 04:56:32 +08:00
更正:2 楼答复中,将“至于 DNS 服务本身的架构”更正为“至于 DNS 服务本身”。读着读着感觉有问题。
|
4
wd 2021-08-02 06:44:27 +08:00 via iPhone
没太明白楼主的点.. dns 记录挺小的,一个公司内部自己的 dns 记录一般不会很多,因为一般流量入口就是一个 nginx 之类的 lb 集群,这样比如新建一个域名的时候通过 cname 到 lb 的 dns 就行。这样一般变更其实很少,要就是 lb 加减机器的时候会有变更。
另外一个,dns 会有 ttl 的,现代一般 ttl 都很小,例如 5 分钟,那么即使集群同步有问题,也就几分钟的 cache,不会有太大问题。(当然可能会有长尾效应,但是毕竟没多少) |
5
Ariver 2021-08-02 07:35:06 +08:00 via iPhone
看看网络自顶向下
说的很详细 你找的那些都是针对自己的,不是解释 DNS 整体方案的。 |
6
baozhibo 2021-08-02 08:56:30 +08:00
从网络层解决这个问题。可以了解一下 lvs 代理
|
7
huangmingyou 2021-08-02 09:26:52 +08:00
dns 主从直接有同步协议的。不过完全可以手工同步 zone 配置文件,通过 git,rsync 等同步。 有些 dns 服务器是用 mysql 做数据存储的。例如 powerdns 。
|
8
binsys 2021-08-02 09:43:47 +08:00
DNS 高可用不是用 anycast 保证嘛?
|
9
waibunleung OP @wd 是外部的自建 DNS,不是内部的,内部的也有,但是我更感兴趣外部的。内部的全部走内部域名 rpc 的
|
10
waibunleung OP @Ariver 具体是书里面的那一部分?
|
11
waibunleung OP @binsys 你这个是很全局的,我想问的是自建的 NS,是怎么保证其高可用的?
|
12
Ariver 2021-08-02 10:06:26 +08:00
@waibunleung 我只记得在书的前几章,tcp 开始之前,讲到了 dns
|
13
mytsing520 2021-08-02 10:12:14 +08:00
@binsys 外面是 anycast,后面是 LB 负载
|
14
nuk 2021-08-02 10:13:51 +08:00
二级域名服务器不一定是为了分流和灾容,也可能只是为了有自己的 SOP 而已,又不是提供公共 DNS,要啥高可用,顶了天设两个 ns 地址让 dns 自己同步,你发的那个专栏就是公共 DNS,自建 DNS 根本不能比。
|
15
waibunleung OP @mytsing520 老哥可以加个微信交流下吗?
|
16
waibunleung OP @nuk 用户访问规模也不小,1 亿的 pv,为什么 DNS 层不需要高可用呢?我看至少是设置了 6 个 NS 。
|
17
Ariver 2021-08-02 10:26:04 +08:00
dns 本地是有缓存的
|
18
waibunleung OP @Ariver 本地有缓存难道就不需要高可用了吗....你这样说是想说明什么问题呢?就是我知道本地有 DNS 缓存,然后呢....
|
19
nuk 2021-08-02 10:56:36 +08:00
@waibunleung 因为用户不会直接设置 DNS 为自建的 DNS 啊,多少 pv 对于自建 DNS 基本上差别不太大,DNS 本身就会流量放大,缓存是一定要的,至于设置 6 个 ns 服务器,我看是吃饱了撑的。
|
20
crystom 2021-08-02 12:25:00 +08:00
购买国内这些普通的 dns,好像没有办法做主备同步,例如同时购买 2 个云的 dns,没法兼容
|
21
mytsing520 2021-08-02 13:23:30 +08:00
@crystom
阿里云的 DNS,如果买的是企业版本,可以作为从服务器直接对外,隐藏掉自己的主服务器 |
22
dzdh 2021-08-02 13:27:02 +08:00
运营商缓存怎么破
|
23
XiaoxiaoPu 2021-08-02 13:35:00 +08:00
自研 DNS 服务器,不需要传统 DNS 协议的主从同步。跟 Web 服务器的高可用架构没啥区别,区别只是用户协议是 DNS 协议。
|
24
waibunleung OP @XiaoxiaoPu 有稍微被点拨了一下~
web 服务器保证高可用我大概知道些套路,但是我对应不过去。DNS 服务器这一块,服务器故障转移怎么做?解析的记录是怎么同步到不同机房的里面去的?集群又是怎么建起来的? |
25
waibunleung OP @nuk 虽然用户不会直接设置自建的 DNS 地址,但是通过解析和查询,流量还是会到自建 DNS 这一层的呀~
|
26
XiaoxiaoPu 2021-08-02 14:56:43 +08:00
@waibunleung
「 DNS 服务器这一块,服务器故障转移怎么做?」 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP UDP/TCP 层:接入 4 层负载均衡 「解析的记录是怎么同步到不同机房的里面去的?」 数据存储于高可用数据库,DNS 服务器不用关注数据的跨机房同步问题。 「集群又是怎么建起来的?」 解析记录都在数据库里,DNS 服务器本身就是无状态的了,可以任意横向扩展。 |
27
waibunleung OP @XiaoxiaoPu
「 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP 」 现在通过 dig 来看,多个二级域名解析的 NS 就是多个机房 ip,有没有上 anycast 不知道,看不出来 「 UDP/TCP 层:接入 4 层负载均衡」 是否在 DNS 之上再加一层 LVS ? |
28
XiaoxiaoPu 2021-08-02 17:04:51 +08:00
@waibunleung LVS 就是 4 层负载均衡
|
29
v2clay 2021-08-02 17:15:18 +08:00
想的不多,想的太多。
高可用不是由 dns 决定的。 高可用是由多台服务器集群实现 dns 通过解析不同的 ip 地址,来实现负载均衡。 |
30
waibunleung OP @v2clay 你误会我意思了,整个系统有整个系统的高可用设计,每一次有每一层的高可用性设计。就像数据库是这个 web 系统的一部分,但是数据库怎么保证自身的高可用?这里问的就是 DNS 怎么保证自身的高可用?
|
31
waibunleung OP @XiaoxiaoPu
「 IP 层:有条件的搞 anycast,没条件的至少弄多个不同机房的 IP 」 这个可否理解为:多个机房里面都有一个 dns 服务器集群,每个 dns 集群有不同的 ip ?如果是这样的话,dns 集群内的故障转移,是通过 keepalived 之类的健康检查机制来剔除故障的 NS 吗? |
32
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.com 或 www.xx.com 写两条 A 记录。这样用户进行 DNS 解析时,就会解析到两个 IP 地址。正常的浏览器,会选择一个 IP 地址进行访问,如果发现故障,正常的浏览器会切换到另一个 IP 地址,来实现高可用。问题是,很多手机浏览器,没有切换功能。因此如果两个 IP,有一个挂了,那么手机浏览器就无法访问了。 有钱的公司,会买入多线条路,甚至在不同城市买入线路,来防止某个城市整体断电导致网站与服务不可用。 |
33
waibunleung OP @gBurnX 大佬!等的就是你这样的解答
可是我还是有疑问,正如你所说,我 dig 到公司在不同机房里配置了共 6 台 ns 服务器(其实就是南北*3 个不同运营商各一台),那如果这些 ns 后面都是一个集群的话,这个集群是与普通 web 集群一样的吗? DNS 集群内怎么做障转移?不同集群之间怎么做故障转移? |
34
v2clay 2021-08-02 21:07:35 +08:00
@waibunleung # 自己搭建,那就 dns 主从集群。商业 dns 解析服务商 dnspod,底层也差不多用的这个技术。
|
35
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,就向多少个发,总有一个回有响应。简单、粗暴,有效。 |
36
nbsn 2021-08-02 21:20:20 +08:00
其实吧,我认为,DNS 是一个深坑,得针对不同的场景。比如入向的 DNS (被访问)和出向的 DNS (主动访问)是完全不同的。就拿出向的 DNS 来讲,一个简单的例子就是你家里的 DNS 分流,访问国内国外要用不同的 DNS,如果你家里有两条,甚至多条宽带,要分流,如何做 DNS 分流。## 所以,针对场景不同,实现方式也不同。
|
37
v2clay 2021-08-02 21:28:44 +08:00
@waibunleung #31 集群的真正目的是为了保证集群内各个服务的记录相同。
不用剔除机制,完全没有必要。 dns 客户端配置多个 集群内的 dns 服务器,就可以保证高可用。 当有一台有问题,没关系,剩下的接着顶上。 加上报警措施,有足够的时间处理。 |
39
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 解析。 |
40
gBurnX 2021-08-03 00:02:53 +08:00
@v2clay
你完全搞错了,dns 高可用是一个整体工程,我第一条回复的第 4 点,正是这个链条的末端。 另外你也别钻牛角尖,你说配置 2 个 A 记录,不能完全保证业务不受影响,按你这个说法,无论配置多少个 A 记录,也不能完全保证业务不受影响。目前业界的现状是,除开银行这种机构,其他大部分对高可用并不需要极端的需求,双节点冗余,或者说双机热备,在业界是一种非常常规的做法。 |
41
sutra 2021-08-03 02:21:57 +08:00
你拿 bind 跑个 DNS server 就懂了。
|
42
realpg 2021-08-03 07:31:20 +08:00
没你想象那么复杂……
多建几个,不需要集群,增删改查时候,多个服务器都应用一遍即可…… |
43
waibunleung OP @realpg 「增删改查,多个服务器都应用一遍即可」这句话怎么理解?
|
44
waibunleung OP @v2clay 茅塞顿开!
|
45
sutra 2021-08-03 10:23:18 +08:00
「增删改查,多个服务器都应用一遍即可」 - DNS 服务器自带。
|
46
waibunleung OP @gBurnX 「提供故障转移的,是上级代理或负载均衡设备。这些设备会定期检查集群中每个节点的状态,如果节点挂了,上级代理或负载均衡设备就不会把外部请求转发给这些故障节点。」
意思是在 DNS 之上还会有一层负载均衡(如 LVS )来将请求分摊到不同机器?如果是这样的话,整个请求的链路会不会显得复杂? dns query->dns 负载均衡->dns sever->LVS 负载均衡->real server ? |
47
waibunleung OP @sutra 你的意思是,不需要 dns 集群,多建立几个 dns 的服务器,然后有什么解析记录就往各个 DNS 服务器上面添加一下,然后就可以了?
|
48
sutra 2021-08-03 10:35:19 +08:00
DNS 服务软件本身带有类似 master/slave 的广播和增量更新功能。
|
49
waibunleung OP @sutra 这不就是主从吗?
|
50
ishalla 2021-08-03 10:58:57 +08:00
我本来觉得我很懂的,进来看 LZ 讲得我完全不懂了。。
DNS 解析的高可用不就是在一个域名下面解析两个 IP 地址,仅此而已吗?哪里来的主从、群集。。 不会有群集,就是买两条网络,DNS 服务器上填写两个 A 记录,确实这样很可能会双活,两个解析的网络都有流量,但可以通过设置 TTL 实现理论分流——但也只是理论而已,实际使用场景其实大部分时间还是双活,企业级解决方案一般这都是默认接受的风险点。 包括主楼提到的阿里云背后其实也是这样的机制,但阿里云是给一个 DNS 地址填写两个 CNAME,探测到一个域名宕了就切换到另一个,通过设置权重判断主备线。 |
51
waibunleung OP @ishalla 你知道这么多为什么不早说说出来交流一下?
|
52
sleepm 2021-08-03 11:38:47 +08:00
https://www.root101.net/highly-available-bind-dns-cluster-design-million-user
是集群,不过,master 不是主要负责回应查询的而是同步记录的 |
53
ishalla 2021-08-03 11:57:33 +08:00
@waibunleung 刚刚开始摸鱼。。前面那么多楼越看越迷茫,越说越不懂,又花了一点时间思考,这个问题属于架构范畴,我以为 v2 都是搞开发的,也很少带架构玩。。
像你司这样能被 dig 到好几个地址,还要考虑内网外网的问题,甚至 flushdns 一下就得到不同结果了,因为内网还可能引入了 F5 、Palo Alto 之类的产品,会附带所谓的智能 DNS,其实说穿了就是 Nginx,如果考虑 Nginx 配置分流,本楼所有回复都是不全面的。。 所以不能靠 dig 结果去猜测想象,大致明白一个原理就行了,企业级解决方案很复杂的,真感兴趣找 infra team 了解吧。 |
54
waibunleung OP @sleepm 你的链接返回了一个 xml
|
55
waibunleung OP |
56
gBurnX 2021-08-03 13:11:12 +08:00
@waibunleung 觉得复杂,可以去看看系统架构图,或者 tcp 的各种功能实现图...dns 这都算是最简单的了。
|
57
sleepm 2021-08-03 13:14:22 +08:00
|
58
waibunleung OP @gBurnX 系统架构图是哪些?我的意思是找网上的架构图来看?
|
59
Showfom 2021-08-03 13:55:51 +08:00
@waibunleung #16 你得看 DNS 的查询次数,多少 PV 对 DNS 服务器的性能相关性有但是不是特别大,因为用户使用的 ISP 的 DNS 没准等下都是同一个出口呢
一亿 PV 每天而已,自建两台 DNS 服务器也可以撑起来的 |
60
dizangcn009 2021-08-03 20:41:49 +08:00
@gBurnX #40 话不投机半句多
|
61
realpg 2021-08-04 12:41:19 +08:00
@Showfom #59
对国内,十亿 PV 每天的项目,三个最小的云服务器 2C4G 啥的都能 handle,轻松加愉快 实际生产环境 handle 过 也不用集群,dns 集群,高可用啥的都没啥用,对 dns 这种东西根本不需要集群也不需要负载 一个数据库服务器兼配置器(记录保存器),多个最小配置的 vps 作为 dns 服务器,分布在三个供应商的不同地区机房就够了 |
62
Showfom 2021-08-04 12:52:22 +08:00
@realpg #61 是这样的,DNS 基本不需要集群和备份,负载不够了就加机器嘛,况且用户的本地运营商的递归 DNS 都缓存了一大堆,流量越大的域名他们缓存的更久= =尤其是移动
|
63
realpg 2021-08-04 13:22:31 +08:00
@Showfom #62
所以我看之前那些搞笑级别的回复,真的一头雾水。 DNS 协议层就不需要这些,碰瓷概念非得给搞出来 我这边做过本地大项目的 DNS (不是互联网项目,民生刚需项目,天天访问量恐怖),因为主要服务省内,所以省内两大城市两个最小的 VPS,阿里云腾讯云 2C4G 两个省外备份,轻松扛下来。 基本一天就运营商的递归 dns 请求一些记录,以及极少数瞎改 DNS 的境外请求 |
65
mytsing520 2021-08-10 17:17:19 +08:00
我就自己搞了两台 1C1G 的配置在那里玩,权威 DNS
|
66
hermanzeng 2021-08-11 13:20:01 +08:00
不同的场景需要到的高可用方式不同,不同的用户请求来源采用的架构不同。
比如在普通家庭场景,可能部署单台 bind 就能满足自己的日常需要。 在 10w qps 左右,通过多台 Bind/powerdns 单机可能就能抗住; 在往上了,可能会通过 ospf 方式播布 vip,后端多台 server ; 百万 QPS 的话,通过 dpdk 增加 dns 服务器的转发处理性能; 在用户来源上,针对国内的场景,通过多地多运营商去做服务部署可能就可以满足需求; 在海外的场景,通过 anycast 的服务 IP 在全球播布; 在数据同步上,bind 上的数据来源可以是自己写脚本生成的 zone file,各后端都可以跑这个脚本生成这个 zone file,也可以是生成到 master 后通过主从同步到各机器。 还可以根据业务的实际需求做设计,比如放到同一 db,通过时间戳的方式做数据同步;等等。 |
67
waibunleung OP @hermanzeng 太棒了,想请教一下,流量调度也是可以通过 DNS 来实现的吗?比如想控制 10%的流量去这个机房,90%的流量去那个机房这样子?
|
68
hermanzeng 2021-08-16 14:34:24 +08:00
@waibunleung 在支持权重设置的权威是可以,比如 DNSPod ;这里取决于权威实现。
|