CDN的关键技术主要有内容路由技术、内容分发技术、内容存储技术、内容管理技术等,而本文介绍的GSLB是属于CDN中的内容路由技术的关键技术。
一、内容路由技术简介:
CDN负载均衡系统实现CDN的内容路由功能,它的作用是将用户的请求导向整个CDN网络中的最佳节点。最佳节点的选定可以根据多种策略,例如距离最近、节点负载最轻等。
负载均衡系统是整个CDN的核心,负载均衡的准确性和效率直接决定了整个CDN的效率和性能。通常负载均衡可以分为两个层次:全局负载均衡(GSLB)和本地负载均衡(SLB)。负载均衡可以通过多种方法实现,主要的方法包括DNS、应用层重定向、传输层重定向等等。
1.全局负载均衡(GSLB)主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域),因此,就近性判断是全局负载均衡的主要功能。
对于全局负载均衡而言,为了执行就近性判断,通常可以采用两种方式,一种是静态的配置,例如根据静态的IP地址配置表进行IP地址到CDN节点的映射。另一种方式是动态的检测,例如实时地让CDN节点探测到目标IP的距离(可以采用RRT,Hops作为度量单位),然后比较探测结果进行负载均衡。当然,静态和动态的方式也可以综合起来使用。
2. 本地负载均衡一般局限于一定的区域范围内,其目标是在特定的区域范围内寻找一台最适合的节点提供服务,因此,CDN节点的健康性、负载情况、支持的媒体格式等运行状态是本地负载均衡进行决策的主要依据。
对于本地负载均衡而言,为了执行有效的决策,需要实时地获取Cache设备的运行状态。获取的方法一般有两种,一种是主动探测,一种是协议交互。
1)主动探测针对SLB设备和Cache设备没有协议交互接口的情况,通过ping等命令主动发起探测,根据返回结果分析状态。
2)另一种是协议交互,即SLB和Cache根据事先定义好的协议实时交换运行状态信息,以便进行负载均衡。
比较而言,协议交互比探测方式要准确可靠,但是目前尚没有标准的协议,各厂家的实现一般仅是私有协议,互通比较困难。
二、GSLB的常用技术
GSLB常用技术主要是下面三种:
代码语言:javascript复制1) DNS调度:基于请求端local dns的出口IP归属地及运营商属性的DNS调度;
2) 302调度:基于客户端IP归属地及运营商属性的302跳转调度;
3) 路由调度:基于Anycast技术(BGP路由)的机房流量调度;
1.DNS调度
代码语言:javascript复制执行步骤如下所示:
① 提交域名
② 客户端解析域名
③ NS解析到GSLB-
// 3的GSLB服务器(例如阿里云、腾讯云等)一般是厂商的调度服务器,
// 对于加速域名来说,域名的关联关系为:
// a.com-->加速域名的cname: a.XXX.com--->
// 厂商提供服务的线路a.XXXX.ali.com(这个往往是GSLB的服务器)
④ GSLB解析并返回IP
// 4通过最终客户的域名经CDN的调度域名解析出CDN节点的IP,将对应的IP地址返回给GSLB服务器
// 这里的域名解析往往是通过,当前访问加速域名的用户所在的“地区 供应商”,例如 “上海电信”
// 到dns服务器上去查询,对应的CDN所在地区和厂商的最近IP所属的那些服务器IP。
⑤ 客户端请求IP
⑥ 返回结束
例子如下所示:
代码语言:javascript复制$ dig p200107.ping.dnsv1.com
。。。。。。
p200107.ping.dnsv1.com. 588 IN CNAME k97hqyk4.tweb.sched.ovscdns.com.
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 203.205.137.254
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 203.205.137.123
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 119.28.164.234
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 119.28.165.56
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 203.205.136.55
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 119.28.165.55
k97hqyk4.tweb.sched.ovscdns.com. 168 IN A 203.205.136.62
。。。。。
这种方式的优缺点:
代码语言:javascript复制优点:
1.简单易用、用户无感知
2.客户端兼容性好
缺点:
1.调度策略非实时生效
原因:DNS是树型分布式系统,所有节点上都会按域名的TTL来做缓存,
这就导致CDN的调度策略其实并不是实时生效的。
2. 调度不够精确
原因:大量的local DNS不支持edns协议,拿不到客户的真实IP,
CDN绝大多数时候只能通过local DNS ip来做决策,
而local DNS ip有时候不太靠谱。
(一种是厂商配置的localDNS 并不是本地的IP地址,例如上海的IP配置了北京的DNS,
一种是8.8.8.8这种Public DNS,接入IP是Anycast IP没有归属地一说,
出口IP经常变动,比如中国大陆使用时,出口IP经常是中国台湾的google机房。)
2. http redirection 302跳转
代码语言:javascript复制执行步骤如下所示:
① 提交域名
② 客户端解析域名
③ DNS解析域名为GSLB // 这里的GSLB服务器与上面的一致,都是厂商提供的
④ 客户端提交请求给GSLB服务器
⑤ GSLB解析出目标IP并发起HTTP转发
// 这里返回的CDN服务器IP,往往通过CDN的负载情况、RTT时间,
// 每个CDN服务器的权重、以及用户与服务器之间的位置和供应商来决策,
// 当然这些决策也是由厂商(例如阿里、腾讯)等给出的。
⑥ 客户跳转发请求到目标IP
⑦ 返回结束
例子如下所示:
代码语言:javascript复制HTTP/1.1 302 Moved Temporarily
Server: stgw/1.3.6.2_1.13.5
Date: Sun, 16 Dec 2018 19:38:58 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive
Location: http://61.142.166.245/p73.ping.dnsv1.com/a.php
// 备注: 这里的61.142.166.245 是302 跳转之后,厂商返回的CDN 服务IP。
(例子来源于:https://cloud.tencent.com/developer/article/1394677)
这种方式的优缺点:
代码语言:javascript复制优点:
1.实时调度、准确性高
原因:由于可以拿到请求的出口IP,每次拿到的最终IP都是实时计算的结果,
所以调度策略是实时生效的,也是当前网络中的最真实情况提供的IP。
缺点:
1.业务兼容性: 要求用户的客户端必须支持302跳转。
2.增加了访问的延迟:使用于对延时敏感业务。
原因:这种模式的调度,每个请求都会多出一次http交互。
比如web静态小资源就不太合适,适用于客户端兼容性好的大文件下载业务。
3.路由调度
Anycast路由技术使得物理分布在全球/全球不同区域的不同服务器具有相同的IP地址,客户端对这个IP的请求会在路由层面引导到最近的物理服务器上。常见于国外的CDN厂商,例如Cloudflare,这不做进一步介绍,可以参考:
https://www.cloudflare.com/zh-cn/learning/cdn/glossary/anycast-network/
参考资料:
http://www.idcquan.com/CDN/720016.html
https://blog.csdn.net/zhaqiwen/article/details/42024045
https://my.oschina.net/u/2822116/blog/736558
https://sking7.github.io/articles/1006724251.html
https://cloud.tencent.com/developer/article/1394677
https://chongit.github.io/2015/04/15/GSLB概要和实现原理/
https://www.cnblogs.com/peon/archive/2007/12/30/1021219.html
LVS:http://www.linuxvirtualserver.org/zh/lvs1.html