我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!
文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。
当你在访问淘宝、京东准备剁手的时候,虽然进入页面的时候有很多的图片、很多的内容,但是加载起来却很快,让你剁手的动作如水般丝滑。嗖的一下好看的商品图片就出来了,嗖的一下就付款了。当然图片算是比较小的资源了,那些视频网站呢,每一个视频好几百M、好几个G,同时有好多的请求过来,就算服务器能抗住,带宽能跟的上吗?
难道就是靠大厂背后充足的服务器、宽带资源以及过硬的优化技术了吗?当然了,这肯定是必要的条件,除此之外就靠我们今天要说的 CDN 技术了。
什么是 CDN
CDN即内容分发网络(Content Delivery Network)的简称,是建立在承载网基础上的虚拟分布式网络,能够将源站内容(包括各类动静态资源)智能缓存到全球各节点服务器上。这样不仅方便了用户就近获取内容,提高了资源的访问速度,也分担了源站压力。
CDN(Content Delivery Network)是指内容分发网络,也称为内容传送网络,这个概念始于1996年,是美国麻省理工学院的一个研究小组为改善互联网的服务质量而提出的。为了能在传统IP网上发布丰富的宽带媒体内容,他们提出在现有互联网基础上建立一个内容分发平台专门为网站提供服务,并于1999年成立了专门的CDN服务公司,为Yahoo提供专业服务。由于CDN是为加快网络访问速度而被优化的网络覆盖层,因此被形象地称为“网络加速器”。
CDN 的核心就是加快网络访问速度,看下面这张图,不同地方的终端用户会访问到最近的 CDN 服务器,而 CDN 服务器上的内容是源服务器集群上的,不管是通过主动拉取还是被动接收的,总之数据内容是一致的,而且离用户最近,获取成本最小速度更快。
现在国内一些比较有实力的大公司会自建 CDN 网络,用来提升服务性能,当然,成本也是很巨大的,想想看啊,方便用户就近获取内容就意味着要在各个地方建立内容节点服务器,就不说向全世界提供服务,就面向整个中国,就要有多少个节点吧。
好在现在很多国内云服务提供商都有 CDN 服务,可以大大降低自建 CDN 的成本。
使用场景
从 CDN 含义本身分析,内容分发网络嘛,肯定是需要快速获取内容的场景才需要 CDN。这些内容包括以下这些:
- 网站中的静态资源文件,比如图片、js 脚本、样式文件等小文件;
- 大文件,比如一些软件下载站、一些视频、图像资源下载站等;
- 在线音频、视频网站,比如网易云音乐、腾讯视频等;
比如我打开天猫商城看了一下,看到其中很多静态文件都来自于不同的域名,有很多域名中带着 CDN 字样,明显都是来自于 CDN 节点的。
那都是静态文件啊,动态内容能不能也放到 CDN 上呢?那这就变味儿了,CDN 只放静态内容可以快速简单的实现,如果加入动态内容,那不就成了多机房分布式部署了吗。倒也不是没有折中的办法,边缘计算就是这样一种策略,边缘节点既能做 CDN,也具备一些计算能力,可以有一些简单的动态执行能力。这就不在讨论的范围之内了。
如果你做过前端开发的话,可能用过一些 JavaScript 开发CDN,比如七牛云和又拍云等等。
原理
没有 CDN 的请求路径
在没有 CDN 的情况下,一次资源请求的路径是什么样子的呢。
1、首先用户在浏览器输入域名,比如进入天猫主页;
2、用户所在的电脑查询 hosts 中看是否有对应的 IP ,如果有就直接请求 IP;
3、如果没有在本地缓存,则向本地 DNS 发起请求,本地 DNS 查找域名对应的 IP(一般是 A 记录);
4、如果本地 DNS 没有找到,则向上级 DNS 服务器请求,一级一级的知道查到最顶级 DNS 服务器;
5、向找到的域名对应的 IP 发起请求;
6、资源所在的集群向客户端返回请求的资源,比如图片、样式文件、视频文件等;
有了 CDN 之后
当有了 CDN 接入之后,事情就稍微变得复杂了一点。
1、用户在浏览器输入域名,比如进入天猫主页;
2、用户所用的电脑向本地 DNS 服务器请求,查询域名的IP地址;
3、本地 DNS 服务器中如果缓存有这个域名的记录,则直接响应用户的解析请求,否则本地DNS向根DNS 查询域名的授权服务器;
4、根DNS将域名授权DNS记录返回给本地DNS;
5、本地 DNS 得到域名的授权DNS记录后,继续向域名授权DNS查询域名的IP地址;
6、域名授权DNS查询域名记录后(一般是CNAME),返回给本地DNS;
7、本地DNS得到域名记录后,向智能DNS查询域名的IP地址;
8、智能DNS根据一定的算法和策略(比如静态拓扑,容量等),将最合适的CDN节点IP地址返回给 本地DNS;
9、本地DNS将得到的域名IP地址,返回给用户终端;
10、用户得到域名IP地址后,访问站点服务器;
11、CDN节点服务器应答请求,将内容返回给客户端,CDN服务器同时在本地进行保存,以备下次使用。
下面的流程图画出了整个请求过程。
大致的流程就是上面的样子,真实情况下,智能 DNS 可能更加复杂一些。因为一个地区的 CDN 很可能不是单纯的一台机器或一个集群,而是一个小范围的分布式部署。
比如全国范围内是一个大的 CDN 网络,那智能 DNS 其实就是一个智能负载均衡器,它会根据一系列的指标,比如地理位置、线路等情况返回一个 IP 地址,这个地址可能并不是一个 CDN 服务器的 IP,而是一个小范围的智能负载均衡器地址,这个负载均衡器可能协调的某一个省的 CDN 节点,当定向到这个负载均衡器之后,又会根据一系列的指标,将返回一个最合适的 CDN 节点的 IP 给客户端。
CDN 核心部件
智能 DNS
智能调度DNS是CDN服务中的关键系统,当用户访问加入CDN服务的网站时,域名解析请求将最终由 “智能调度DNS”负责处理。它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。同时它需要与分布在各地的CDN节点保持通信,跟踪各节点的健康状态、容量等信息,确保将用户的请求分配到就近可用的节点上。
缓存功能服务
负载均衡器
CDN 节点通常都是以集群或者区域集群的形式存在的,负载均衡器可以将请求分派到最合适的 CDN 服务器上。负载均衡器可能是硬件 F5,也可能是 LVS、HA、Nginx 等软件形式。
内容缓存服务器
CND 提供的就是内容加速,当然要有地方存内容了。如果是小的静态文件还好,如果是大的视频文件等,那对大容量的存储和高速读也是有一定要求的。
内容管理服务
最开始内容都是存储在源服务器中的,那总得想办法让内容存储到各个 CDN 节点上。那通过什么方式呢,最简单的办法就是当客户端访问的某个 CDN 之后,发现里面没有需要的内容,就到源服务器上去拉取。
内容传输可以有两种模式,一种推模式,一种拉模式。推模式是源服务器像各个 CDN 节点主动推送,这种方式就比较灵活了,但是实现比较复杂,假设有个管理控制台,管理员选择某些需要推送的文件,然后选择需要推送的 CDN 节点,点击推送按钮,将文件主动推送过去。
指标
通用指标
衡量 CDN 服务的性能有如下几个指标:
- 延时:指一个数据包从用户的计算机发送到网站服务器,然后再立即从网站服务器返回用户计算机的来回时间。延时越低,性能越好。
- 下载速度:指用户从网络上或者网络服务器上下载的数据时的传输速度。下载速度越快,性能越好。
- 打开速度:指用户打开网站的速度。打开速度越快,性能越好。
- 丢包率:指用户在网络传输中所丢失数据包数量占所发送数据组的比率。
- 回源率:回源率分为回源请求数比例及回源流量比例两种。
- 回源请求数比:指边缘节点对于没有缓存、缓存过期(可缓存)和不可缓存的请求占全部请求记录的比例。越低则性能越好。
- 回源流量比:回源流量是回源请求文件大小产生的流量和请求本身产生的流量。所以回源流量比=回源流量/(回源流量+用户请求访问的流量),比值越低,性能越好。
- 缓存命中率:指终端用户访问加速节点时,该节点已缓存了要被访问的数据的次数占全部访问次数的比例。缓存命中率越高,性能越好。
好处
1、本地Cache加速,提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性;
2、镜像服务消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量;
3、远程访问用户根据DNS负载均衡技术,智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度;
4、带宽优化:自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能;
5、集群抗攻击:广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种DDos攻击对网站的影响,同时保证较好的服务质量 。
这位英俊潇洒的少年,如果觉得还不错的话,给个推荐可好!
公众号「古时的风筝」,Java 开发者,全栈工程师,bug 杀手,擅长解决问题。
一个兼具深度与广度的程序员鼓励师,本打算写诗却写起了代码的田园码农!坚持原创干货输出,你可选择现在就关注我,或者看看历史文章再关注也不迟。长按二维码关注,跟我一起变优秀!