DNS-优化HTTP性能的第一步

DNS | 透明多级分流系统

Posted by Booogu on April 17, 2021
2988 字 9 分钟

前言:在开发过程中没有太多存在感的DNS,其实就很符合“透明多级分流”的特点。

多级分流系统设计原则

一条完整的用户请求路径如下:浏览器->DNS指引找到系统入口->经过网关->负载均衡器->缓存->服务集群等一系列设施,最后接触到位于系统末端存储于数据库服务器的信息,然后再逐级返回到用户的浏览器中。

这个过程需要许多技术部件的协作,作为系统的设计者,应该意识到不同的设施部件在系统中,都具有各自不同的价值:

  • 一些位于客户端、网络边缘,能够快速响应用户请求,避免给后方I/O与CPU带来压力,典型的如:本地缓存、内容分发网络、反向代理
  • 有一些部件的处理能力能够线性扩展,易于伸缩,可以通过使用较小的代价堆叠机器,来获得与用户数量相匹配的并发性能,并且应该尽量作为业务逻辑的主要载体,典型的如集群中能自动伸缩的服务节点
  • 有一些部件的稳定服务,对于系统的运行有着全局性的影响,需要时刻保持着容错备份,维护者高可用性,典型的如服务注册中心、配置中心
  • 有一些设施是天生的单点部件,只能依靠机器本身的网络、存储和运算性能来提升处理能力,比如位于系统入口的路由、网关或负载均衡器(它们都可以做集群,但一次网络请求中无可避免至少有一个是单点的部件)、位于请求链末端的传统关系型数据库等,都是典型的容易形成单点的部件。

多级分流的意义

比如,用户请求一张存储在数据库中的图片,浏览器缓存、内容分发网络、反向代理、Web服务器、文件服务器、数据库等,都可以提供这张图片。

因此,如何恰如其分地将请求分流至最合适的组件中,避免大量流量汇集到单点部件(如数据库),同时,依然能够在绝大多数时候保证处理结果的准确性,在单点部件出现故障时,仍能够迅速实施补救措施,这就是系统架构中多级分流的意义。

缓存、节流、主备、负载均衡等措施,都是为了达成多级分流目标的工具与手段,而高可用架构、高并发架构,就是获得的价值。

设计原则

因此,在对系统进行流量规划时,我们需要充分理解这些部件的差异,有两个简单、普适的原则:

  • 第一个原则:尽可能减少单点部件,如果单点无可避免,应最大限度减少到达单点部件的流量

  • 第二个原则:奥卡姆剃刀,如无必要,勿增实体,作为系统设计者,应该认识到,前面提到的多级分流手段、设施,并非越多越好,在构建系统时,必须在真正有明确需求、真正有必要的时候再去考虑部署它们(也符合YAGNI原则),因为并非每一个系统都要追求高并发、高可用,从系统的用户量、峰值流量和团队本身的技术与运维能力出发,来考虑如何部署这些设施,才是最合理的做法

DNS工作原理

DNS的作用就是把便于人类理解的域名地址,转换为便于计算机处理的IP地址。

接下来,以www.icyfenix.com.cn为例,说明DNS的工作原理:

  • 第一步,客户端先检查本地的DNS缓存,查看该域名是否存在,并且根据TTL(存活时间)判断是否有存活的记录。
  • 第二步,客户端将地址发送到本地的DNS(Local DNS),这个DNS服务器可以由用户手动设置,也可以在DHCP分配时或者在拨号时,从PPP服务器中自动获取。
  • 第三步,本地 DNS 收到查询请求后,会按照“是否有 www.icyfenix.com.cn 的权威服务器”→“是否有 icyfenix.com.cn 的权威服务器”→“是否有 com.cn 的权威服务器”→“是否有 cn 的权威服务器”的顺序,依次查询自己的地址记录。如果都没有查询到,本地 DNS 就会一直找到最后点号代表的根域名服务器为止。

  • 第四步,假设本地DNS是全新的,不存在任何域名的权威服务器记录,所以当DNS查询请求按步骤3的顺序,一直查找到根域名服务器后,它将会得到”cn的权威服务器”的地址记录,然后通过”cn的权威服务器”,得到”com.cn的权威服务器”的地址记录,以此类推(递归查询、返回的过程),最后找到能够解释www.icyfenix.com.cn的权威服务器地址。

  • 第五步,通过”www.icyfenix.com.cn的权威服务器”,查询www.icyfenix.com.cn的地址记录。这里的地址记录并不一定就是指IP地址,在RFC规范中,有定义的地址记录类型已经多达几十种,比如IPv4下的IP地址记录为A记录,IPv6下的AAAA记录、主机别名CNAME记录,等等。

DNS工作流

例如,假设一个域名下配置了多条不同的A记录,此时权威服务器可以根据自己的策略来选择,典型的应用是智能线路:根据访问者所处的不同地区(如华北、华南、东北)、不同服务商(如电信、联通、移动)等因素,来确定返回最合适的 A 记录,将访问者路由到最合适的数据中心,达到智能加速的目的

注意,第三步中,涉及到了两个重要概念:

  • 权威域名服务器(Authoritative DNS):是指负责翻译特定域名的 DNS 服务器,“权威”的意思就是说,服务器决定了这个域名应该翻译出怎样的结果。
  • 根域名服务器(Root DNS):是指固定的、无需查询的顶级域名(Top-Level Domain)服务器,可以默认为它们已内置在操作系统代码之中。全世界一共有 13 组根域名服务器(注意并不是 13 台,每一组根域名都通过任播的方式建立了一大群镜像,根据维基百科的数据,迄今已经超过 1000 台根域名服务器的镜像了),之所以有 13 这个数字的限制是因为,DNS 主要是采用 UDP 传输协议(在需要稳定性保证的时候也可以采用 TCP)来进行数据交换的,未分片的 UDP 数据包在 IPv4 下最大有效值为 512 字节,最多可以存放 13 组地址记录。

DNS设计存在的问题和解决方案

响应速度问题

问题描述:响应速度会影响,在极端情况下(如各级服务器均无缓存),域名解析可能导致每个域名都必须递归多次才能查询到结果,显著地影响传输的响应速度。

解决方案:专门有一种前端优化手段来避免上述问题——DNS预取(DNS Prefetching):如果网站后续要使用来自于其他域的资源,那就在网页加载时便生成一个link请求,促使浏览器提前对该域名进行预解释,如下所示:

1
<link rel="dns-prefetch" href="//domain.not-icyfenx.cn">  

中间人劫持风险

问题描述:DNS的分级查询意味着每一级都有可能受到中间人攻击的威胁,产生被劫持的风险。

要攻陷位于递归链条底层的(如根域名服务器,cn权威服务器)服务器和链路是非常困难的,它们都有很专业的安全防护措施。但是很多位于递归链路底层的、或者来自本地运营商的LocalDNS服务器,安全防护就相对松懈,甚至不少地区的运行商自己就会主动进行劫持,专门返回一个错的IP,通过在这个IP上代理用户请求,以便给特定类型的资源(主要为HTML)注入广告,进行牟利。

解决方案:最近几年出现了一种新的DNS工作模式:HTTPDNS(也称为DNS over HTTPS DoH)。它把原本的DNS解析服务开放为一个基于HTTPS协议的查询服务,替代基于UDP传输协议的DNS域名解析,通过程序代替操作系统直接从权威DNS,或者可靠Local DNS获取解析数据,从而绕过传统Local DNS。

这个做法的好处是免去了“中间商赚差价”的环节,不再惧怕底层(操作系统服务)的域名劫持,能有效避免Local DNS不可靠而导致域名生效缓慢、来源IP不准确、产生智能线路切换错误等问题