在互联网发展初期,网站的服务能力要求都不高,很多网站一台服务器就可满足需求。但随着网络内容和用户数量的增长,这些网站很快就面临服务瓶颈,最初的解决办法是提高服务器的硬件配置,后来又出现了多台服务器组成集群进行负载分担(详见第4.1节)的方法。但这些都无法解决网络延迟、“最后一公里”等网络问题,为此出现了内容缓存技术,并进一步发展成为内容分发服务技术。
互联网最常见的访问方式是B/S模式,即浏览器(Browser)到网站服务器(Server)的访问模式,最简单的形式就是用用户的浏览器去访问远在异地的一个网站服务器,从服务器上获取你想要的信息。下面通过一个例子分析这种最简单的B/S模式将会出现哪些问题,从而催生了CDN服务的出现。
假设你觉得互联网是一个非常好的营销渠道,想要建立一个电子商务网站,为市场上知名的各个商家提供他们产品的销售服务,也为有各种各样商品需求的全世界用户提供浏览和购买商品的途径。那么,你为商家设置的电子店铺中会包含图片、文字、视频介绍以及相关的软件下载,用户可以在你的网站上通过浏览这些内容了解和体验他们所需要的商品。
起初,你认为你的网站就是为北京市内10000人左右的商家服务,所以购买了10台服务器,在电信运营商的北京IDC机房里租用了10台服务器的空间和1GB的带宽,然后网站运营开始。三个月后,由于你广告宣传的投入加大,货源渠道丰富,售后服务周到,网站购物体验好,用户已经超过10000人。
当越来越多的用户来到你的网站,他们会发现过去访问很顺利的网页很难打开或者出现访问错误,视频点播断断续续、商品大图无法打开,经过几次很差的体验后,用户开始慢慢不再喜欢访问这个网站,访问人数开始下降,所以你决定再增加10台服务器,再租用更多的带宽以满足北京用户的访问需求。
如果网站的用户黏性很高,你开始准备在全国进一步扩大商品销售,让离北京较远的用户(比如广州)也能享受商品订购和快递服务,你选择在北京机房继续增加服务器和带宽来满足要求。结果效果很差,网站服务器虽然并没有达到最大负荷,但用户在观看视频时经常断断续续或出现马赛克,网页显示很慢并且也经常出现错误。主要原因是用户访问的网站内容在从北京传到用户所在地的较远路途中,必然会在路由设备上排队等待,如果骨干网络极度拥塞,访问内容的时延以及丢失的数据包数量会非常大。
由于远处用户访问体验较差,你决定在用户访问较多的其他几个省份部署一套镜像系统,经过分析后,在广州和长沙各部署了10台服务器,租用了1GB的带宽。广州和长沙的用户通过选择相对应的服务器,能够得到满意的体验。但接下来你又遇到了以下新问题:
●假设某款需要抢购的商品在你的网站上限量发售,北京服务器网页的更新是在凌晨5点,而你的网站通常是在每天晚上12点进行镜像间的内容同步,所以商品的网页需要19个小时后才能在广州和长沙的镜像上出现。在这逝去的19个小时中,北京的用户已将所有商品购买一空。
●假设网站的广州镜像出现了故障,但用户可能在访问时并没有意识到这一点,仍然会继续将请求发送到广州的镜像,或者在确定广州镜像出故障的情况下直接访问北京服务器,而不会智能地将请求转移到距离较近的长沙镜像。
●北京服务器是系统的中心服务器,但用户和黑客在访问时都能够直接获取其IP地址,所以黑客通过直接向中心服务器发起DDoS攻击就可以轻而易举地攻破服务器。
●随着电子商务的服务范围在全国不断扩大,你需要在全国的各个地方都购买服务器和相应带宽,并提供与这些资产相对应的维护人力,整个成本相对于收益并没有因为经济规模效应而大幅度减少,所以你的网站看上去赢利能力在不断削弱。
现在,我们回过头总结一下这个网站从一开始到现在所遇到的问题:
●无法及时满足并发用户增长的需要。
●在没有设置镜像前,无法满足较远用户的访问需要。
●在设置镜像后,中心服务器与镜像之间信息同步不够及时。
●很多情况下,一个镜像站点失效后,无法及时高效地调度到最近的镜像来服务。
●通过部署镜像来解决问题会明显增加成本。
●中心服务器IP地址的暴露导致易受黑客DDoS攻击。
那么,CDN能否帮助网站解决这些问题呢?
虽然上面提出的一系列问题正是CDN致力于解决的问题,但在CDN技术形成商用能力之前,网站运营者们一直在不断尝试其他网站加速技术。
Scale up,是指提高网站服务器的硬件水平。这是最简单、最直接的方法,比如增加高速处理器,配置更大的内存和硬盘,或是配置多处理器系统。用户依然是直接访问源站服务器,只是单台服务器能够提供服务的用户数增加了。这对于解决远距离传输带来的质量问题是无效的,而且往往需要同时对整个系统进行硬件升级,灵活性和可扩展性都比较差。
Scale out,采用服务器集群。随着网站用户数的不断增长,网站的单台普通服务器再也满足不了大规模用户并发处理的要求,这时就产生了集群方案。一个集群由很多台服务器组成,以负载分担的方式处理同一个站点的用户请求。集群内需要引入负载均衡设备,根据用户请求的类型、请求内容、用户名称等,将请求分配到某台具体服务器上进行响应。
镜像是冗余的一种类型,比如一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本就称为磁盘镜像。镜像主要用于备份,在数字媒体服务和分发领域,是指将数字媒体的服务能力和完整内容都备份到网络上不同地址的另一个地方。
基于镜像技术的主要应用方式是镜像网站,即对整个网站中的内容进行镜像复制,并对镜像网站多点部署。这样,用户在访问网站时可以自主选择速度较快的镜像站点,从而得到更快更好的服务,降低主网站/原始网站的负载。例如,Web或HTTP下载服务器在不同城市或针对不同运营商的IDC可以进行镜像处理,加速分发。
部署镜像站点是一段时间里被采用比较多的网站加速方法,至今一些网站仍在使用。镜像服务器上安装有一个可以进行自动远程备份的软件,每隔一定的时间,各个镜像服务器就会到网站的源服务器上去获取最新的内容。这种方法常用来解决源站服务器和用户在不同运营商网络中的问题。镜像站点对主站点起到了用户分流作用和应急备份作用。不过,用户自行选择时往往带有一定的盲目性,有时并不能起到就近服务的作用。另外,对于镜像站点来说,每个镜像都是源站的百分之百复制,所以对体积庞大的网站来说,部署多个镜像站点成本是非常高的。
缓存是将访问过的数字媒体存储起来,为后续的重复访问使用。如用户A通过缓存设备访问了一个由网站www.streamabc.com提供的流媒体文件sample.avi,当用户B要访问sample.avi时就不用再访问www.streamabc.com了,缓存设备可以直接将已缓存的文件sample.avi发送给用户B。基于缓存技术的主要应用方式有缓存代理和CDN。
缓存代理服务一定范围的访问域,访问域内的内容访问请求通过缓存代理执行。缓存代理缓存被访问过的内容,后续的相同内容访问直接通过缓存代理获得服务。缓存代理的一种复杂实现形式是部署分层缓存,就是在不同的物理位置部署多台缓存服务器,逻辑上采用分层模式,上层缓存作为下层缓存的内容存储器,保证及时向下一级缓存提供所需的内容。直接向用户提供服务的服务器只需向上一层缓存服务器请求内容,而非向源站请求。这样,获得内容的时间更短,同时也分担了源站服务器的压力。
CDN通过将内容存储到离用户最近的地方实现面向大规模用户的就近服务。从某种意义上可以说,CDN是在缓存技术的基础上发展起来的,或者说CDN是缓存的分布式集群实现。负载均衡系统和内容管理系统都是为了更好地实现各个缓存节点之间的协同工作。以上提到的分层缓存方案在原理上已经非常接近CDN,所以CDN也可以理解为智能调度加上分层缓存技术的组合。