分布式架构之CDN加速文件访问

1.简介

CDN加速大家应该都不陌生,至少是有听说过的,其实我们应该每天都会无形中使用到它,大多数比较优秀的互联网公司都会用到它来提高网站的响应速度,比如阿里,腾讯等.CDN是Content Delivery Network的简称,即“内容分发网络”的意思,一般是指网站加速或者用户下载资源加速.

简单来说,CDN相当于一个中间代理,原来我们需要请求某个网址比如www.baidu.com,请求会直接发送至百度的服务器上,假如请求者在新疆,但百度的服务器在北京,这样的话请求和响应都会受距离影响慢一些,但有了CDN后,请求是先发至距离请求IP定位最近的CDN服务器上,该服务器上缓存了www.baidu.com页面上的一些静态文件,比如js,css.html,图片等,这样对请求的发起者来说,获取这些静态资源就比较近了,因此可以起到一定的加速效果.至于动态的资源,因为是可变的,所以无法通过缓存的方式存储在CDN服务器上,仍需要通过CDN去请求对应服务器获取资源,所以CDN加速仅限于静态资源.下图是某CDN第三方在国内部署的CDN节点.


在分布式系统中,CDN可以一定程度的减轻服务器的IO压力,提高响应速度,而且在使用CDN后用户的请求是发送到CDN服务器上的,可以避免用户直接访问源服务器,从而可以一定程度上提高系统安全性,降低被黑客攻击的可能性,类似于保护代理...

但CDN的架设成本比较高,就像快递公司的网点一样,如果需要提高服务效率和质量,需要在全国各个地区都设有网点,而且在人口稠密地区需要架设更多的网点来缓解单个网点的压力,这笔成本可以说是非常高了,所以一般CDN加速都是由专门的第三方大公司去做的,比如阿里,七牛云等,对小公司而言,自己架设成本太高,如果需要CDN加速,直接付费使用第三方提供的即可,价格合理,治理方便,一般第三方会提供详细的使用文档和优质的服务.


 2.CDN 的工作原理

CDN网络是在用户和服务器之间增加Cache层,主要是通过接管DNS实现,将用户的请求引导到Cache上获得源服务器的数据。步骤如下:

用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址.

LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期)

ROOT DNS将域名授权dns记录回应给 LocalDns

LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址

域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns

LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址

智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns

LocalDns 将得到的域名ip地址,回应给 用户端

用户得到域名ip地址后,访问站点服务器

CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)

 通过以上的分析我们可以得到,为了实现对普通用户透明(使用缓存后用户客户端无需进行任何设置)访问,需要使用DNS(域名解析)来引导用户来访问Cache服务器,以实现透明的加速服务. 由于用户访问网站的第一步就是域名解析,所以通过修改dns来引导用户访问是最简单有效的方式.

CDN网络的组成要素

对于普通的Internet用户,每个CDN节点就相当于一个放置在它周围的网站服务器. 通过对dns的接管,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求. 由于它离用户更近,因而响应时间必然更快.

从上面图中 虚线圈起来的那块,就是CDN层,这层是位于 用户端 和 站点服务器 之间.

智能调度DNS(比如f5的3DNS) 

智能调度DNS是CDN服务中的关键系统.当用户访问加入CDN服务的网站时,域名解析请求将最终由 “智能调度DNS”负责处理。它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。同时它需要与分布在各地的CDN节点保持通信,跟踪各节点的健康状态、容量等信息,确保将用户的请求分配到就近可用的节点上.

缓存功能服务 

负载均衡设备(如lvs,F5的BIG/IP) 

内容Cache服务器(如squid) 

共享存储(根据缓存数据量多少决定是否需要)

3. CDN 智能调度Dns 实例分析

3.1 分析img.alibaba.com域名

在系统中,执行dig命令,输出如下:

#dig img.alibaba.com


; 部分省略


;; QUESTION SECTION:

;img.alibaba.com. IN A


;; ANSWER SECTION:

img.alibaba.com. 600 IN CNAME img.alibaba.com.edgesuite.net.

img.alibaba.com.edgesuite.net. 7191 IN CNAME img.alibaba.com.georedirector.akadns.net.

img.alibaba.com.georedirector.akadns.net. 3592 IN CNAME a1366.g.akamai.net.

a1366.g.akamai.net. 12 IN A 204.203.18.145

a1366.g.akamai.net. 12 IN A 204.203.18.160


; 部分省略

从上面查询结果可以看出 img.alibaba.com. CNAME img.alibaba.com.edgesuite.net. 后面的CNAME是由 Akamai(CDN服务商) 去跳转到 智能调度器上的.

3.2 分析www.discovery.com域名

在系统中,继续执行dig命令,输出如下:

#dig www.discovery.com


; 部分省略


;; QUESTION SECTION:

;www.discovery.com. IN A


;; ANSWER SECTION:

www.discovery.com. 1077 IN CNAME www.discovery.com.edgesuite.net.

www.discovery.com.edgesuite.net. 21477 IN CNAME a212.g.akamai.net.

a212.g.akamai.net. 20 IN A 204.203.18.154

a212.g.akamai.net. 20 IN A 204.203.18.147


; 部分省略

从上面查询结果可以看出 www.discovery.com. IN CNAME www.discovery.com.edgesuite.net. 后面的CNAME是由 Akamai(CDN服务商) 去跳转到 智能调度器上的.

总结:一般来说,网站需要使用到CDN服务时,一般都是将需要加速访问的域名 CNAME到 CDN服务商的域名上。缓存服务和调度功能都是由服务商来完成。

4. CDN的 智能调度Dns 简化实现

4.1. 调度策略说明

在用户请求解析域名的时候,智能DNS判断用户的LocalDns的IP,然后跟DNS服务器内部的IP表范围匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址。这里使用的是静态拓扑的方法,只是判断LocalDns的IP.要想使用更复杂的调度算法可以考虑商业产品,如F5的3DNS。

4.2. 假设CDN节点规划

在这里我们将使用 BIND 的View功能来实现运营商的区分,假设我们在每个运营商的机房都放有一个CDN节点,列表如下:

域名 运营商(view) 服务地址

www.cdntest.com 网通(CNC) 192.168.0.1

www.cdntest.com 电信(TELECOM) 192.168.0.2

www.cdntest.com 教育网(EDU) 192.168.0.3

www.cdntest.com 默认(ANY) 192.168.0.4

4.3. bind view 配置

以下是named.conf配置文件的部分截取,只是涉及到 View 的部分,其他细节可参考互联网.


acl "cnc_iprange"{ //定义ip范围(网通)

192.168.1.0/24;

192.168.2.0/24;

//此处只是示例,其他省略

};


acl "tel_iprange"{ //定义ip范围(电信)

192.168.3.0/24;

192.168.4.0/24;

//其他省略

};


acl "edu_iprange"{ //定义ip范围(教育网)

192.168.5.0/24;

192.168.6.0/24;

//其他省略

};


acl "default_iprange"{ //定义ip范围(默认)

192.168.7.0/24;

192.168.8.0/24;

//其他省略

};



view "CNC" {

Match-clients{cnc_iprange};

zone "." IN {

type hint;

file "named.root";

};


zone "localhost" IN {

type master;

file "localhost.zone";

allow-update { none; };

};


zone "cdntest.com" IN {

type master;

file "cnc_cdntest.zone";

};

};


view "TEL" {

Match-clients{tel_iprange};

zone "." IN {

type hint;

file "named.root";

};


zone "localhost" IN {

type master;

file "localhost.zone";

allow-update { none; };

};


zone "cdntest.com" IN {

type master;

file "tel_cdntest.zone";

};

};


view "EDU" {

Match-clients{edu_iprange};

zone "." IN {

type hint;

file "named.root";

};


zone "localhost" IN {

type master;

file "localhost.zone";

allow-update { none; };

};


zone "cdntest.com" IN {

type master;

file "edu_cdntest.zone";

};

};


view "DEFAULT" {

Match-clients{default_iprange};

zone "." IN {

type hint;

file "named.root";

};


zone "localhost" IN {

type master;

file "localhost.zone";

allow-update { none; };

};


zone "cdntest.com" IN {

type master;

file "default_cdntest.zone";

};

};

zone文件的配置说明

这4个zone配置文件(cnc_cdntest.zone,tel_cdntest.zone,edu_cdntest.zone,default_cdntest.zone)中,只有www.cndtest.com的A记录不一样,其他的都是一样.

域名 zone配置文件 A记录地址

www.cdntest.com cnc_cdntest.zone 192.168.0.1

www.cdntest.com tel_cdntest.zone 192.168.0.2

www.cdntest.com edu_cdntest.zone 192.168.0.3

www.cdntest.com default_cdntest.zone 192.168.0.4

以上只列出了 www.cdntest.com 的A记录地址,其他关于zone的语法 请参考互联网.

域名解析流程简要说明

用户向 LocalDns 查询域名 www.cdntest.com

LocalDns 向 授权DNS 查询www.cdntest.com

授权DNS 判断用户使用的 LocalDns的ip地址,匹配上述设置的ip范围,如果范围在网通,就将网通对应的ip地址(192.168.0.1),回应给LocalDns(其他依此类推)

LocalDns 将得到的域名ip地址,回应给 用户端 (域名解析完成)

说明:再此过程中,我们简化了主DNS 到 智能DNS 之间的CNAME过程(为了简要说明问题). 

这里使用的是静态拓扑(根据ip范围)的方法,也称为地域化方法,只是判断LocalDns的IP.

此简化方案中的存在的问题

如果用户设置错误的dns,可能会导致用户访问比原来慢(比如网通用户设置了电信的DNS)

不能判断CDN节点服务器的健康状态和容量状态,可能会把用户定向到不可用的CDN节点

由于静态拓扑方法,可能存在用户访问的CDN节点不是最优化和最快的

…..可能还有其他想不到的….

5. 总结(Summary)

在建立CDN网路时,最关键的就是 智能调度DNS,这个是CND网络总协调,通过高效的调度算法,可以使用户得到最佳的访问体验.

其次就是 CND节点的管理,比如涉及到 内容的同步机制,配置文件的更新等等,都需要有一套机制来保证.

当然在大型网站中,也要考建设CDN体系的成本和回报率.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352