CDN加速原理初探

是什么

CDN(全称 Content Delivery Network),内容分发网络。 根据用户位置来获取最近的资源,降低网络拥塞和响应速度。 其实就是利用用户就近的节点来存储源站的信息,从而避免所有用户都访问源站造成性能和网络问题。

不使用cdn时,利用ip发起请求的过程,如广州的用户要请求一个在北京的 IP 地址,过程如下:
广州用户 -> 广州服务器 -> 湖南服务器 -> 湖北服务器 -> 北京服务器

这样传递数据,就很浪费时间,那如果广州服务器就缓存了数据或资源呢,那不就可以就近获取了。这便是cdn的部分策略了。

怎么做到的

这里往往会考到一个常用问题,输入URL网址发生的事情。当然了,了解CDN原理不需要知道那么多。 我们知道在DNS域名解析后会得到主机的IP,然后根据主机的IP发出请求。但是当我们使用CDN后,返回的是一个CNAME(Canonical Name),也就是一个指向CDN的全局负载均衡的别名。 换句话说,CNAME承担了域名解析过程中的代理的角色。

什么是负载均衡

边缘节点,指距离最终用户接入具有较少的中间环节的网络节点。

上面说到,我们得到的是CNAME解析域名到另外一个域名),其实并没有得到主机的IP。这时候本地DNS就会向负载均衡系统发送请求,然后进入到负载均衡系统的调度:

  • 通过用户IP获取到的地理位置确定最近的边缘节点
  • 利用用户网络运营商找到相同网络边缘节点
  • 为用户匹配边缘节点负载轻的节点
  • 为用户匹配带宽能力更适合当前请求内容的节点
  • 为用户匹配响应时间较短的节点

除了这些,还有一些其他条件,通过这些条件的智能整合,最终为用户找到最适合的节点,然后返回给用户这个节点的信息。这个过程也就是负载均衡,在这个过程之后,用户就可以以此来访问CDN的缓存代理

什么是缓存代理

上面讲到用户并非直接得到数据,而是访问缓存代理。缓存系统会有选择地缓存那些最常用的那些资源,其中有两个衡量CDN服务质量的指标:

  • 命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
  • 回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比

缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户

回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,可以有效地减少真正的回源。

通过这种代理的方式,能大大提高资源的命中率和源站的服务能力。

CDN是怎么做资源加速的

首先CDN不是所有的资源都可以加速,为了方便处理一般只对静态资源进行加速。

  • 静态请求是指在不同请求中访问到的数据都相同的静态文件。例如:图片、视频、网站中的文件(html、css、js)、软件安装包、apk文件、压缩包文件等。
  • CDN加速的本质是缓存加速,将您服务器上存储的静态内容缓存在CDN节点上,当您访问这些静态内容时,无需访问服务器源站,就近访问CDN节点即可获取相同内容,从而达到加速的效果,同时减轻服务器源站的压力。

资源的过期如何判定?cdn 是如何更新数据的?

资源过期时间就是请求/响应头部来判定,也就是通过强缓存和协商缓存进行判断:

那么 cdn 是如何更新数据的?

  • 分两种,主动(PUSH)和被动(PULL);
  • 被动,即利用回源就可以被动在途经的 cdn 节点缓存数据。;
  • 主动指的是,我们从服务器(或nginx)主动往 cdn 推送数据,主动刷新所有节点;

参考