【网易云信】DNS 调度原理解析

2023-10-12 03:20

本文主要是介绍【网易云信】DNS 调度原理解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DNS 简介

DNS,现代互联网发展最不可或缺的服务之一,我们从访问网页到发送电子邮件,无时不刻都使用着DNS为我们提供的服务。大家都知道,DNS的核心工作就是将域名翻译成计算机IP地址,一个完整的DNS解析过程如下:

图片描述

1、用户发出 www.sina.com.cn 的域名解析请求,首先查询本地缓存中是否有该域名对应的IP,如果有直接返回,否则,进行第二步;
2、本地缓存服务器向根域名服务器发起 DNS 查询请求,根域名服务器会发送一个回复说,.cn 的域名我已经委派给.cn 这台域名服务器了,给你这台服务器的地址,你去哪里查吧。
3、本地缓存服务器收到这个答复后又向.cn 域名服务器查询,如此迭代,最后.sina.com.cn 的 DNS 服务器会收到这个请求,返回域名的实际IP给本地缓存服务器。
4、本地缓存服务器收到这个答复后,会将这条记录返回给客户端,同时将该记录写入自己的缓存中,以便备查。

DNS 调度原理

现在,大部分应用和业务都采用域名作为服务的入口,因此用 DNS 来负载均衡和区域调度是非常普遍的做法,网易云也有着一套基于 DNS 的调度系统。某些用户在进行直播推流时用的并不是网易云的直播 SDK,而是一些第三方的推流软件,如obs,这样就不能使用我们的 GSLB 全局调度服务器来调度。对于这些用户,我们使用 DNS 调度的方式,对不同地域的请求返回不同解析结果,将请求调度到离用户最近的服务器节点,从而减少延迟访问。

图片描述

咋一看,DNS 调度这么简单方便,那为什么不让所有的用户都走 DNS 调度呢?想知道原因?来,我们继续讲。

  • 地理位置调度不准确

在 DNS 解析过程中,与权威服务器通信的只有 DNS 缓存服务器,所以权威服务器只能根据 DNS 缓存服务器的IP来进行调度。因此 DNS 调度有一个前提:假定用户使用的缓存DNS与用户本身在同个网络内,即至少在同一个 AS(自治域)内,在该前提下,DNS 的解析才是准确的。通常情况下,用户使用 ISP 提供的本地缓存(简称 local DNS),local DNS 一般与用户在同个网络内,这时候 DNS 调度是有效的。
但近些年,不少互联网厂商推广基于 BGP Anycast 的公共 DNS (Public DNS),而这些
Anycaset IP 的节点一般是远少于各个ISP的节点,例如可能广州电信用户使用了某公共 DNS,但该公共 DNS 里用户最近的是上海电信节点,甚至更极端的如 Google DNS 8.8.8.8,在中国大陆没有节点(最近的是台湾)。而不幸的是国内有不少用户使用了 Google DNS,这其实降低了他们的网络访问体验。总的来说,使用公共 DNS,实际上破坏了上文的前提,导致 DNS 区域调度失效,用户以为得到了更快更安全的 DNS 解析,但实际得到了错误的解析,增加了网络访问延迟。
传统 DNS 协议的区域调度过程示例如下图,假定某业务以 foo.163.com 对外提供服务,在北京和东京各有一个节点,业务期望国内大陆的用户访问北京节点,而非大陆用户则访问东京节点。因为权威是根据 DNS 缓存来决定返回的结果,所以当用户使用不用的 DNS 缓存时,可能会解析到不同的结果。

图片描述

2011 年,Google 为首的几家公司在提出了一个 DNS 的扩展方案 edns-client-subnet (以下简称 ECS),该扩展方案的核心思想是通过在 DNS 请求报文里加入原始请求的 IP(即 client 的 IP),使得权威能根据该信息返回正确的结果。目前,该方案仍处于草案阶段。该方案很好地解决了上述提到的 remote DNS 导致解析不准确的问题,但也带了一些问题:

  • 至少需要 cache 和权威都支持,才能完成完整的 ECS 解析
  • ECS 给 cache 增加了很大的缓存压力,因为理论上可能需要为每个IP段分配空间去缓存解析结果

图片描述

  • 规则变更生效时间不确定

当缓存服务器向权威服务器查询得到记录之后,会将其缓存起来,在缓存有效期内,如果收到相同记录的查询,缓存服务器会直接返回给客户端,而不需要再次向权威查询,当有效期过后,缓存则是需要再次发起查询。这个缓存有效期即是 TTL。
虽然 DNS 的缓存机制在大多数情况下缩短了客户端的记录解析时间,但缓存也意味着生效同步的延迟。当权威服务器的记录变更时,需要等待一段时间才能让所有客户端能解析到新的结果,因为很可能缓存服务器还缓存着旧的记录。
我们将权威的记录变更到全网生效这个过程称为 propagation,它的时间是不确定的,理论上的最大值即是 TTL 的值,对于记录变更或删除,这个时间是记录原本的 TTL,对于记录新增则是域的 nTTL 值。
如果一个域名记录原本的 TTL 是 18000,可以认为,变更该记录理论上需要等待 5 个小时才能保证记录能生效到全网。假设该域名的业务方希望缩短切换的时间,正确的做法是,至少提前5个小时修改记录,仅改小 TTL,例如改为5分钟,等待该变更同步到全网之后,再进行修改指向的操作,确认无误再将 TTL 修改为原本的值。
虽然 DNS 协议标准里建议缓存服务器应该记住或者缩短 TTL 的值,但实际上,有一些DNS缓存会修改权威服务器的 TTL,将其变大,这在国内几大运营商中是很常见的。例如,某域记录的 TTL 值实际上设置为 60,但在运营商的 DNS 缓存上,却变成 600 或者更大的值,甚至还有一些 DNS 缓存是不遵循 TTL 机制。这些都会影响域名的实际生效时间。

  • 高可用

为避免受 DNS 缓存的影响,需要保证 DNS 中 A 记录的 IP 节点高可用性。对此,网易云
DNS 调度系统采用的方案是在同一区域的多台直播服务器节点之间做负载均衡,对外只暴露一个虚 IP,这样,即使某台服务器宕机,负载均衡能迅速感知到,排除故障节点,而对 DNS 而言,因为虚 IP 不变而不受影响。

图片描述

总结

现在,大家应该知道了 DNS 调度的利弊了吧,所以推荐大家还是用我们网易云的直播 SDK 哦,接入更加精准的调度系统,保证用户体验。如果您说您就是喜欢用第三方的推流软件,那请不要使用公共 DNS 服务已避免调度结果不准确。


随着音频处理和压缩技术的不断发展,效果更好、适用范围更广、性能更高的算法和新的技术必将不断涌现,如果你有好的技术或者分享,欢迎关注网易 MC 官方博客以及微信公众号:

关注更多技术干货内容: 网易云信博客
欢迎关注 网易云信 GitHub
欢迎关注 网易云信官网

官网微信公众号:
图片描述

这篇关于【网易云信】DNS 调度原理解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192866

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima