文章同步于Github Pines-Cheng/blogcss
CDN(内容分发网络)
全称是 Content Delivery Network
,创建并覆盖在承载网之上、由分布在不一样区域的边缘节点服务器群组成的分布式网络,替代传统以 WEB Server
为中心的数据传输模式。html
做用是将源内容发布到边缘节点,配合精准的调度系统;将用户的请求分配至最适合他的节点,使用户能够以最快的速度取得他所需的内容,有效解决Internet网络拥塞情况,提升用户访问的响应速度。git
用户经过浏览器等方式访问网站的过程如图所示:github
用户在本身的浏览器中输入要访问的网站域名。web
浏览器向 本地DNS服务器 请求对该域名的解析。浏览器
本地DNS服务器中若是缓存有这个域名的解析结果,则直接响应用户的解析请求。缓存
本地DNS服务器中若是没有关于这个域名的解析结果的缓存,则以递归方式向整个DNS系统请求解析,得到应答后将结果反馈给浏览器。安全
浏览器获得域名解析结果,就是该域名相应的服务设备的 IP地址 。服务器
浏览器向服务器请求内容。网络
服务器将用户请求内容传送给浏览器。
在网站和用户之间加入 CDN 之后,用户不会有任何与原来不一样的感受。最简单的 CDN 网络有一个 DNS 服务器和几台缓存服务器就能够运行了。一个典型的 CDN 用户访问调度流程如图所示:
当用户点击网站页面上的内容URL,通过本地DNS系统解析,DNS 系统会最终将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器。
CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回用户。
用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。
CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
基于如下这些条件的综合分析以后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址:
根据用户 IP 地址,判断哪一台服务器距用户最近;
根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;
查询各个服务器当前的负载状况,判断哪一台服务器尚有服务能力。
全局负载均衡设备把服务器的 IP 地址返回给用户。
用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。若是这台缓存服务器上并无用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
DNS 服务器根据用户 IP 地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用 CDN 服务的网站,只需将其域名解析权交给 CDN 的全局负载均衡(GSLB)设备,将须要分发的内容注入 CDN,就能够实现内容加速了。
使用CDN后的http请求处理流程以下图,其中左边为DNS解析过程,右边为内容访问过程:
CDN基于这样的原理:
挑选最优设备为用户提供服务;
若是某个内容被不少用户所须要,它就被缓存到距离用户最近的节点中。
CDN 公司在整个互联网上部署数以百计的CDN服务器(Cache),这些服务器一般在运营商的 IDC (互联网数据中心Internet Data Center)
中,尽可能靠近接入网络和用户。CDN在Cache中复制内容,当内容的提供者更新内容时,CDN 向Cache从新分发这些被刷新的内容。CDN提供一种机制,当用户请求内容时,该内容可以由以最快速度交付的Cache 来向用户提供,这个挑选"最优"的过程就叫作负载均衡。被选中的最优 Cache 可能最靠近用户,或者有一条与用户之间条件最好的路径。
从功能上划分,典型的 CDN 系统架构由分发服务系统
、负载均衡系统
和运营管理系统
三大部分组成,如图所示:
该系统的主要做用是实现将内容从内容源中心向边缘的推送和存储,承担实际的内容数据流的全网分发工做和面向最终用户的数据请求服务。分发服务系统最基本的工做单元就是许许多多的 Cache设备(缓存服务器),Cache 负责直接响应最终用户的访问请求,把缓存在本地的内容快速地提供给用户。同时 Cache 还负责与源站点进行内容同步,把更新的内容以及本地没有的内容从源站点获取并保存在本地。
通常来讲,根据承载内容类型和服务种类的不一样,分发服务系统会分为多个子服务系统,如网页加速子系统
、流媒体加速子系统
、应用加速子系统
等。每一个子服务系统都是一个分布式服务集群,由一群功能近似的、在地理位置上分布部署的 Cache 或 Cache 集群组成,彼此间相互独立。每一个子服务系统设备集群的数量根据业务发展和市场须要的不一样,少则几十台,多则可达上万台,对外造成一个总体,共同承担分发服务工做。Cache 设备的数量、规模、总服务能力是衡量一个 CDN 系统服务能力的最基本的指标。
分发服务系统在承担内容的更新、同步和响应用户需求的同时,还须要向上层的调度控制系统提供每一个Cache设备的健康情况信息、响应状况,有时还须要提供内容分布信息,以便调度控制系统根据设定的策略决定由哪一个Cache(组)来响应用户的请求最优。
负载均衡系统是一个 CDN 系统的神经中枢,主要功能是负责对全部发起服务请求的用户进行访问调度,肯定提供给用户的最终实际访问地址。大多数 CDN 系统的负载均衡系统是分级实现的,这里以最基本的两级调度体系进行简要说明。通常而言,两级调度体系分为全局负载均衡(GSLB)
和本地负载均衡(SLB)
。
其中,全局负载均衡(GSLB)主要根据 用户就近性原则,经过对每一个服务节点进行"最优"判断,肯定向用户提供服务的 Cache 的物理位置。最通用的 GSLB 实现方法是基于DNS解析
的方式实现,也有一些系统采用了应用层重定向
等方式来解决。本地负载均衡(SLB)主要负责节点内部的设备负载均衡,当用户请求从 GSLB 调度到 SLB 时,SLB 会根据节点内各 Cache 设备的实际能力或内容分布等因素对用户进行重定向,经常使用的本地负载均衡方法有基于4层调度
、基于7层调度
、链路负载调度
等。
CDN的运营管理系统与通常的电信运营管理系统相似,分为运营管理和网络管理两个子系统。
运营管理子系统是CDN系统的业务管理功能实体,负责处理业务层面的与外界系统交互所必需的一些收集、整理、交付工做,包含客户管理、产品管理、计费管理、统计分析等功能。
网络管理子系统实现对CDN系统的网络设备管理、拓扑管理、链路监控和故障管理,为管理员提供对全网资源进行集中化管理操做的界面,一般是基于Web方式实现的。
CDN 系统设计的首要目标是尽可能减小用户的访问响应时间,为达到这一目标,CDN 系统应该尽可能将用户所须要的内容存放在距离用户最近的位置。也就是说,负责为用户提供内容服务的 Cache 设备应部署在物理上的网络边缘位置,咱们称这一层为CDN边缘层
。CDN 系统中负责全局性管理和控制的设备组成 中心层
,中心层同时保存着最多的内容副本,当边缘层设备未命中时,会向中心层请求,若是在中心层仍未命中,则须要中心层向源站回源。
不一样CDN系统设计之间存在差别,中心层可能具有用户服务能力,也可能不直接提供服务,只向下级节点提供内容。若是CDN网络规模较大,边缘层设备直接向中心层请求内容或服务会形成中心层设备压力过大,就要考虑在边缘层和中心层之间部署一个区域层
,负责一个区域的管理和控制,也保存部份内容副本供边缘层访问。
如图是一个典型的CDN系统三级部署示意图:
节点是 CDN 系统中最基本的部署单元,一个CDN系统由大量的、地理位置上分散的 POP(point-of-presence)节点组成,为用户提供就近的内容访问服务。
CDN 节点网络主要包含 CDN 骨干点
和 POP 点
。CDN 骨干点
和 CDN POP 点
在功能上不一样。
中心和区域节点通常称为骨干点,主要做为内容分发和边缘未命中时的服务点;
边缘节点又被称为POP(point-of-presence)节点
,CDN POP点主要做为直接向用户提供服务的节点。
可是,从节点构成上来讲,不管是CDN骨干点仍是CDN POP点,都由Cache设备和本地负载均衡设备构成。
在一个节点中,Cache设备和本地负载均衡设备的链接方式有两种:一种是旁路方式,一种是穿越方式。
如图所示:
在穿越方式下,SLB(Server Load Balancer,负载均衡
通常由 L4-7 交换机实现,SLB 向外提供可访问的 公网IP地址(VIP
,每台Cache仅分配私网IP地址,该台SLB下挂的全部Cache构成一个服务组。全部用户请求和媒体流都通过该SLB设备,再由SLB设备进行向上向下转发。SLB实际上承担了 NAT(Network Address Translation,网络地址转换)
功能,向用户屏蔽了Cache设备的IP地址。这种方式是CDN系统中应用较多的方式,优势是具备较高的安全性和可靠性,缺点是L4-7交换机一般较为昂贵。另外,当节点容量大时,L4-7交换机容易造成性能瓶颈。不过近年来,随着 LVS (Linux Virtual Server,即Linux虚拟服务器)
等技术的兴起,SLB设备价格有了大幅降低。
在旁路方式下,有两种 SLB 实现方式:
在早期,这种 SLB 通常由软件实现。SLB 和 Cache 设备都具备公共的IP地址,SLB 和 Cache 构成并联关系。用户须要先访问 SLB 设备,而后再以重定向的方式访问特定的 Cache。这种实现方式简单灵活,扩展性好,缺点是安全性较差,并且须要依赖于应用层重定向。
随着技术的发展,L4-7 交换机也可采用旁路部署(负载均衡硬件设备的部署)方式,旁挂在路由交换设备上,数据流量经过三角传输方式进行。
在CDN系统中,不只分发服务系统和调度控制系统是分布式部署的,运营管理系统也是分级分布式部署的,每一个节点都是运营管理数据的生成点和采集点,经过日志和网管代理等方式上报数据。能够说,CDN自己就是一个大型的具备中央控制能力的分布式服务系统。
当下的互联网应用都包含大量的静态内容,但静态内容以及一些准动态内容又是最耗费带宽的,特别是针对全国甚至全世界的大型网站,若是这些请求都指向主站的服务器的话,不只是主站服务器受不了,单端口500M左右的带宽也扛不住,因此大多数网站都须要CDN服务。
根本上的缘由是,访问速度对互联网应用的用户体验、口碑、甚至说直接的营收都有巨大的影响,任何的企业都渴望本身站点有更快的访问速度。而HTTP传输时延对web的访问速度的影响很大,在绝大多数状况下是起决定性做用的,这是由TCP/IP协议的一些特色决定的。物理层上的缘由是光速有限、信道有限,协议上的缘由有丢包、慢启动、拥塞控制等。
这就是你使用CDN的第一个也是最重要的缘由:为了加速网站的访问。
除了加速网站的访问以外,CDN还有一些做用:
为了实现跨运营商、跨地域的全网覆盖
互联不互通、区域ISP地域局限、出口带宽受限制等种种因素都形成了网站的区域性没法访问。CDN加速能够覆盖全球的线路,经过和运营商合做,部署IDC资源,在全国骨干节点商,合理部署CDN边缘分发存储节点,充分利用带宽资源,平衡源站流量。阿里云在国内有500+节点,海外300+节点,覆盖主流国家和地区不是问题,能够确保CDN服务的稳定和快速。
为了保障你的网站安全
CDN的负载均衡和分布式存储技术,能够增强网站的可靠性,至关无无形中给你的网站添加了一把保护伞,应对绝大部分的互联网攻击事件。防攻击系统也能避免网站遭到恶意攻击。
为了异地备援
当某个服务器发生意外故障时,系统将会调用其余临近的健康服务器节点进行服务,进而提供接近100%的可靠性,这就让你的网站能够作到永不宕机。
为了节约成本
投入使用CDN加速能够实现网站的全国铺设,你根据不用考虑购买服务器与后续的托管运维,服务器之间镜像同步,也不用为了管理维护技术人员而烦恼,节省了人力、精力和财力。
为了让你更专一业务自己
CDN加速厂商通常都会提供一站式服务,业务不只限于CDN,还有配套的云存储、大数据服务、视频云服务等,并且通常会提供7x24运维监控支持,保证网络随时畅通,你能够放心使用。而且将更多的精力投入到发展自身的核心业务之上。
站点或者应用中大量静态资源的加速分发,建议将站点内容进行动静分离,动态文件能够结合云服务器ECS,静态资源如各种型图片、html、css、js文件等,建议结合 对象存储OSS 存储海量静态资源,能够有效加速内容加载速度,轻松搞定网站图片、短视频等内容分发。
支持各种文件的下载、分发,支持在线点播加速业务,如mp四、flv视频文件或者平均单个文件大小在20M以上,主要的业务场景是视音频点播、大文件下载(如安装包下载)等,建议搭配对象存储OSS使用,可提高回源速度,节约近2/3回源带宽成本。
视频流媒体直播服务,支持媒资存储、切片转码、访问鉴权、内容分发加速一体化解决方案。结合弹性伸缩服务,及时调整服务器带宽,应对突发访问流量;结合媒体转码服务,享受高速稳定的并行转码,且任务规模无缝扩展。
移动APP更新文件(apk文件)分发,移动APP内图片、页面、短视频、UGC等内容的优化加速分发。提供httpDNS服务,避免DNS劫持并得到实时精确的DNS解析结果,有效缩短用户访问时间,提高用户体验。
其实,CDN自己就是一种DNS劫持,只不过是良性的。 不一样于黑客强制DNS把域名解析到本身的钓鱼IP上,CDN则是让DNS主动配合,把域名解析到临近的服务器上。
劫持一般分为两类:
域名劫持,又称DNS劫持
,一般是指域名指向到非正常IP(恶意IP),该恶意IP经过反向代理的方式,在能返回网页正常内容的状况,可能插入恶意代码、监听网民访问、劫持敏感信息等操做。一般验证一个域名是否被劫持的方法是PING一个域名,若是发现PING出来的IP不是您的服务器真实IP,则能够肯定被劫持了(固然若是使用了知道创宇云安全等安全加速平台,获得的IP为平台IP,并不是劫持)
数据劫持,一般由电信运营商中某些员工等勾结犯罪分子,在公网中进行数据支持,插入,此类状况极隐蔽,不会改变用户域名解析IP,而是直接数据流经运营商宽带时在网页中挺入内容,此类状况,建议网页启用HTTPS加密
,能够解决这一问题(通讯是加密的,运营商没法插入恶意内容)
某运营商对新浪首页的广告强制插入:
若是使用CDN服务时,当源站向CDN返回被劫持的内容时,此时CDN将获取到的并非正确的网页内容(而是经运营商篡改强制植入广告的页面),此时可能致使该内容在CDN中长时间缓存,发现这种问题,能够清理CDN缓存后,通常便可恢复正常。
遇到劫持现象,能够向工信部投诉:http://www.chinatcc.gov.cn:80...
可参考:
CDN边缘节点缓存策略因服务商不一样而不一样,但通常都会遵循http标准协议,经过http响应头中的 Cache-control: max-age
的字段来设置CDN边缘节点数据缓存时间。
当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过时,若缓存数据并无过时,则直接将缓存数据返回给客户端;不然,CDN节点就会向源站发出回源请求(back to the source request)
,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。
CDN服务商通常会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。
CDN缓存时间会对回源率
产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会常常失效,致使频繁回源,增长了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。开发者须要增对特定的业务,来作特定的数据缓存时间管理。
CDN边缘节点对开发者是透明的,相比于浏览器 Ctrl+F5
的强制刷新来使浏览器本地缓存失效,开发者能够经过CDN服务商提供的“刷新缓存”接口来达到清理CDN边缘节点缓存的目的。这样开发者在更新数据后,可使用 刷新缓存
功能来强制CDN节点上的数据缓存过时,保证客户端在访问时,拉取到最新的数据。
可参考:
阿里基于Nginx开发的高性能HTTP服务器,已经开源,详细请了解 The Tengine Web Server