分类: LINUX
2016-08-16 21:46:17
前段时间介绍了浏览器缓存机制,通过浏览器缓存一方面可以改善用户的体验,而不用漫长地等待从服务器下载资源;另一方面减轻服务器压力、节省流量。CDN是另一种可以大幅度优化用户体验,且减轻服务器压力的技术。下面就自己了解的CDN技术分享下。
CDN的实现是一组技术的组合,每个技术都可以单独成文详细讨论,这里就不深入每个技术。内容目录:
1. 什么是CDN?
2. CDN技术原理
2.1. 分布式存储
2.2. 内容管理
2.3. 负载均衡
2.4. 网络请求的重定向
3. CDN资源访问流程
4. 关于CDN的疑问
4.1. 使用CDN后,如何获取客户端真实IP?
4.2. 采用CDN服务以后如何保证内容的更新和同步?
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘"(边缘服务器),使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。
CDN技术是在美国首先兴起并迅速发展起来的一种解决互联网性能不佳问题的有效手段。其基本思路就是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房;边缘主要指异地节点,CDN分发的载体,主要由Cache和负载均衡器等组成。
实际上,CDN是一种新型的网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。简单地说,CDN是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件。
这点显而易见,CDN网络将存储资源分布到各个地理位置、各个网段。存储系统作为CDN系统密不可分的一部分,将CDN分发的文件和数据库表记录内容存储起来,提供持续服务。存储系统采用三级存储架构,包括核心存储、CDN服务节点分布式缓存和终端本地缓存。任意一个点的存储崩溃或失效,并不影响系统服务的可用性。
图:当下云摘CDN的存储示意图(其它CDN也是类似)
如CDN系统在5大运营商(中国电信、中国网通、中国铁通、中国移动、中国联通)以及2大专有网络(中国教育和科研计算机网、中国科技网)都布有CDN节点。这样就消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。
内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN技术,能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。
CDN负载均衡系统实现CDN的内容路由功能。它的作用是将用户的请求导向整个CDN网络中的最佳节点。最佳节点的选定可以根据多种策略,例如距离最近、节点负载最轻等。负载均衡系统是整个CDN的核心,负载均衡的准确性和效率直接决定了整个CDN的效率和性能。通常负载均衡可以分为两个层次:全局负载均衡(GSLB)和本地负载均衡(SLB)。
l 全局负载均衡(GSLB)主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)。因此,就近性判断是全局负载均衡的主要功能。
l 本地负载均衡一般局限于一定的区域范围内,其目标是在特定的区域范围内寻找一台最适合的节点提供服务,因此,CDN节点的健康性、负载情况、支持的媒体格式等运行状态是本地负载均衡进行决策的主要依据。
负载均衡可以通过多种方法实现,主要的方法包括DNS、应用层重定向、传输层重定向等等。对于全局负载均衡而言,为了执行就近性判断,通常可以采用两种方式,一种是静态的配置,例如根据静态的IP地址配置表进行IP地址到CDN节点的映射。另一种方式是动态的检测,例如实时地让CDN节点探测到目标IP的距离(可以采用RRT,Hops作为度量单位),然后比较探测结果进行负载均衡。当然,静态和动态的方式也可以综合起来使用。
对于本地负载均衡而言,为了执行有效的决策,需要实时地获取Cache设备的运行状态。获取的方法一般有两种,一种是主动探测,一种是协议交互。主动探测针对SLB设备和Cache设备没有协议交互接口的情况,通过ping等命令主动发起探测,根据返回结果分析状态。另一种是协议交互,即SLB和 Cache根据事先定义好的协议实时交换运行状态信息,以便进行负载均衡。比较而言,协议交互比探测方式要准确可靠,但是目前尚没有标准的协议,各厂家的实现一般仅是私有协议,互通比较困难。
当用户访问了使用CDN服务的资源时,DNS域名服务器通过CNAME方式将最终域名请求重定向到CDN系统中的智能DNS负载均衡系统。智能DNS负载均衡系统通过一组预先定义好的策略(如内容类型、地理区域、网络负载状况等),将当时能够最快响应用户的节点地址提供给用户,使用户可以得到快速的服务。
同时,它还与分布在不同地点的所有CDN节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。
使用了CDN服务后,用户的访问流程如下图所示:
图:CDN用户访问流程图(摘自:)
同时,它还与分布在不同地点的所有CDN节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。
使用CDN服务之后获得原始IP地址发生变化。因为源服务器的请求都来自CDN节点,不知道客户原始IP。一般来说,CDN节点会以某种方式将源客户端的IP传递给源服务器,如有的网宿CDN,它是将源IP添加到了一个叫“Cdn-Src-Ip”的Http Header里,以C#语言为例,获得客户端真实IP的方式如下:(根据不同的CDN提供商可能会有所不同)。
C#代码 |
String srcIp = Request.Headers["Cdn-Src-Ip"]; if(srcIp == null) { srcIp = Request.UserHostAddress; } |
或者从HTTP请求Header中“HTTP_X_FORWARDED_FOR”字段获得。HTTP_X_FORWARDED_FOR的值是:"原始真实IP,1层代理IP,2层代理IP,....."。判断HTTP_X_FORWARDED_FOR是否为空(没有使用CDN或代理这个字段为空),不为空把这个作为IP地址。这是一个简单有效的方法。至于很复杂的情况就不处理了,比如多层代理。
在CDN服务中,CDN节点中的内容与源网站内容的同步主要是靠设置刷新时间策略来实现的。针对不同的内容设置不同的刷新时间,对于更新频率比较低的内容可以设置较长的刷新时间以减轻回源站的访问压力;对频繁更新的内容,我们可以设置成10分钟或更短,以此来保证内容的同步。设置刷新时间可以按目录来设置,也可以按具体URL来设置,或按某个关键字段来设置,非常灵活。