一个通用型的CDN,如果要服务广域范围内的用户,那必然要在一个广大的区域内部署服务节点。那么,一个很重要的问题就来了,就是如何将用户的访问导向到最优节点上。
最优的含义有两层,一是访问速度最快,二是地理上最接近。从广域网络的特性上来说,一般情况下是同城同运营商的两端之间通信效果最好。
而普通用户上网,大致的过程就是终端通过http协议访问一个URL地址,然后由本地DNS解析得到服务器的IP地址。终端再向获得的IP地址发起TCP连接,收取数据。
无CDN时的上网过程
上图所示是一般的访问互联网的过程。而在CDN系统里,终端要想与同城同运营商的节点服务器连接上,这就是全局调度要解决的核心问题。
在图中就是“返回服务器IP地址”这一步,最理想情况下,本地DNS返回的就是最优节点地址。接下来就说明从技术上如何实现这一步。
基于智能DNS的调度
用户有可能在全国任何一个地点上网,不过总是要通过DNS系统解析域名而获得服务器的IP地址。如果能够从DNS处就取得最优节点,这势必能大大减少调度阶段所耗费的时间。
于是需要解决的第一个问题,就是如何判定终端所在的地域与运营商环境。可是在早期的DNS协议中,并不支持这一功能,DNS仅是在执行递归查询之后,将配置好的IP返回。
智能DNS技术为解决这个问题提供了实现方法。智能DNS的智能之处,就是它可以获得用户的IP,并对其进行分析,得到用户所在的地域和使用的运营商线路。
具备了智能DNS功能的处理过程如下图所示。
智能DNS全局调度
智能DNS技术选型
对于智能DNS的搭建,可以使用开源工具BIND(Berkeley Internet Name Domain),结合EDNS协议,再加上一个存储了IP地址地理信息的数据库,就可以实现智能DNS技术。
EDNS是google提交的扩展DNS协议,它相较于普通DNS,可以获取终端真实IP地址。这样就可以在存储了IP地址地理信息的数据库中通过查询,得到终端所在的地域与所属运营商信息,从而将其导向最优节点。
IP地址地理信息库则可以使用GeoIP,从dev.maxmind.com站点可以下载源库。不过,IP地理信息是时常会变化的,地址库需要定期更新。如果在技术上要求精确,则应该考虑购买商业产品。
数据库可使用关系型的MySQL,或者缓存型的redis。无论需要支持哪种数据库,都必须在BIND的源码中打上相应的补丁,经过编译后才能使用。
技术栈:BIND(支持EDNS协议) + mysql或redis(GeoIP地理信息库)。
基于http的重定向调度
智能DNS技术的优点突出,不过也存在一些缺陷。例如URL被本地DNS解析之后,则会将IP地址缓存起来,这样其他终端就无法得到最优节点。
因此,在应用层根据访问协议,以重定向的方式将终端导向最优节点,就是一个很好的解决办法。目前应用最广泛的,则是基于http协议的302返回码进行跳转。
http是一套基于文本,且简单、清晰、易理解的应用层通信协议。它采用TCP协议进行传输,也是目前互联网上最通用的应用协议。
相较于DNS的调度方式,http的调度可以扩展多个维度。因为DNS调度中只有终端IP这一个可参考依据,只能按地域和运营商来配置最优节点。
而http调度可以将内容、终端型号、用户身份等作为参考依据,实现更加合理的调度。例如,已经缓存了内容的最优节点会被优先导向;如果是付费VIP用户,则可以给其拥有最好线路的机房节点。
对于http全局调度服务,业界一般将其称为GSLB(Global Server Load Balancing),即全局负载均衡。从技术实现上来说,GSLB一般是以WEB接口作为前端,然后各个厂家会实现自己的全局调度业务逻辑。
http重定向的全局调度
目前业界使用较多的是Nginx+lua的方式实现服务调度。
全局调度完成的工作,是将终端导向到最优的节点。而一个逻辑上的节点,在物理上可能是一个机房,内有数台至数十台的服务器。
在这些服务器上则部署着本地负载均衡服务、反向代理服务,以及内容缓存服务。而本地调度要做的工作就是在节点内部,基于负载均衡策略,为终端与缓存服务之间构建起一条数据传输通道。
本地调度技术选型
从实施上来说,可以选择硬件负载均衡设备F5。也可以采用OSPF+LVS+Keepalived的技术方案。
LVS是由章文嵩博士在1998年创立的开源软件项目。LVS是linux Virtual Server的缩写,它的目的是将若干台Linux服务器通过网络组建成高性能、高可用、可伸缩的集群。
LVS工作在网络栈的第四层,即传输层。它支持多种本地负载均衡策略,有VS/NAT,VS/TUN,VS/DR三种工作模式。目前业界较多采用VS/DR模式。
VS/DR是直接路由方式,实现方式是LVS收到用户请求后,按负载均衡策略从集群中挑选了一台服务器,然后修改请求数据包中的目标mac地址,将其转发给目标服务器进行处理。DR模式要求集群内的服务器都在同一个网段内。
基于LVS实现负载均衡的典型架构,一般是两台安装LVS的服务器作为双主双活,配置一个虚拟地址VIP。然后安装支持OSPF协议的开源路由工具:Quagga。
Quagga的作用是将LVS主机虚拟成一台路由器,这样通过OSPF协议将物理路由器与两台LVS服务器,构建出等价多路径。以此实现LVS的双主轮询工作方式。
在对节点内服务器探测方面,采用Keepalived开源工具。它最初就是为了LVS而设计的,可对集群内的服务器进行检测,并实现自动化的维护工作。
LVS负载均衡实现本地调度
技术栈:LVS + Quagga + Keepalived。
CDN系统的调度工作分为两个部分,一是全局调度,二是本地调度。
全局调度的目标是以最快的速度,将终端导向最优节点。最优的依据则是地理上接近、相同的运营商,节点本身缓存有请求的内容,以及节点状况良好。
基于智能DNS技术的优点是可以解决地域与运营商的匹配,而且减少了终端与节点间建立连接的时间。但缺点是无法根据内容与用户特点进行导向,难以扩展判断维度。
基于http重定向的方式,则可以拥有多维度的判断依据,而且也便于扩展。其缺点则是响应速度受限于中心服务的处理能力。
在实践中可以采用两者相结合的方式。例如DNS调度之后的节点如果不能满足要求,则可以通过http的调度再匹配最优节点。
本地调度的目标,是在机房内实现数据传输的负载均衡。使用的技术可以是硬件F5,工作在四层的LVS,或者是Nginx。
采购硬件的方式是成本高,实施快捷。使用LVS技术能够获得较快的传输效率,但配置和管理会复杂一些。而使用Nginx则配置简单,但传输效率会差一些,在吞吐量大的时候,其所在服务器可能会成为传输瓶颈。