CDN很重要,在现今互联网世界几乎无处不在,可以说,没有CDN就没有现在高质量的互联网服务和优质的互联网体验。
本文来谈谈CDN的那些事。
一、为什么要有CDN加速
你或者经常听到CDN加速这个名词,那为什么要做加速呢?目前的网络结构有什么问题吗?
这个时候我们需要考虑到一些实际问题。
我们知道光速是每秒30万公里,但这只是真空中的上限,在实际的电缆、光缆中的速度会下降到原本的三分之二左右,也就是20万公里/秒。
我们考虑一个情况:用户从西班牙访问到美国纽约要经过北大西洋,直线距离6,000km 左右,按照光速20万公里/秒的传输速度,一束光从西班牙到纽约也至少需要30ms时间,一个往返就需要60ms。
加之各种损耗、设备时延等问题,即使用浏览器访问一个再小不过的图片,也会等个上百毫秒,积少成多,访问一个美国购物网站会让西班牙用户无法接受。
可以看出来,无论位于美国的服务器如何优化,西班牙用户只要穿越这6000公里的光缆,那么永远无法避免高延迟。
该如何解决呢?这个时候CDN出现了。
二、什么是CDN
CDN全称是Content Delivery Network,即内容分发网络,它就是专门为解决“长距离”上网络访问速度慢而诞生的一种网络应用服务。
上面西班牙用户上网购物的例子中,如果引入CDN,则会变得很不一样。CDN将网页中一成不变的内容,例如:图片、音乐、视频等,分发到各个CDN服务器节点上。
假设西班牙就正好有这么一个CDN节点,专门用来缓存来自美国源站中的图片、音乐、视频等内容,西班牙的网民就无需经过6000公里的光缆了,只需要直接去位于西班牙的CDN节点请求这些固定内容即可。
将这些很耗费网络资源的媒体文件通过CDN缓存下来,并且就近分发给用户,可大大提升用户体验。
这里点出了CDN的一个核心原则:“就近访问”,如果用户能够在本地几十公里的距离之内获取到数据,那么时延就基本上变成 0 了。
为了实现此目标,CDN厂商会投入大量资金,在全国、乃至全球的各个大枢纽城市都建立了机房,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。这个网络是跨运营商、跨地域的,虽然内部也划分成多个小网络,但它们之间用高速专有线路连接,是真正的“信息高速公路”,基本上可以认为不存在网络拥堵。
有了这个高速的专用网之后,CDN 就要“分发”源站的“内容”了,使用“推”或者“拉”的手段,把源站的内容逐级缓存到网络的每一个节点上。
于是,用户在上网的时候就不直接访问源站,而是访问离他“最近的”一个 CDN 节点,术语叫“边缘节点”(edge node),其实就是缓存了源站内容的代理服务器,这样一来就省去了“长途跋涉”的时间成本,实现了“网络加速”。
经过以上学习,我们知道了CDN实际上是内容的搬运工,就像是网络世界中的“快递公司”,主要缓存的是静态资源,比如超文本、图片、视频、应用程序安装包等等,实现CDN加速。
三、CDN之基于DNS调度
那么CDN是如何将离用户最近的边缘节点选择出来的呢?这里要说到CDN的另一个核心点:调度策略。
提到调度,肯定要有一个“大脑”在控制,在CDN中这个控制中心叫做全局负载均衡。
全局负载均衡(Global Sever Load Balance)一般简称为 GSLB,它是 CDN 的“大脑”,主要的职责是当用户接入网络的时候在 CDN 专网中挑选出一个“最佳”节点提供服务,解决的是用户如何找到“最近的”边缘节点,对整个 CDN 网络进行“负载均衡”。
这里说的基于DNS调度的原理,自然跟DNS协议紧密相关,这里提供传送门供读者朋友温习:《四十五、应用层篇-幕后功臣DNS(上)》和《四十六、应用层篇-幕后功臣DNS(下)》
我们平时所工作的电脑里,都会配置(人为或自动)一个 DNS 服务器地址,我们称之为”本地 DNS“,也叫 Local DNS,简称 LDNS。
在请求某个域名时,LDNS 一般有两个情况:一种是域名在 LDNS 上有记录,另一种情况是没有记录,两种情况的处理流程不一样。
-
如果 LDNS 上有缓存记录,那它会直接将 IP 地址吐出来。
-
如果没有缓存记录,LDNS将会一步步向后面的服务器做请求,然后将所有数据进行汇总后交给最终的客户;
调度实际上就可以通过LDNS的地址来进行,将过程简化如下:
-
用户向LDNS发起域名解析请求,LDNS未找到缓存记录,则进行递归查询;
-
LDNS最终会找到拥有此域名注册信息的权威DNS服务器,权威DNS给LDNS返回CNAME记录及其最终的IP地址,指向的就是CDN的GSLB。
-
LDNS会向GSLB再次发起请求,GSLB判断LDNS地址位置,根据各种算法给出一个最终的边缘节点CDN的IP地址给LDNS;
-
LDNS将最终的IP地址返回给用户,用户向此IP发起请求。
下面举例说明:
假如网民是一个北京联通的用户,它使用的 LDNS 地址也是北京联通的,而 LDNS 访问 GLB 也是北京联通的,则 GLB 则认为网民的位置在北京联通,那么会分配一个北京联通的 CDN 服务器地址给 LDNS,LDNS 将http:www.a.com解析出的 IP 地址返回给最终网民,那么在以后网民浏览器发起请求的时候,都会直接与北京联通的 CDN 节点进行流量通信,从而达到了加速的目的。
这里要保障一点:用户使用的LDNS地址确实是用户的所处区域,举个例子,如果网民是北京联通的用户,但他却偏要使用深圳电信的 LDNS,LDNS 出口也同样是深圳电信的 IP 地址,那么 GLB 会误判网民位于深圳电信,分配给网民的 CDN 服务器也都是深圳电信的,后续网民会从北京联通访问到深圳电信,不但没加速,可能反而降速了。
其中cname的过程可能是多次,我们以访问七牛云CDN图片为例:
用户最终拿到了边缘CDN节点的IP地址,从其请求图片资源,通过查看ip的归属,可以看到是常州电信节点。
依靠DNS工作机制和cname别名记录,将用户请求引入到CDN网络中,CDN内部进行调度提供出最佳的边缘节点服务,当然了,调度算法不仅仅是根据LDNS地址,还要结合许多其他因素,是一个复杂的算法。
四、CDN之基于HTTP重定向调度
如前文所述,由于用户使用习惯或一些其他原因,通过 LDNS 调度有可能是不准确的,因此又出现了另一种调度方式,HTTP 302 调度。
使用基于HTTP重定向方案,首先在DNS中将GSLB设备的IP地址登记为域名的A记录。
用户首先通过DNS解析获取GSLB设备的IP地址,用户向其发起HTTP资源的请求。
GSLB设备收到HTTP请求后使用一定策略选择一个最合适的服务器,然后GSLB设备向用户发送一个HTTP重定向指令(HTTP302),并附上选出的服务器的IP地址。
最后,用户根据重定向IP访问站点的服务器。
由于用户是直接与GSLB通信,GSLB即可获取真实的用户IP地址,解决DNS调度存在的可能不准确的问题。
但是此类转发需要经过HTTP层,一方面依赖于HTTP协议,另外一方面肯定比TCP/IP层的转发慢。
我们来看看基于302的例子,这一点实际上在之前《五十七、应用层篇-HTTP之重定向》做过说明。
我们来用VLC等播放器播放以下这么一条链接:
http://vod.jjc.ctlcdn.com/ceph_021/0099prcpaj0181159073397723911646/playlist.m3u8?CONTENTID=0099prcpaj0181159073397723911646&AUTHINFO=nB9GN6cD0eqLmLnP5m%2FJkCXbfvglH1oi675D2I3IHHD%2FdLK37O8G%2BHn32%2BZ81FrLJ0TY6kQZoZmF5pE%2BOtbr%2FwDBl%2FJIGVQJgvrafM5YeSTgLc%2B6m4X9ROkfv9nMgr9S7oHy3U3RfdV6WwjltwQe%2BMb1R75m5FBtbks39v9NOBARTeZywr25676corkQsd4st8%2B3XqqKpvBjM5kpObY5fzoy1U00cvR8BhQqntQejJU8%2Fvy88jQu1a32K%2B0dkwM%2B7zuUYoxmAibgkA2uaXLIfQ%3D%3D&USERTOKEN=n9KmNQZDy6P5W1v8A7FVwVbr1%2FPVmJov
来播放一下,并且顺便抓一个包来看看:
抓包的部分结果为:(这里我只过滤出来了HTTP报文,TCP报文已被隐藏)
可以看到出现了302状态码,对这条302报文进行放大:
可以看到在部分CDN实现原理中,也用到了302的机制,并且与cname记录结合。
五、CDN的缓存机制
缓存问题决定了CDN服务的质量,是CDN设计中核心的部分。
首先CDN关注缓存淘汰机制。
我们知道,资源是无穷无尽的,而CDN的存储容量是有限的,不可能将互联网所有的内容都缓存在CDN中,缓存系统的价值在于将最常用的那些内容保存下来,及时为用户提供服务。
因此缓存必须具备过期和淘汰机制,典型的如根据热点进行缓存淘汰、根据时间进行缓存清理等等。
CDN服务器应当配备SSD+SATA的硬盘组合,我们都知道,SSD 可以大幅度提升响应速度,但受成本和技术工艺限制,SSD 盘的空间相比 SATA 而言要小很多、贵很多。我们可以将最热的内容放到内存、次热放到 SSD,冷数据放到 SATA,最冷数据受磁盘空间限制不进行存储,直接从 upstream 或源站获取。
其次CDN关注数据查询机制。
数据要快速查询到,需要用到高效的数据结构和算法,比如典型的Hash算法。
下面介绍两个 CDN 缓存中的关键概念:“命中”和“回源”。
“命中”就是指用户访问的资源恰好在缓存系统里,可以直接返回给用户;“回源”则正相反,缓存里没有,需要向源站获取资源。
相应地,也就有了两个衡量 CDN 服务质量的指标:“命中率”和“回源率”。命中率就是命中次数与所有访问次数之比,回源率是回源次数与所有访问次数之比。显然,好的 CDN 应该是命中率越高越好,回源率越低越好。现在的商业 CDN 命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上。
这里的关键问题是:如何提高命中率、降低回源率呢?
第一步要在硬件上花本钱,大的内存、万兆网卡、高速CPU、大容量SSD、超大容量SATA硬盘等,目的是尽可能多存储一些内容。
第二步是选择的缓存软件,尽可能高效利用存储,相同的硬盘能缓存更多内容。
CDN服务器分为多层,典型的三层结构:源站中心、区域中心以及边缘节点。边缘节点直接面向用户服务,配置相对低一点;区域中心相对配置高一点,可以缓存更多内容。
只有当边缘节点没有内容时,会向区域中心节点回源,只有区域中心节点没有此内容,才会向源站中心回源,这种层级结构,减少向源站中心节点的回源次数。
六、做好CDN十分困难
CDN 的关键技术是调度和缓存,有很多开源软件可以实现 CDN 的基本需求,但性能却远达不到商业需求。真正要做高性能的 Cache 系统,不仅需要在数据结构与算法层面深入,更要从硬件、操作系统、文件系统、底层原理等多个领域做更多的研究。
感兴趣的读者朋友可以自行去了解CDN相关优化技术,一般来说,会针对TCP协议进行优化、传输路径进行优化、缓存策略进行优化、回源机制进行优化等等,还会结合压缩技术、长连接技术等等机制,因此可以说,商用的CDN是一个极其复杂的系统,不然很容易造成大规模事故。
原文始发于微信公众号(幕后哈土奇):七十六、进阶篇-浅谈CDN
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112998.html