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)
共享存储(根据缓存数据量多少决定是否需要)
- 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 服务商的域名上。缓存服务和调度功能都是由服务商来完成。
- 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 节点不是最优化和最快的
….. 可能还有其他想不到的….
- 总结(Summary)
在建立 CDN 网路时,最关键的就是 智能调度 DNS,这个是 CND 网络总协调, 通过高效的调度算法,可以使用户得到最佳的访问体验.
其次就是 CND 节点的管理, 比如涉及到 内容的同步机制,配置文件的更新等等,都需要有一套机制来保证.
当然在大型网站中,也要考建设 CDN 体系的成本和回报率.