CDN-内容推送网络

时间:2022-09-17 13:18:05

前段时间介绍了浏览器缓存机制,通过浏览器缓存一方面可以改善用户的体验,而不用漫长地等待从服务器下载资源;另一方面减轻服务器压力、节省流量。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服务以后如何保证内容的更新和同步?

1.    什么是CDN?

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘"(边缘服务器),使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。

2.    CDN技术原理

CDN技术是在美国首先兴起并迅速发展起来的一种解决互联网性能不佳问题的有效手段。其基本思路就是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

CDN网络架构主要由两大部分,分为中心边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房;边缘主要指异地节点,CDN分发的载体,主要由Cache和负载均衡器等组成。

实际上,CDN是一种新型的网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。简单地说,CDN是一个经策略性部署的整体系统,包括分布式存储负载均衡网络请求的重定向内容管理4个要件。

2.1.         分布式存储

这点显而易见,CDN网络将存储资源分布到各个地理位置、各个网段。存储系统作为CDN系统密不可分的一部分,将CDN分发的文件和数据库表记录内容存储起来,提供持续服务。存储系统采用三级存储架构,包括核心存储、CDN服务节点分布式缓存和终端本地缓存。任意一个点的存储崩溃或失效,并不影响系统服务的可用性。

CDN-内容推送网络

图:当下云摘CDN的存储示意图(其它CDN也是类似)

如CDN系统在5大运营商(中国电信、中国网通、中国铁通、中国移动、中国联通)以及2大专有网络(中国教育和科研计算机网、中国科技网)都布有CDN节点。这样就消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。

2.2.         内容管理

内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN技术,能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。

2.3.         负载均衡

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根据事先定义好的协议实时交换运行状态信息,以便进行负载均衡。比较而言,协议交互比探测方式要准确可靠,但是目前尚没有标准的协议,各厂家的实现一般仅是私有协议,互通比较困难。

2.4.         网络请求的重定向

当用户访问了使用CDN服务的资源时,DNS域名服务器通过CNAME方式将最终域名请求重定向到CDN系统中的智能DNS负载均衡系统。智能DNS负载均衡系统通过一组预先定义好的策略(如内容类型、地理区域、网络负载状况等),将当时能够最快响应用户的节点地址提供给用户,使用户可以得到快速的服务

同时,它还与分布在不同地点的所有CDN节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。

3.    CDN资源访问流程

使用了CDN服务后,用户的访问流程如下图所示:

CDN-内容推送网络

图:CDN用户访问流程图(摘自:思必达CDN

  1. 用户向浏览器提供要访问网站的域名,域名解析的请求被发往网站的DNS域名解析服务器;
  2. 由于网站的DNS域名解析服务器对此域名的解析设置了CNAME,请求被指向CDN网络中的智能DNS负载均衡系统;
  3. 智能DNS负载均衡系统对域名进行智能解析,将响应速度最快的节点IP返回给用户;
  4. 浏览器在得到速度最快节点的IP地址以后,向CDN节点发出访问请求;
  5. 由于是第一次访问,CDN节点将回到源站取用户请求的数据并发给用户;
  6. 当有其他用户再次访问同样内容时,CDN将直接将数据返回给客户,完成请求/服务过程。

同时,它还与分布在不同地点的所有CDN节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。

4.    关于CDN的疑问

4.1.           使用CDN后,如何获取客户端真实IP?

使用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地址。这是一个简单有效的方法。至于很复杂的情况就不处理了,比如多层代理。

4.2.           采用CDN服务以后如何保证内容的更新和同步?

在CDN服务中,CDN节点中的内容与源网站内容的同步主要是靠设置刷新时间策略来实现的。针对不同的内容设置不同的刷新时间,对于更新频率比较低的内容可以设置较长的刷新时间以减轻回源站的访问压力;对频繁更新的内容,我们可以设置成10分钟或更短,以此来保证内容的同步。设置刷新时间可以按目录来设置,也可以按具体URL来设置,或按某个关键字段来设置,非常灵活。

 

CDN-内容推送网络的更多相关文章

  1. Git-最简单的本地项目变成版本仓库,然后把内容推送到GitHub仓库

    (注:本文的前提是本地Git仓库和github仓库之间已经存在SSH key了,所以如果没有建立联系的小伙伴们请先建立联系) 具体操作: 一:把本地项目变成版本仓库 1.把本地的一个项目目录编程版本库 ...

  2. Git将本地库内容推送到远程

    本地库与远程库的交互 1 .将本地库的内容推送到远程库 A.创建一个本地仓库 $ mkdir gitdemo B.初始化本地仓库 $ git init C.项目根目录下创建 .gitignore 文件 ...

  3. 2016030203 - 首次将内容推送到github中

    参考网址:http://www.cnblogs.com/plinx/archive/2013/04/08/3009159.html 和当你在你的github上创建repository后的提示信息如下 ...

  4. CDN 内容分发网络技术

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  5. 深度剖析:CDN内容分发网络技术原理--转载

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  6. git的某些默认行为--会推送pull的内容,即使commit的时候不显示

    今天一不小心又在git上犯了个大错误,用gitflow之前进行过pull分支的操作,然后用IDE选择修改的文件提交,可是推送的时候把pull的内容也推送到远程服务器了,提交的时候用git status ...

  7. HTTP/2之服务器推送(Server Push)最佳实践

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.   WeTest 导读 HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈.IETF在2015 ...

  8. Git学习笔记(4)——添加远程仓库,克隆远程库,以及库的推送

    本文记录了远程库的连接和库的克隆和推送. 远程仓库简介 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且 ...

  9. 【开源一个小工具】一键将网页内容推送到Kindle

    最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zh ...

随机推荐

  1. codevs 3288 积木大赛

    题目描述 Description 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终高度 ...

  2. SQLite数据库与Contentprovider(2)

    ContentProvider: 在创建ContentProvider时,需要首先使用数据库.文件系统或网络实现底层存储功能, 然后在继承ContentProvider的类中实现基本数据操作的接口函数 ...

  3. c#索引器的简单用法

    abstract class Bird { protected string name; public abstract string Name { get; set; } public abstra ...

  4. express的基本配置项

    express自动生成的app.js中有一段代码用app.set和app.use对express进行配置,但这些配置都是什么意思,以及都能做哪些配置并没有展开.这一节就专门来讲express的配置.上 ...

  5. 内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe

                  内核模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel; [root@localhost kern ...

  6. 安装eclipse要和JDK的位数相对应

    即JDK是32位时,eclipse也要装32位的

  7. 05_Javascript进阶第一天

    内部私有函数 function a(){ alert('aaa'); return function b(){ alert('bbb'); } } //调用内部私有函数b,方法1 var func=a ...

  8. 【python学习笔记】8.异常

    [python学习笔记]8.异常 raise Exception: 抛出指定异常 try/except: 捕捉异常 except: 第一个参数是需要捕获的异常类型,可以是多个类型组成元组,第二个参数是 ...

  9. Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

    在上一讲中, 我们着重的讲了表达式的一些基础知识和基本的使用, 今天我们来实战一把, 对Map的Value值排序进行简化. 在以前的思路我们的做法如下: /** * * Map根据value排序; * ...

  10. Mac下如何配置环境变量JDK

    1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...