CDN技术详解

197 ,7.1 CDN概述 CDN 是Content Delivery Network 首字母缩写,译成中文就是内容分发网络。使用CDN 技术的主要目的在于增加访问速度

197

,

7.1 CDN概述 CDN 是Content Delivery Network 首字母缩写,译成中文就是内容分发网络。使用

CDN 技术的主要目的在于增加访问速度、解决南北互联(中国适用)、提高用户体验等。

最早的商业CDN 服务可能诞生于1999年,但本人闻之CDN 这个业务则是2005年的事情了。到了2006年的春天,我有幸得到一个CDN 设计方面的工作,这才有机会全面了解CDN 原理、设计、部署以及运营等。

7.1.1 为什么使用CDN

(1)解决网站高流量、大并发的问题。我们知道,任何一个物理设备,其负载都有一个极限。为了应对访问量突增,使用CDN 服务是一个好的系统扩容方案。

(2)解决南北互联问题。我国的网络是划江而治的格局,因为利益之争,各网络服务商之间并不是通力协作,而是采取各种手段相互限制。这就导致各网之间的互联互通存在很大的问题,具体表现为:电信的用户访问放置在网通机房的服务器,响应时间特别长,反之亦然。使用CDN 技术,可以让电信的用户访问电信的内容缓存服务器,网通的用户访问网通的内容缓存服务器。通过这样一种策略,绕开了网络运营商之间人为设置的障碍。

(3)访问加速。CDN 采用缓存技术,把访问对象缓存起来,有的技术甚至能把对象缓存到内存(如Varnish ),这在效果上表现出来的即是访问加速。

(4)降低总体运营成本。在一些互联互通比较好的第三方BGP 机房,其带宽费高达300 ~ 400元/兆/月,而二、

三线城市单线接入的带宽费100M 一年的费用才5万左右。使用CDN 运营方案,我们把源站放在BGP 机房,而把缓存服务器放置在带宽费用较低的其他地方。因为CDN 的大部分流量被转移到缓存服务器上,源站只有较小的访问请求,因此总体运营成本大幅降低。

(5)提高网站的可用性。源站的访问量变得很小,这意味着源站系统有更低的负载,更低的磁盘I/O,防故障的几率大大降低。对于缓存服务器,多个服务器做成集群,保证了整个系统的高可用。

198

,

第7章 简单CDN (6)防DDOS 攻击。攻击负载被分配到不同的物理服务器,客观上起到防DDOS 的作用。

7.1.2 CDN适用的场合

任何一门技术,都有一定的适用范围,CDN 也不例外。实践证明,CDN 对于静态对象的加速和发布具有很好的效果,但对于动态的网站,则效果不佳。为了使用CDN 技术所带来的好处,我们可以通过动态内容静态化、静态内容分离(如动态站点里的图片)等方式,来加速访问和增强用户体验。

有哪些对象是静态可缓存的呢?这包括html 页面文件、视频文件、JS 文件、CSS 文件、EXE 文件、图片文件(JPEG 、GIF 、PNG )等。

7.1.3 CDN的组成

CDN 是一种组合技术,包括源站、缓存服务器、智能DNS 、客户端等几个部分。 ⏹ 源站指发布内容的原始站点。新增、删除和更改网站的文件,都是在源站上进

行的;缓存服务器抓取的对象也全部来自于源站。

缓存服务器是直接提供给用户访问的站点资源,有一个或数个服务器组成;当一个用户发起访问时,他的访问请求被智能DNS 定位到离他较近的缓存服务器。如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站抓取内容,然后再返还给用户;如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户。

智能DNS 是整个CDN 的核心,它负责根据用户的来源,将其访问请求转向到离用户较近或较合适的缓存服务器,如把长沙电信的用户请求转向到长沙电信机房的缓存服务器。实现智能DNS 的一种技术是:Bind View ,在Bind 9以后的版本,都应该支持View 视图这个功能。另外还有一个方案,即DNS 轮询方式。

客户端即发起访问的普通用户,一般的访问方式是浏览器。这个不再做说明。 ⏹ ⏹ ⏹

除了前面列举的组件外,还有一个可选项目,即用来进行内部域名以及源站的域名解析。因为是可选的,因此也可以通过使用本地hosts 指定主机名来代替。

199

,

接下来,我们以图示来总结一下CDN 各组件间的关系和访问流程。

图7-1 CDN 各部分间的关系

图7-1展示了两种比较典型的访问场景,这两种场景,基本上能反映整个CDN 的工作机制。

⏹ 场景一:当“A 网用户”访问被CDN 加速的站点 http://www.formyz.cn时,

从本地的DNS 查询域名,最终可能在全局智能DNS 服务器得到域名所对应的IP 地址,即图7-1所示“A 网的缓存服务器”的IP ;接着“A 网用户”浏览器向“A 网的缓存服务器”发起访问请求,幸运的是所需的默认页面文件index.htm 正好被缓存在“A 网的缓存服务器”里,于是缓存服务器立即返还数据,完成一次访问请求。

⏹ 场景二:当“B 网用户”访问被CDN 加速的站点 http://www.formyz.cn时,

从本地的DNS 查询域名,最终可能在全局智能DNS 服务器得到域名所对应的IP 地址,即图7-1所示“B 网的缓存服务器”的IP ;接着“B 网用户”浏览器向“B 网的缓存服务器”发起访问请求,但是缓存服务器并没有缓存默认页面文件index.html ,它需要先从源站取得这个对象,缓存并把内容返还给“B 网用户”。“B 网缓存服务器”通过“内部DNS ”知道源站在哪里。

7.1.4 CDN的基本特点

CDN 的基本特点可概括为:内容缓存、就近访问以及以DNS 视图方式根据用户来200

,

第7章 简单CDN 源确定其访问位置。

⏹ 内容缓存:缓存服务器从源站取得所需数据,然后暂存在本地的硬盘或内存。

使用这种缓存机制的好处是:内容自动更新;无多个服务器数据相互同步问题。 就近访问:让用户的访问请求转向到离用户最近或最易于访问的缓存服务器。 以DNS 视图方式根据用户来源确定其访问位置:即让电信的用户访问电信的缓存服务器,网通的用户访问网通的缓存服务器。 ⏹ ⏹

7.1.5 什么是简单CDN

简单CDN 这个概念,是相对于复杂CDN 来定义的。因此,我们先来了解一下什么是复杂的CDN 。

笼统一点讲,CDN 服务提供商所运营的环境,就是复杂CDN 。就缓存服务器而言,其结构是分层次的,一般可划分为核心节点和边缘节点,并且同一层级的相邻节点之间又可形成姐妹关系,亦即在同一个集群下的节点互为姐妹关系。为了保证最高的性能和效率,不提倡跨网或跨物理范围的节点形成姐妹关系。为了更直观地理解这个结构和由此产生的好处,这里以一个最长访问路径的图示来说明,如图7-2所示。

源站服务器

图7-2 缓存服务器相互关系

201

,

说明如下: (1)用户向某边缘服务器(边缘A )发起访问请求,所需内容没有被缓存。 (2)边缘服务器(边缘A )于是询问其邻居,是否缓存了用户所需的请求对象,邻居节点也没有缓存所需的对象。 (3)边缘服务器(边缘A )转而向某个父节点(核心A )请求文件,如果该父节

点仍然无所需的文件,则该父节点询问其邻居;如果邻居也没有所需的文件,则把请求转给源站。

(4)源站返回数据给核心节点(核心A ),并缓存数据在该节点。

(5)核心节点(核心A )返还数据给边缘节点(边缘A ),并缓存数据在该节点。

(6)边缘节点返还数据给用户,一次最长路径的访问完成。

这种分层机制,既能保证最高的可用性,又能最大限度地减少向上一级节点的网络流量。

除了缓存服务器结构上的差异外,复杂CDN 还具备以下一些特性。

⏹ 缓存服务器布点范围广,服务器数量庞大。

⏹ 复杂的日志处理系统。因为计费依赖于访问日志。

⏹ 详细的视图划分。例如精确到每个省的IP 地址段。

⏹ 预加载机制。

当我们了解了复杂CDN 以后,再来了解简单CDN 就容易多了。所谓简单CDN

,就是节点层次简单、服务器数量有限、能实现有限规模站点加速和发布的平台。通常情况下,我们不必为实现CDN 带来的好处而部署复杂的

CDN 系统,这将花费巨大的人力、物力。

7.2 简单CDN 的设计

202

,

第7章 简单CDN 7.2.1 简单CDN 设计的基本原则

简单CDN 设计主要考虑以下几点。

⏹ 选点合理,能覆盖大部分网络用户。最起码得在电信和网通机房放置缓存服务

器,如果经费充裕,把教育网也考虑进来。

系统本身具备很好的高可用特性。用户的访问主要集中在缓存服务器,缓存服务器之间使用集群技术就能得到比较高的系统可用性。

核算自建简单CDN 的成本,使之有较好的性价比。如果自建一个CDN 远比购买CDN 服务商所花费的资金还高(目前国内商用CDN 每兆带宽为50元/月,基数是1G ),基本上没必要自己建立CDN 了。

系统应该具备很好的伸缩能力,以适应各种业务变化。如增加布点、增加设备、增加站点等。 ⏹ ⏹ ⏹

7.2.2 需求描述

欲对3个Web 服务进行加速。为了描述方便,使用域名来进行说明。这3个加速站点为图片站点 images.sery.cn 、下载站点dl.sery.cn 、主站 www.sery.cn ,3个站点全部是静态内容,其页面文件主要是.html (htm )、.exe 、.css 、.jpeg 、.js 等,非常适合被缓存。

服务的主要目标用户包括电信线路的用户、网通线路的用户、教育网的用户,其他线路的用户(如科技网、长城宽带等)访问请求被转向到网通线路的缓存服务器。为了实现这个目标,我们可能需要放置4组服务器来做缓存,即电信1组,网通2组,教育网1组。

7.2.3 简单CDN 的设计

需求明确之后,接下来的设计工作包括:布点选取、工具选取、CDN 结构设计等几部分。

1.布点选取

布点包括源站、全局智能DNS 和缓存服务器集群。

⏹ 源站及全局智能DNS 选择互联互通性较好的第三方BGH 机房;因为使用CDN

服务的站点数量有限,故在缓存服务器以主机名的方式寻址源站。

203

,

⏹ 缓存服务器共4组,选择二线或三线城市的机房托管,能节省大量的资金(北京、上海等城市带宽价格大概在300 ~ 400元/兆/月,而偏远一点二三线城市(如安阳)1G 带宽的年总费用才8 ~ 10万)。 2.工具选取

工具包括操作系统、DNS 软件、缓存服务器软件、负载均衡软件、源站软件以及定制的脚本。

⏹ 所有的服务器均使用32位的CentOS 5.x。曾经使用过64位的系统,但在执行

缓存服务器的缓存清理操作时,有些小问题。

⏹ DNS 使用Bind-9.4.0。低于9.4.0的版本,可能不支持视图View ,没有视图功

能,智能DNS 就无法实现。

⏹ 缓存服务器有两种选择,一种是Squid ,另一种是Varnish 。Squid 多用在复杂

CDN 场景,它能实现缓存服务器间的层级关系(邻居形成姊妹、边缘节点与核心节点形成父子关系),功能强大而配置复杂;Varnish 为后起之秀,配置简单而性能卓越,维护起来也比较简单,因此本案选择Varnish 作为缓存工具。

⏹ 负载均衡由Ipvsadm 和Keepalived 两部分组成。Ipvsadm 是核心,负责包转发

和负载分摊;Keepalived 为框架,负责故障隔离和失败切换FailOver 。

⏹ 可做Web 服务的软件比较多,因为站点为简单的静态文件,选择Nginx 比较

省事。

⏹ 定制脚本的主要目的是自动刷新缓存服务,把这个脚本放在某个服务器上,

只需执行一次(也可使用Crontab 自动调用)就能实现所有缓存服务器的缓存清理。

3.CDN 结构设计

我们可以根据CDN 的角色来设计整个结构,这些角色包括源站、智能DNS 及缓存服务器3大部分,根据布点选择和其他因素综合考虑,可以绘出整个CDN 的布局结构图如图7-3所示。

204

,

第7章 简单CDN

图7-3 CDN 服务器布局

从图7-3中可以看出有两组缓存服务器放置在网通机房,这两组服务器不在同一个物理位置。这样做的主要目的是:Bind 规划视图View 时,能收集到的地址比较有限,不再收集列表的其他IP 地址段,则统统转发给网通B 机房的服务器;另外网通B 机房的带宽比较便宜,机器数量也比较多,跟其他网段的互联互通还可以。

(1)源站

源站为内容的原始发布,尽管采用CDN 技术以后源站的负荷会变得很小,但为了有较高的可用性,可以把它部署成负载均衡集群。

(2)智能DNS

智能DNS 是用来实现用户访问转向功能的,即通过建立访问列表,判断用户的访问来源,确定其访问对象的位置。在本案中,建立电信、网通、教育网3个IP 地址列表,未在这3个列表中的称为其他;每个列表关联一个Bind 的视图View ,那么一共有4个视图View 。地址列表可以自己收集,也可以花钱购买,地址列表越大,DNS 定向准确性越高。

(3)缓存服务器

缓存服务器是CDN 环境使用量最大的设备。为保证缓存服务本身的高可用,每个布点的服务器都以负载均衡集群的方式存在。根据以往的经验,访问负荷比较重的机器,非常容易损坏硬盘,因此在设计时,尽可能地缓存内容到内存中,以增加访问的速度和延长机器的寿命。据说,一些CDN 运营商已经开始用固态盘来做缓存空间。

205

,

在简单CDN 的运行环境中,由于我们所使用的资源有限(服务器数量有限、带宽有限),很可能出现超负荷运行的情况,如单个服务器TCP 连接数过高、CPU 负载过大、流量峰值带宽超出合同规定的范围等。为了随时掌握整个系统的运行情况,并能对其进行快速反应和调整,因此必须有监控系统对其服务、资源进行实时监控。 为了对设计有一个整体把握,将上文所做的叙述做一个汇总,如表7-1所示。

表7-1 CDN设计汇总

7.3 简单CDN 的实现

这里所讲“简单CDN 的实现”主要偏重于技术上的实现,即怎么部署相应的服务和运行它。根据从简到繁的顺序,我们依次描述源站、缓存服务器及全局智能DNS 的部署及运行。

7.3.1 源站的部署和运行

源站Web 服务既可以是Apache ,也可以是Nginx 。基于性能和部署简单考虑,选用Nginx 做Web 工具。

1.安装Nginx

(1)下载最新的稳定版到当前目录:

206

标签: