CDN全称是Content Delivery Network,即内容分发网络,它是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN的关键技术主要有内容存储和分发技术。
通俗一点的讲部署CDN就是为了提高访问速度,改善用户访问互联网或某一站点或APP的速度。
假设百度网站现在只有一台服务器,现在有一个人在上海访问百度,如果该服务器也在上海,那么通常来说访问比较快,如果该服务器在拉萨,那么相对而言访问就比较慢了。那么这个问题的根本原因是网络传输是依赖于网线的,网线越长,那么时间肯定就越久。
那么怎么解决这个问题呢?其实思路很简单,百度在全国各地都部署一模一样的服务器就行了,专业一点叫冗余。
思路很简单,但实现还是比较麻烦的,服务器上的资源分为两种:静态资源与动态资源。
- 静态资源:这种资源通常是很少变动的,比如图片,视频,css,javascript等等
- 动态资源:这种资源不同用户不同时刻访问通常是不一样的,比如ftl,jsp等等。
那么如果百度要在全国各地都部署服务器,如果说每个服务器上都有相同的动态资源,那么可能还需要配置相应的数据库,因为动态资源所记录的信息通常会存储在数据库中,那么这就涉及到了数据同步等等问题,这会导致成本很高,这种做法专业一点其实就是集群,而目前来说集群架构最多是三地五中心,不是说全国多地集群不可能,主要是成本太高。
那么有没有成本比较低的方式呢,有,就是在每个服务器上只部署静态资源,静态资源通常不涉及到数据库,所以成本也比较低,而且也能提高用户的访问速度。
到这里,介绍了CDN想要达到的目的,那么怎么达到这个目的呢?
现在如果要比较cdn系统,我们可以考虑两点:
- CDN系统中存储静态资源服务器的性能以及网速怎么样。
- CDN系统中全国甚至全球范围内服务器节点的数量以及部署情况。
第一点很好理解,第二点大家应该也能理解了,如果静态资源的服务器节点很多,能够让每个用户在访问这些静态资源时都不用“跑很远的路程”才能获取到,那么自然这是CDN系统的优点。
有公司看到了这种需求,所以现在其实有很多CDN供应商,比如阿里,腾讯等等都有自己的CDN服务。只要你自己的系统接入了这些大厂所提供的CDN服务,你把自己的静态资源传给CDN服务,那么这些静态资源将自动的分布到全世界各地去。
好,那么现在的问题是,用户在访问静态资源时也是通过域名来访问的,域名会被解析成某一个IP地址,关键的问题就是,DNS系统怎么在做域名解析时,解析出来一个离用户最近的一个IP地址呢。
普通的DNS系统是做不到的,需要一个特殊的DNS服务器,这个特殊DNS需要知道
- 用户当前所在位置
- 还需要知道用户现在访问的这个域名对应哪些IP地址,以及这个IP地址分别在哪?
对于第一个问题好解决,直接从用户请求里提取出用户的ip地址,比如这个ip地址被解析为北京电信、上海移动等等。
第二个问题由谁来解决,我们现在考虑的是CDN,CDN提供商肯定知道他们公司在哪些地方部署了机器以及它们的IP地址,所以这个问题只能有CDN提供商来解决,CDN提供商会提供这个特殊的DNS服务器,我们叫做 CDN专用DNS服务器。
这样的话,只要用户在使用某个域名访问静态资源时,如果用户直接配置自己电脑的DNS地址为CDN专用DNS服务器。那么自然解决了问题,但是我们需要考虑的时,我们不能要求世界上所有的用户都去修改自己电脑的DNS地址。所以这个时候就要利用DNS中的CNAME了。
用户使用某个域名来访问静态资源时(这个域名在阿里CDN服务中叫做“加速域名”),比如这个域名为“image.baidu.com”,它对应一个CNAME,叫做“cdn.ali.com”,那么普通DNS服务器(区别CDN专用DNS服务器)在解析“image.baidu.com”时,会先解析成“cdn.ali.com”,普通DNS服务器发现该域名对应的也是一个DNS服务器,那么会将域名解析工作转交给该DNS服务器,该DNS服务器就是CDN专用DNS服务器。CDN专用DNS服务器对“cdn.ali.com”进行解析,然后依据服务器上记录的所有CDN服务器地址信息,选出一个离用户最近的一个CDN服务器地址,并返回给用户,用户即可访问离自己最近的一台CDN服务器了。
CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近。
内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了?
因为这项技术是把内容进行了分发,所以,它的名字就叫做CDN——Content Delivery Network,内容分发网络。
具体来说,CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。(有点像电商的本地仓吧?)
大家可能觉得,这个不就是“镜像服务器”嘛?其实不一样。镜像服务器是源内容服务器的完整复制。而CDN,是部分内容的缓存,智能程度更高。
确切地说,CDN=更智能的镜像+缓存+流量导流。
而且还需要注意的是,CDN并不是只能缓存视频内容,它还可以对网站的静态资源(例如各类型图片、html、css、js等)进行分发,对移动应用APP的静态内容(例如安装包apk文件、APP内的图片视频等)进行分发。
接下来我们来看看CDN工作的具体步骤:
①当用户点击APP上的内容,APP会根据URL地址去本地DNS(域名解析系统)寻求IP地址解析。
②本地DNS系统会将域名的解析权交给CDN专用DNS服务器。
③CDN专用DNS服务器,将CDN的全局负载均衡设备IP地址返回用户。
④用户向CDN的负载均衡设备发起内容URL访问请求。
⑤CDN负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的缓存服务器。
⑥负载均衡设备告诉用户这台缓存服务器的IP地址,让用户向所选择的缓存服务器发起请求。
⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。
⑧如果这台缓存服务器上并没有用户想要的内容,那么这台缓存服务器就要网站的源服务器请求内容。
⑨源服务器返回内容给缓存服务器,缓存服务器发给用户,并根据用户自定义的缓存策略,判断要不要把内容缓存到缓存服务器上
说了这么多,我们来看看如果自己架设一套完善的CDN?
部署一套完善的CDN的体系架构分为3层结构,即内容管理层、调度分发层和边缘服务层。
内容管理层:功能是实现CDN网络资源内容的集中管理和智能分析,实现资源内容的呈现、资源质量的评估、缓存需求的分析、调度方案的设计、热点资源的识别、就近缓存的命中。
调度分发层:由控制中心、分发中心和溯源中心3个功能模块组成。其中,控制中心的功能是实现对CDN网络边缘服务节点进行调度和控制;分发中心的功能是实现将所需内容资源以最优的路由径路快速而稳定地传送到边缘服务节点上;溯源中心的功能是实现对网络TOP热点内容的缓存,在缓存服务器上保存相关内容的副本,提供对用户请求的重定向访问。各级缓存节点均需要统一向资源池进行回源。
边缘服务层:功能是以分析网络TOP热点内容为基础条件,实现网络TOP热点内容的分布式存储,面向用户提供就近资源接入服务,支撑调度优化,提供充足的资源,实现布局的最佳优化,最大限度保证内容资源的就近命中,缩短内容访问时间,提高内容访问效率。
这里建议下,部署这么一套完善CDN所消耗的人力、物力、财力不低的,如果您是自己网站想搭建CDN,没必要。市面上有成熟的CDN服务机构,比如阿里云、腾讯云、网宿科技,他们都能给你提供一整套解决方案,而且费用肯定比自建便宜,还更稳定,何必自建呢?
那如果您是为了数据安全,想自建或者又是本身做这行的,自建cdn拿来出售的,跟阿里云类似,那么还是有必要搞这么一套CDN系统的。不过你在搞这么一套CDN系统之前,需要办理CDN许可证,这个是国家对从事CDN业务所必须要办理的许可资质,具体可以参考我们之前写的文章,当然您要办理,也可以点击下方小卡片咨询我们,专业办理CDN许可资质:
码字不易,欢迎点个赞、关注下呗!
原文链接:https://www.zhihu.com/question/21771529/answer/2417907720
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/5789