静态资源加速

271 阅读5分钟

什么是静态资源加速

在我们的系统中存在着大量的静态资源请求:

  • 对于移动 APP 来说,这些静态资源主要是图片、视频和流媒体信息;
  • 对于 Web 网站来说,则包括了 JavaScript 文件、CSS 文件、静态 HTML 文件等等

读请求量极大并且对访问速度的要求很高还占据了很高的带宽,这时会出现访问速度慢带宽被占满影响动态请求的问题, 这时就需要静态资源加速了

静态资源访问的关键点是就近访问,CDN(Content Delivery Network/Content Distribution Network,内容分发网络)。简单来说,CDN 就是将静态的资源分发到位于多个地理位置机房中的服务器上,因此它能很好地解决数据就近访问的问题,也就加快了静态资源的访问速度

搭建需要考虑的点

  • 如何将用户的请求映射到 CDN 节点上;
  • 如何根据用户的地理位置信息选择到比较近的节点。

如何让用户的请求映射到CDN上

依靠 DNS 来帮我们解决域名映射的问题

DNS(Domain Name System,域名系统)实际上就是一个存储域名和 IP 地址对应关系的分布式数据库。而域名解析的结果一般有两种,一种叫做“A 记录”,返回的是域名对应的 IP 地址;另一种是“CNAME 记录”,返回的是另一个域名,也就是说当前域名的解析要跳转到另一个域名的解析上。实际上 www.baidu.com 域名的解析结果就是一个 CNAME 记录,域名的解析被跳转到 www.a.shifen.com 上了,我们正是利用 CNAME 记录来解决域名映射问题的

比如你的公司的一级域名叫做 example.com,那么你可以把你的图片服务的域名定义为“img.example.com”,然后将这个域名的解析结果的 CNAME 配置到 CDN 提供的域名上,比如 uclound 可能会提供一个域名是“80f21f91.cdn.ucloud.com.cn”这个域名。这样你的电商系统使用的图片地址可以是“img.example.com/1.jpg”, 用户在请求这个地址时,DNS 服务器会将域名解析到 80f21f91.cdn.ucloud.com.cn 域名上,然后再将这个域名解析为 CDN 的节点 IP,这样就可以得到 CDN 上面的资源数据了

www.baidu.com 这个域名为例简单介绍一下域名解析的过程:

  • 一开始,域名解析请求先会检查本机的 hosts 文件,查看是否有 www.baidu.com 对应的 IP;
  • 如果没有的话,就请求 Local DNS 是否有域名解析结果的缓存,如果有就返回标识是从非权威 DNS 返回的结果;
  • 如果没有就开始 DNS 的迭代查询。先请求根 DNS,根 DNS 返回顶级 DNS(.com)的地址;再请求.com 顶级 DNS 得到 baidu.com 的域名服务器地址;再从 baidu.com 的域名服务器中查询到 www.baidu.com 对应的 IP 地址,返回这个 IP 地址的同时标记这个结果是来自于权威 DNS 的结果,同时写入 Local DNS 的解析结果缓存,这样下一次的解析同一个域名就不需要做 DNS 的迭代查询了

如何找到用户最近的CDN节点

GSLB(Global Server Load Balance,全局负载均衡)的含义是对于部署在不同地域的服务器之间做负载均衡,下面可能管理了很多的本地负载均衡组件。它有两方面的作用:

  • 一方面,它是一种负载均衡服务器
  • 一方面,它还需要保证流量流经的服务器与流量源头在地缘上是比较接近的

GSLB 可以通过多种策略来保证返回的 CDN 节点和用户尽量保证在同一地缘区域,比如说可以将用户的 IP 地址按照地理位置划分为若干个区域,然后将 CDN 节点对应到一个区域上,根据用户所在区域来返回合适的节点;也可以通过发送数据包测量 RTT 的方式来决定返回哪一个节点

image.png

CDN 回源

CDN回源是指CDN节点在缓存失效或未命中时,从源服务器上获取资源并缓存到本地节点,以提高用户访问速度和体验,降低源站压力

回源操作分为两种:

  1. 热点资源回源:指大量用户在短时间内请求同一资源,导致CDN节点缓存失效的情况。CDN节点会将该请求转发到源站服务器上获取资源,并在获取到资源后缓存到本地节点,以提高用户访问速度和体验。
  2. 冷门资源回源:指CDN节点上没有该资源的缓存,或者缓存已经过期,需要从源站服务器上获取资源的情况。CDN节点会将该请求转发到源站服务器上获取资源,并缓存到本地节点,以提高后续用户的访问速度。 需要注意的是,CDN回源操作会对源站服务器造成一定的压力,因此需要合理设置CDN缓存时间和回源规则,以减少回源操作的次数,降低源站服务器的负载