learn-tech/专栏/周志明的架构课/19_如何利用内容分发网络来提高网络性能?.md
2024-10-16 06:37:41 +08:00

219 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
19 _ 如何利用内容分发网络来提高网络性能?
你好,我是周志明。
前面几讲中我给你介绍了客户端缓存、域名解析、链路优化这三种与客户端关系较密切的传输优化机制。这节课我们来讨论一个针对这三种机制的经典综合运用案例内容分发网络CDNContent Distribution Network或Content Delivery Network
内容分发网络是一种十分古老的应用你应该也听说过它的名字多少知道它是用来做什么的。简单理解的话CDN其实就是做“内容分销”工作的。
我给你举个例子吧。假设我们把某个互联网系统比喻为一家开门营业的企业那内容分发网络就是它遍布世界各地的分支销售机构。如果一位客户要买一块CPU我们要是订机票飞到美国Intel总部去采购那肯定是不合适的到本地电脑城找个装机铺才是正常人的做法。所以在这个场景里内容分发网络就相当于电脑城那吆喝着CPU三十块钱一斤的本地经销商。
然后,内容分发网络又是一种十分透明的应用,一般不需要我们参与它的工作过程。所以我想,如果你没有自己亲身使用和专门研究过,那可能就不太清楚它是如何为互联网站点分流的,也不太会注意到它的工作原理是什么。
实际上,内容分发网络的工作过程,主要涉及到路由解析、内容分发、负载均衡和它所能支持的应用内容四个方面。今天这节课,我们先来了解内容分发网络可以解决哪些网络传输问题,也就是先着重探讨除负载均衡以外的其他三个方面的工作。在下一讲中,我会专门跟你讨论负载均衡的内容。
好,如果忽略其他影响服务质量的因素,仅从网络传输的角度来看,一个互联网系统的速度快慢,主要取决于以下四点因素:
网站服务器接入网络运营商的链路所能提供的出口带宽。
用户客户端接入网络运营商的链路所能提供的入口带宽。
从网站到用户之间,经过的不同运营商之间互联节点的带宽。一般来说,两个运营商之间只有固定的若干个点是互通的,所有跨运营商之间的交互都要经过这些点。
从网站到用户之间的物理链路传输时延。你要是爱打游戏的话应该就很清楚了延迟Ping值通常比带宽更重要。
以上四个网络问题,除了第二个只能由用户掏腰包,装个更好的宽带才能够解决之外,其余三个都能通过内容分发网络来改善。
所以说,一个运作良好的内容分发网络,能为互联网系统解决跨运营商、跨地域物理距离所导致的时延问题,也能给网站流量带宽起到分流、减负的作用。
举个例子如果没有遍布全国乃至全世界的阿里云CDN网络支持哪怕把整个杭州所有网民的上网权利都剥夺了把带宽全部让给淘宝的机房恐怕也撑不住双十一全国甚至是全球用户的疯狂围殴。
那么接下来我们就从CDN工作流程的第一步“路由解析”开始来全面了解下CDN是如何进行网络加速的。
路由解析
在第16讲我给你介绍DNS域名解析的时候提到过翻译域名不需要像查电话本一样刻板地一对一翻译DNS可以根据来访机器、网络链路、服务内容等各种信息玩出很多花样。
而内容分发网络将用户请求路由到它的资源服务器上其实就是依靠DNS服务器来实现的。
那么根据我们现在对DNS域名解析的了解一次没有内容分发网络参与的用户访问它的解析过程应该是这样的
即查询icyfenix.cn的请求发送至本地DNS后会递归查询直至找到能够解析icyfenix.cn地址的权威DNS服务器最终把解析结果返回给浏览器。
而有了内容分发网络的介入,这个解析过程会发生什么变化呢?
我们不妨先来看一段对网站“icyfenix.cn”进行DNS查询的真实应答记录这个网站就是通过国内的内容分发网络来给位于GitHub Pages上的静态页面加速的。
通过dig或者host命令我们就能很方便地得到DNS服务器的返回结果结果中头4个IP的城市地址是我手工加入的后面的其他记录就不一个一个查了如下所示
$ dig icyfenix.cn
; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> icyfenix.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60630
;; flags: qr rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;icyfenix.cn. IN A
;; ANSWER SECTION:
icyfenix.cn. 600 IN CNAME icyfenix.cn.cdn.dnsv1.com.
icyfenix.cn.cdn.dnsv1.com. 599 IN CNAME 4yi4q4z6.dispatch.spcdntip.com.
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 101.71.72.192 #浙江宁波市
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 113.200.16.234 #陕西省榆林市
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 116.95.25.196 #内蒙古自治区呼和浩特市
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 116.178.66.65 #新疆维吾尔自治区乌鲁木齐市
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 118.212.234.144
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 211.91.160.228
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 211.97.73.224
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 218.11.8.232
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 221.204.166.70
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 14.204.74.140
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 43.242.166.88
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 59.80.39.110
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 59.83.204.12
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 59.83.204.14
4yi4q4z6.dispatch.spcdntip.com. 60 IN A 59.83.218.235
;; Query time: 74 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Apr 11 22:33:56 CST 2020
;; MSG SIZE rcvd: 152
那么根据这个解析信息我们可以知道DNS服务为icyfenix.cn的查询结果先返回了一个CNAME记录icyfenxi.cn.cdn.dnsv1.com”,服务器在递归查询该CNAME时候返回了另一个看起来更奇怪的CNAME4yi4q4z6.dispatch.spcdntip.com”。继续查询后这个CNAME返回了十几个位于全国不同地区的A记录
很明显这些A记录就是分布在全国各地存有本站缓存的CDN节点由此我们就能清晰地了解到CDN路由解析的具体工作过程了
架设好icyfenix.cn的服务器后将服务器的IP地址在你的CDN服务商上注册为源站”,注册后你会得到一个CNAME也就是这个例子当中的icyfenxi.cn.cdn.dnsv1.com”。
接着将得到的CNAME在你购买域名的DNS服务商上注册为一条CNAME记录
当第一位用户来访问你的站点时会首先发生一次未命中缓存的DNS查询域名服务商解析出CNAME后会返回给本地DNS到这里后续的链路解析的主导权就开始由内容分发网络的调度服务接管了
本地DNS查询CNAME时由于能解析该CNAME的权威服务器只有CDN服务商所架设的权威DNS这个DNS服务会根据一定的均衡策略和参数比如拓扑结构容量时延等等在全国各地能提供服务的CDN缓存节点中挑选一个最适合的把它的IP替换成源站的IP地址然后返回给本地DNS
浏览器从本地DNS拿到了IP地址后就会把该IP当作源站服务器来进行访问此时该IP的CDN节点上可能有也可能没有缓存过源站的资源这一点我们马上会在讲内容分发的部分展开讨论)。
最后经过内容分发后的CDN节点就有能力代替源站向用户提供所请求的资源了
那么把前面解析的这个步骤反映在时序图上会是什么样子的呢你可以参考我在这里给出的图例然后对比一下我在前面所给出的没有CDN参与的时序图看看它们都有什么不同之处
好了现在我们就已经了解了CDN中路由解析的工作流程了下面我们一起来看看CDN加速的核心内容分发
内容分发
我们已经知道在DNS服务器的协助下无论是对用户还是服务器内容分发网络都可以是完全透明的在两者都不知情的情况下由CDN的缓存节点接管用户向服务器发出的资源请求
但随之而来的问题就是缓存节点中必须要有用户想要请求的资源副本才可能代替源站来响应用户请求而这里面又包括了两个子问题:“如何获取源站资源如何管理更新资源”。
所以CDN是如何解决这两个问题的呢
首先对于如何获取源站资源这个问题CDN获取源站资源的过程被称为内容分发”,“内容分发网络的名字也正是由此而来的可见这是CDN的核心价值
那么在内容分发的过程中我们可以采取两种主流的内容分发方式
第一种主动分发Push
顾名思义主动分发就是由源站主动发起将内容从源站或者其他资源库推送到用户边缘的各个CDN缓存节点上这个推送的操作没有什么业界标准可循我们可以采用任何传输方式如HTTPFTPP2P等)、任何推送策略如满足特定条件定时人工等)、任何推送时间只要与我后面要说的更新策略相匹配即可
不过你要注意由于主动分发通常需要源站CDN服务双方提供的程序API接口层面的配合所以它对源站并不是透明的只对用户一侧单向透明
另外主动分发的方式一般是用于网站要预载大量资源的场景比如双十一之前的一段时间内淘宝京东等各个网络商城就会开始把未来活动中需要用到的资源推送到CDN缓存节点中特别常用的资源甚至会直接缓存到你的手机App的存储空间或者浏览器的localStorage上
第二种被动回源Pull
被动回源就是指由用户访问所触发的全自动双向透明的资源缓存过程当某个资源首次被用户请求的时候CDN缓存节点如果发现自己没有该资源就会实时从源站中获取这时资源的响应时间可粗略认为是资源从源站到CDN缓存节点的时间再加上资源从CDN发送到用户的时间之和
所以被动回源的首次访问通常是比较慢的但由于CDN的网络条件一般远高于普通用户并不一定就会比用户直接访问源站更慢不适合应用于数据量较大的资源
但是被动回源也有优点就是它可以做到完全的双向透明不需要源站在程序上做任何的配合使用起来非常方便
这种分发方式是小型站点使用CDN服务的主流选择如果你不是自建CDN而是购买阿里云腾讯云的CDN服务的站点它们多数采用的就是这种方式
其次对于CDN如何管理更新资源这个问题同样也没有统一的标准可言尽管在HTTP协议中关于缓存的Header定义中确实是有对CDN这类共享缓存的一些指引性参数比如Cache-Control的s-maxage但是否要遵循完全取决于CDN本身的实现策略
而且更令人感到无奈的是由于大多数网站的开发和运维人员并不十分了解HTTP缓存机制所以就导致了如果CDN完全照着HTTP Headers来控制缓存失效和更新效果反而会更差而且还可能会引发其他的问题所以CDN缓存的管理没有通用的准则
现在最常见的管理更新资源的做法是超时被动失效与手工主动失效相结合
超时失效是指给予缓存资源一定的生存期超过了生存期就在下次请求时重新被动回源一次而手工失效是指CDN服务商一般会给程序调用提供失效缓存的接口在网站更新时由持续集成的流水线自动调用该接口来实现缓存更新比如icyfenix.cn就是依靠Travis-CI的持续集成服务来触发CDN失效和重新预热的
CDN应用
内容分发网络最初是为了快速分发静态资源而设计的但今天的CDN能做到的事情已经远远超越了开始建设时的目标所以下面我想带你来了解一下现在的CDN都可以做到什么它都有哪些应用这里我先说明一下我不会把CDN的各种应用全部展开细说而是只做个简要地列举说明我的目的是想帮你建立一个总体的关于CDN的认知只要理解和掌握了CDN的原理相信你也能发掘出许多这里没有列举的应用
加速静态资源
这是CDN本职工作
安全防御
在广义上你可以把CDN看作是你网站的堡垒机源站只对CDN提供服务然后由CDN来服务外界的其他用户这样恶意攻击者就不容易直接威胁源站CDN对防御某些攻击手段如DDoS攻击等尤其有效
但你也需要注意的是把安全性都寄托在CDN上本身其实是不安全的一旦源站的真实IP被泄露就会面临很高的风险
协议升级
不少CDN提供商都同时对接代售CA的SSL证书服务这样就可以实现源站是HTTP协议的而对外开放的网站是基于HTTPS的
同理这样的做法也可以实现源站到CDN是HTTP/1.x协议而CDN提供的外部服务是HTTP/2或HTTP/3协议或者是实现源站是基于IPv4网络的CDN提供的外部服务支持IPv6网络等等
状态缓存
在第17讲我介绍客户端缓存的时候简要提到了状态缓存的实现机制即不经过服务器客户端直接根据缓存信息来判断目标网站的状态而CDN不仅可以缓存源站的资源还可以缓存源站的状态比如源站的301/302转向就可以缓存起来让客户端直接跳转还可以通过CDN开启HSTS通过CDN进行OCSP装订来加速SSL证书访问等等
另外有一些情况下我们甚至可以配置CDN对任意状态码如404进行一定时间的缓存以减轻源站压力但这个操作你要慎重注意要在网站状态发生改变时去及时刷新缓存
修改资源
CDN可以在给用户返回资源的时候修改它的任何内容以实现不同的目的比如说可以对源站未压缩的资源自动压缩并修改Content-Encoding以节省用户的网络带宽消耗可以针对源站未启用客户端缓存的内容加上缓存Header来自动启用客户端缓存可以修改CORS的相关Header给源站不支持跨域的资源提供跨域能力等等
访问控制
CDN可以实现IP黑/白名单功能比如根据不同的来访IP提供不同的响应结果根据IP的访问流量来实现QoS控制根据HTTP的Referer来实现防盗链等等
注入功能
CDN可以在不修改源站代码的前提下为源站注入各种功能举个例子下图是国际CDN巨头CloudFlare提供的Google AnalyticsPACEHardenize等第三方应用这些原本需要在源站中注入代码的应用在CDN下都可以做到无需修改源站任何代码即可使用
小结
CDN是一种已经存在了很长时间也被人们广泛应用的分流系统它能为互联网系统提供性能上的加速也能帮助增强许多功能比如说我今天所讲的安全防御资源修改功能注入等等
而且这一切又实现得极为透明可以完全不需要我们这样的开发者来配合甚至可以在我们不知情的情况下完成以至于CDN没什么存在感虽然我们可能都说听过它但却没有真正了解过它所以学完了这一讲你应该就对CDN有更全面的理解了
另外CDN本身就是透明多级分流系统的一个优秀范例我希望你不仅可以学会CDN本身的功能与运作原理而且可以在实际的工作中将这种透明多级分流的思路应用于不同的场景构建出更加健壮能应对更大流量的系统
一课一思
除了我们已经介绍到的DNS和CDN你还了解软件业界里哪些常见的系统符合透明多级分流的特征呢欢迎在留言区分享出来
如果你觉得有收获也欢迎把今天的内容分享给更多的朋友感谢你的阅读我们下一讲再见