37 | CDN:加速我们的网络服务
下载APP
关闭
渠道合作
推荐作者
37 | CDN:加速我们的网络服务
2019-08-21 Chrono 来自北京
《透视HTTP协议》
课程介绍
讲述:Chrono
时长11:02大小12.62M
在正式开讲前,我们先来看看到现在为止 HTTP 手头都有了哪些“武器”。
协议方面,HTTPS 强化通信链路安全、HTTP/2 优化传输效率;应用方面,Nginx/OpenResty 提升网站服务能力,WAF 抵御网站入侵攻击,讲到这里,你是不是感觉还少了点什么?
没错,在应用领域,还缺一个在外部加速 HTTP 协议的服务,这个就是我们今天要说的 CDN(Content Delivery Network 或 Content Distribution Network),中文名叫“内容分发网络”。
为什么要有网络加速?
你可能要问了,HTTP 的传输速度也不算差啊,而且还有更好的 HTTP/2,为什么还要再有一个额外的 CDN 来加速呢?是不是有点“多此一举”呢?
这里我们就必须要考虑现实中会遇到的问题了。你一定知道,光速是有限的,虽然每秒 30 万公里,但这只是真空中的上限,在实际的电缆、光缆中的速度会下降到原本的三分之二左右,也就是 20 万公里 / 秒,这样一来,地理位置的距离导致的传输延迟就会变得比较明显了。
比如,北京到广州直线距离大约是 2000 公里,按照刚才的 20 万公里 / 秒来算的话,发送一个请求单程就要 10 毫秒,往返要 20 毫秒,即使什么都不干,这个“硬性”的时延也是躲不过的。
另外不要忘了, 互联网从逻辑上看是一张大网,但实际上是由许多小网络组成的,这其中就有小网络“互连互通”的问题,典型的就是各个电信运营商的网络,比如国内的电信、联通、移动三大家。
这些小网络内部的沟通很顺畅,但网络之间却只有很少的联通点。如果你在 A 网络,而网站在 C 网络,那么就必须“跨网”传输,和成千上万的其他用户一起去“挤”连接点的“独木桥”。而带宽终究是有限的,能抢到多少只能看你的运气。
还有,网络中还存在许多的路由器、网关,数据每经过一个节点,都要停顿一下,在二层、三层解析转发,这也会消耗一定的时间,带来延迟。
把这些因素再放到全球来看,地理距离、运营商网络、路由转发的影响就会成倍增加。想象一下,你在北京,访问旧金山的网站,要跨越半个地球,中间会有多少环节,会增加多少时延?
最终结果就是,如果仅用现有的 HTTP 传输方式,大多数网站都会访问速度缓慢、用户体验糟糕。
什么是 CDN?
这个时候 CDN 就出现了,它就是专门为解决“长距离”上网络访问速度慢而诞生的一种网络应用服务。
从名字上看,CDN 有三个关键词:“内容”“分发”和“网络”。
先看一下“网络”的含义。CDN 的最核心原则是“就近访问”,如果用户能够在本地几十公里的距离之内获取到数据,那么时延就基本上变成 0 了。
所以 CDN 投入了大笔资金,在全国、乃至全球的各个大枢纽城市都建立了机房,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。这个网络是跨运营商、跨地域的,虽然内部也划分成多个小网络,但它们之间用高速专有线路连接,是真正的“信息高速公路”,基本上可以认为不存在网络拥堵。
于是,用户在上网的时候就不直接访问源站,而是访问离他“最近的”一个 CDN 节点,术语叫“边缘节点”(edge node),其实就是缓存了源站内容的代理服务器,这样一来就省去了“长途跋涉”的时间成本,实现了“网络加速”。
那么,CDN 都能加速什么样的“内容”呢?
在 CDN 领域里,“内容”其实就是 HTTP 协议里的“资源”,比如超文本、图片、视频、应用程序安装包等等。
资源按照是否可缓存又分为“静态资源”和“动态资源”。所谓的“静态资源”是指数据内容“静态不变”,任何时候来访问都是一样的,比如图片、音频。所谓的“动态资源”是指数据内容是“动态变化”的,也就是由后台服务计算生成的,每次访问都不一样,比如商品的库存、微博的粉丝数等。
很显然,只有静态资源才能够被缓存加速、就近访问,而动态资源只能由源站实时生成,即使缓存了也没有意义。不过,如果动态资源指定了“Cache-Control”,允许缓存短暂的时间,那它在这段时间里也就变成了“静态资源”,可以被 CDN 缓存加速。
套用一句广告词来形容 CDN 吧,我觉得非常恰当:“我们不生产内容,我们只是内容的搬运工。”
CDN,正是把“数据传输”这件看似简单的事情“做大做强”“做专做精”,就像专门的快递公司一样,在互联网世界里实现了它的价值。
CDN 的负载均衡
全局负载均衡(Global Sever Load Balance)一般简称为 GSLB,它是 CDN 的“大脑”,主要的职责是当用户接入网络的时候在 CDN 专网中挑选出一个“最佳”节点提供服务,解决的是用户如何找到“最近的”边缘节点,对整个 CDN 网络进行“负载均衡”。
原来没有 CDN 的时候,权威 DNS 返回的是网站自己服务器的实际 IP 地址,浏览器收到 DNS 解析结果后直连网站。
但加入 CDN 后就不一样了,权威 DNS 返回的不是 IP 地址,而是一个 CNAME( Canonical Name ) 别名记录,指向的就是 CDN 的 GSLB。它有点像是 HTTP/2 里“Alt-Svc”的意思,告诉外面:“我这里暂时没法给你真正的地址,你去另外一个地方再查查看吧。”
因为没拿到 IP 地址,于是本地 DNS 就会向 GSLB 再发起请求,这样就进入了 CDN 的全局负载均衡系统,开始“智能调度”,主要的依据有这么几个:
看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点;
看用户所在的运营商网络,找相同网络的边缘节点;
检查边缘节点的负载情况,找负载较轻的节点;
其他,比如节点的“健康状况”、服务能力、带宽、响应时间等。
GSLB 把这些因素综合起来,用一个复杂的算法,最后找出一台“最合适”的边缘节点,把这个节点的 IP 地址返回给用户,用户就可以“就近”访问 CDN 的缓存代理了。
CDN 的缓存代理
缓存系统是 CDN 的另一个关键组成部分,相当于 CDN 的“心脏”。如果缓存系统的服务能力不够,不能很好地满足用户的需求,那 GSLB 调度算法再优秀也没有用。
但互联网上的资源是无穷无尽的,不管 CDN 厂商有多大的实力,也不可能把所有资源都缓存起来。所以,缓存系统只能有选择地缓存那些最常用的那些资源。
这里就有两个 CDN 的关键概念:“命中”和“回源”。
“命中”就是指用户访问的资源恰好在缓存系统里,可以直接返回给用户;“回源”则正相反,缓存里没有,必须用代理的方式回源站取。
相应地,也就有了两个衡量 CDN 服务质量的指标:“命中率”和“回源率”。命中率就是命中次数与所有访问次数之比,回源率是回源次数与所有访问次数之比。显然,好的 CDN 应该是命中率越高越好,回源率越低越好。现在的商业 CDN 命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上。
怎么样才能尽可能地提高命中率、降低回源率呢?
首先,最基本的方式就是在存储系统上下功夫,硬件用高速 CPU、大内存、万兆网卡,再搭配 TB 级别的硬盘和快速的 SSD。软件方面则不断“求新求变”,各种新的存储软件都会拿来尝试,比如 Memcache、Redis、Ceph,尽可能地高效利用存储,存下更多的内容。
其次,缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户。回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,这样最终“扇入度”就缩小了,可以有效地减少真正的回源。
第三个就是使用高性能的缓存服务,据我所知,目前国内的 CDN 厂商内部都是基于开源软件定制的。最常用的是专门的缓存代理软件 Squid、Varnish,还有新兴的 ATS(Apache Traffic Server),而 Nginx 和 OpenResty 作为 Web 服务器领域的“多面手”,凭借着强大的反向代理能力和模块化、易于扩展的优点,也在 CDN 里占据了不少的份额。
小结
CDN 发展到现在已经有二十来年的历史了,早期的 CDN 功能比较简单,只能加速静态资源。随着这些年 Web 2.0、HTTPS、视频、直播等新技术、新业务的崛起,它也在不断进步,增加了很多的新功能,比如 SSL 加速、内容优化(数据压缩、图片格式转换、视频转码)、资源防盗链、WAF 安全防护等等。
现在,再说 CDN 是“搬运工”已经不太准确了,它更像是一个“无微不至”的“网站保姆”,让网站只安心生产优质的内容,其他的“杂事”都由它去代劳。
由于客观地理距离的存在,直连网站访问速度会很慢,所以就出现了 CDN;
CDN 构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速;
GSLB 是 CDN 的“大脑”,使用 DNS 负载均衡技术,智能调度边缘节点提供服务;
缓存系统是 CDN 的“心脏”,使用 HTTP 缓存代理技术,缓存命中就返回给用户,否则就要回源。
课下作业
网站也可以自建同城、异地多处机房,构建集群来提高服务能力,为什么非要选择 CDN 呢?
对于无法缓存的动态资源,你觉得 CDN 也能有加速效果吗?
欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 16
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
36 | WAF:保护我们的网络服务
下一篇
38 | WebSocket:沙盒里的TCP
精选留言(24)
- -W.LI-2019-08-211.自建成本太高,一般的公司玩不起 2.cache-control允许缓存的动态资源可以被CDN缓存。不允许缓存的动态资源会回源,虽然老师课上没讲,感觉回源的路径会被优化。
作者回复: 1.对 2.cdn一般有专用的高速网络直连源站,或者是动态路径优化,所以动态资源回源要比通过公网速度快很多。
共 3 条评论27 - 前端西瓜哥2019-08-23如果请求的是动态资源,走 CDN 貌似会更慢(因为无法缓存,CDN到源站多了握手过程)? 我想到两个方案: (1)静态资源都放到一个域名里,然后这个域名使用 CDN 缓存加速。动态资源则使用另一个域名,不进行 CDN 缓存,直接访问源站。 (2)让动态资源也走 CDN,像老师说的那样, CDN 有高速网络直连源站,速度也能提高,但这里貌似也是会有不少带宽支出。 我想知道实际中,请求动态资源具体到底是怎么考虑,一般使用什么方案?展开
作者回复: 现在cdn有种叫“边缘计算”的技术,就是把计算动态资源的代码和数据也放在cdn的节点上,这样就可以在cdn里获取动态资源不用回源站了。 cdn与源站通常都有专网连接,所以走cdn也比走公网快。
共 5 条评论19 - book尾汁2019-11-041 是的自建成本很高 2 虽然是动态资源会回源,但是用户通过GSLB得到的边缘节点的ip也是离用户较近的,边缘节点到中心 中心节点到源站的网络也是很快的,综合来说还是要比用户直接访问快点。支持动态加速的CDN就更快了,直接规划出一条到源站的最优路径
作者回复: 说的很好。
7 - 苦行僧2019-08-28我们公司就是生产大量视频 每天几T视频 不用cdn成本可想而知 不过每次招标换厂家都涉及视频搬迁
作者回复: 在视频、直播领域cdn非常有用。
6 - magicnum2019-08-22CDN不仅有专线,还可以进行边缘计算。
作者回复: 对
3 - 许童童2019-08-21网站也可以自建同城、异地多处机房,构建集群来提高服务能力,为什么非要选择 CDN 呢? 确实可以,不过建大了,就成了一个CDN。 对于无法缓存的动态资源,你觉得 CDN 也能有加速效果吗? 也有加速效果,不过要注意设置好缓存过期时间,不宜太长。如果不设缓存,内容由CDN回源去源站拉取,链路上专用网络可能快一些。对于缓存不可接受的业务,最好就不要用CDN了。展开
作者回复: great。
3 - 佳佳大魔王2019-08-21问题一,我觉得会造成数据同步困难的问题,另外在网站更新的时候,消耗的资源也比较多
作者回复: 对,自己搭建机房费时费力费钱费人工,对于一般的中小型网站来说性价比不高,cdn是专门做这个的,交给他们做效果会更好。
共 2 条评论3 - 钱2020-04-051:网站也可以自建同城、异地多处机房,构建集群来提高服务能力,为什么非要选择 CDN 呢? 钱决定的,成本收益比导致选择CDN,假如自建更省钱那一定会选择自建。首先,小公司自建不起,没有这么多人力、财力、技术,用多少买多少多香。大公司觉得自建更好,此时就变成了使用自己的CDN。 2:对于无法缓存的动态资源,你觉得 CDN 也能有加速效果吗? 无法缓存的资源,只能回源获取,正好能够利用CDN与源服务器之间的高速通道(看评论才知道),也能起到加速的效果吧! 话说什么动态资源不能够缓存?自建机房,异地多机房不是什么都有了嘛?只是又引入了一致性问题。展开
作者回复: 回答的很好。 动态资源的关键在于它的实时性,如果缓存可能会导致数据不一致,比如账户余额。 如果实时性要求低,那么就可以缓存较短的时间。
2 - 锦2019-08-21现实中为了减少回源率,降低宽带费用,一般cdn厂商也会提供伪源,那云厂商是怎么解决这个回源问题的呢?
作者回复: 你说的这个“伪源”可能就是cdn的一级节点吧,二级节点不直接访问源站,而是访问cdn内部的一级节点,而一级节点就充当了源站。
共 2 条评论1 - 夜空中最亮的星2019-08-21老师,我又回来啦,😄
作者回复: welcome back。
1 - 徐海浪2019-08-211.网站也可以自建同城、异地多处机房,构建集群来提高服务能力,为什么非要选择 CDN 呢? 因为CDN有大量边缘节点,网站只需要专注于自身业务,无需关心早专业的CDN复杂调度逻辑。 2.对于无法缓存的动态资源,你觉得 CDN 也能有加速效果吗? 有一定的效果,因为动态资源可以走cdn专线回源。展开
作者回复: very good。
1 - 闫飞2019-08-21TB级别的硬盘看起来也不是特别高端厉害的样子,因为普通的PC机也标配TB级SATA盘或者512GB SSD了吧。我猜CDN厂商是不是需要用专有的服务器硬盘保证比较长的服务寿命,还是大家就到市面上买买普通的硬盘挂上去就用了?
作者回复: 家用级别和企业级别的硬盘还是有区别的,用于服务器的硬盘质量肯定会更高一些。
共 3 条评论1 - 佳佳大魔王2019-08-21问题二,文章指出了如果动态资源指定了 Cache-Control 那么也可以在很短时间内缓存 我觉得在这种情况比较有用:打开一个网站,打到一半的时候关闭,此时服务器已经开始了运算,当我们在很短时间内再次打开相同的网站时,很快就进入了
作者回复: 是的,这些数据已经下载到了本地,而且依然在有效期,那么就不用再次向服务器请求,可以直接在本地获取。
1 - ifelse2023-02-07 来自浙江学习了,干货满满
作者回复: good
1 - 北冥有鱼2022-07-251.自建多地缓存集群,成本巨高,只有少数top级互联网公司承担的起。 2.CDN依托于自己搭建的网络,通过计算最优路由来实现加速效果。另外还能优化跨运营商访问,省去了源站的BGP带宽开销
作者回复: great
- includestdio.h2021-06-281.成本高,维护困难; 2.数据一致性要求不高,同步慢等,可以设置短时间缓存
作者回复: great。
- 牛2021-02-02CDN已经是一项互联网领域的基本服务了。对于受众分布广泛,比如全国性、全世界性的互联网产品,都用得上,而且费用还不便宜。那些个视频网站,这项开支巨大。
作者回复: 对,CDN已经是如今互联网的基础设施了,无法想象没有它的世界会是什么样。
- 小谢同学2020-08-08问题1:主要是互联网形态的业务终端用户分布范围太广,还需要考虑一些边远地区甚至三大运营商覆盖不到的地方,这时候考验cdn的节点和运营商覆盖了,此外尽可能优化终端体验也是产品的一大竞争优势 问题2:对于动态内容可以采用动态加速或者所谓的“全站加速”,即通过cdn服务商提供动态内容请求的最优回源路线
作者回复: good
- do it2020-06-041、为了省钱 2、线路优化
作者回复: 言简意赅,good。
- 子杨2020-02-23老师好,对于 CDN 而言,如何判断是源站造成的异常还是 CDN 的异常?为了监控源站是否异常,我们目前采用的是在源站放一个文件,不断的去探测文件的长度,一致的话就表示正常。总觉得会有更好的办法。。。
作者回复: 这个好像是最基本的,也挺有效,这样就保证源站的http服务是正常的,其他很多网站都是这么干,像let's encrypt。
共 3 条评论