本期作者
魏志雄 - 基础设施部高级运营工程师
01 引言
这
域名系统(DNS)就像互联网的地址簿,通过将一个或多个复杂的IP地址映射到易于识别和记忆的域名上,使人们可以通过简单的域名(如简单的域名)方便地访问互联网资源。最重要的是,DNS还提供重要的服务,例如负载均衡。是互联网基础设施的重要组成部分。
基于 DNS 的私有 DNS 服务提供一些额外的好处:
1. 私有域名
2. DNS劫持
3. 具体业务逻辑支持
4. 极低的解析延迟和极高的吞吐量
因此,本文将分享B站内网DNS服务建设的相关实践。
02 架构演进
考虑到基础设施的稳定性,我们选择了最知名和最广泛的 DNS 实现 BIND9 作为 DNS。
在进入体系结构之前,让我们简要了解一下 DNS 中最常用的两个角色:
权威名称是实际持有并负责特定域的资源记录的服务器,通常是解析器查找 IP 地址以及这些域的最终解释过程的最后一步。
这
在软件层实现权威名称可以分为主权限和从权限。对于DNS查询,主从权限是平等的,但它在软件架构中提供了必要的故障恢复和水平扩展能力。
解析器通常是 DNS 查询的第一站,处理用户的递归查询并提供完整的答案。当收到请求时,解析器会向 DNS 层次结构发出一个或多个迭代查询。在获得完整的答案(或错误)后,解析器将答案传递给用户,并将记录放入其缓存中。用户对同一查询的后续请求将从解析器的缓存中得到应答,直到缓存记录的 TTL 过期,此时它将从缓存中刷新;下一个请求相同信息的用户查询将导致对 DNS 层次结构的一系列新查询。
在不同的用例中,解析器通常由混淆的名称来引用,例如缓存名称服务器、递归名称服务器、转发解析器、区域解析器和全方位服务解析器。
典型的域名解析流程图:
1. 第一代DNS架构
B站早期第一代内网DNS服务架构相对简单,核心注重高可用性和稳定性,采用主从模式,保证每个核心IDC都有独立的从权威集群,通过VIP提供负载均衡,并通过VIP健康检查机制自动踢出故障节点。同时,各IDC机房的内网互联互通,相互备份。
随着业务的发展,在高QPS场景下,主从权威区域配置同步过程中,分辨率持续时间突然增加,响应延迟不稳定。其次,来自权威的可扩展性也相对较弱。因此,我们衍生出了第二代 DNS 架构。
2. 第二代DNS架构
第二代DNS架构主要引入多级缓存。
首先是 Name 的引入,大大提高了可扩展性。同时,也避免了权威节点配置/区域变更导致的抖动。
二是引入NSCD作为缓存服务,针对大数据、AI等QPS极高的服务。它不仅可以减少响应延迟,还可以提高整体服务吞吐量。
除此之外,第二代架构还对 BIND9 进行了升级和优化。虽然 BIND9 支持多线程,但在 9.11 早期版本中,我们最多只能使用高达 400% 的 CPU,单个实例的峰值 QPS 约为 100,000。在新版本中,由于支持、日志写入缓存等新功能,性能得到了大幅提升,单个实例可以充分利用多核CPU,而且在生产环境的压测中,单机QPS超过150万,所以我们也进行了线上升级。
03 DNS服务监控建设
DNS 服务监控警报分为三个级别:
1. 主机层
2. 业务层
3. 结束
1. 主机层
在
主机层,通常存在 CPU、内存、网络、磁盘等资源使用率、饱和度、错误监控等告警。在这里,我们主要强调两个容易被忽视或对 DNS 服务很重要的监控警报。
2. 业务层
3. 末端检测报警
这
服务内部的监控并不总能反映用户访问服务器的质量,因此我们在每个数据中心部署多个探针,模拟真实的用户请求,并在多个区域和域中高频率地监控每个探针的可用性、内容正确性和响应延迟。通过探查,我们及时发现了业务方尚未察觉到的网络设备bug和网络拥塞。
同时,当异常发生时,可以使用要添加的网络ping延迟和丢包率监测功能来辅助判断。
作为参考,公共DNS也不稳定,需要进行监控和警报。目前我们的实践经验是,阿里云公共DNS的稳定性相对来说要好一些。
04 进站体验
在一个复杂的系统中,总会有很多细节,我们在使用的早期阶段是无法理解或掌握的,所以这里有一些我们已经克服的陷阱,以帮助你走上自己的道路。还建议阅读“常见的DNS操作和配置错误”[3]。
1. 确保 UDP 和 TCP 端口均可供用户访问
通常,DNS默认使用UDP传输,当RFC中约定当DNS使用UDP传输时,数据包体需要小于或等于512字节(不包括IP或UDP头)。512 字节的限制在大多数情况下可以满足要求,但当记录值过长并且超过限制时,端需要将 TC 位设置为 1,以告诉要截断的响应。当您收到 TC 位为 1 的响应时,您需要使用 TCP 重新启动请求。这要求 TCP 端口也必须是可访问的。
基于以上信息,我们也提醒大家,在选择域名时,应尽量简短,记录值应尽可能简单,以提高解析速度。
2.区域配置更改后必须增加序列号
主从权限的同步过程如下:
(1)变更主节点区域配置,向从节点发送通知
(2) 从服务器返回并向主机发起 SOA 查询
(3) 主节点返回 SOA
(4)比较SOA中的序列号是否大于节点的序列号,仅当SOA序列号大于SOA的序列号时才启动区域,并使用TCP端口53进行数据传输
因此,在区域配置更改后,必须增加序列号,否则主从节点的数据将不一致。
3. 使用 rndc flush 刷新整个缓存
如果直接使用rndc flush来刷新全量缓存,对于NSCD等客户端缓存,每次客户端缓存过期都可能导致QPS过高。
因此,只要有可能,请使用 或 刷新指定的域名或区域。
4. 谨慎对待泛域名解析
通配符DNS是指使用通配符*将所有子域名指向同一DNS记录,以实现灵活配置。但是,当一个子域名需要独立配置时,很容易忽略泛域名的配置,导致故障。
下面是一个示例(基于真实的失败),以使每个人都更容易理解:
(1)在服务启动之初,采用泛域名解析,方便配置:*。别名
(2)经过一段时间的发展,有新的需求,需要增加一个TXT进行验证
(3)运维学生添加和解析TXT xxx
(4)此时,由于只有TXT记录,没有A/AAAA或CNAME,因此站点A无法直接访问
05 结语
基础设施服务具有杠杆效应,良好的基础设施服务可以帮助企业提高效率,降低开发和运营成本。作为基础设施一部分的私有 DNS 也是如此。我们以业务需求为基础,不断发展迭代,致力于提供稳定、可靠、易用、易用的服务。
引用:
[1] BIND 9 管理员参考手册 (
)
[2] 域名 – 实施和规范 (
)
[3] 常见 DNS 操作和配置错误 (
)
[4] ISC 知识库中有关 BIND 和 DNS 的系列文章 (
)
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。