--- title: 网络技术之 CDN date: 2019-05-29 23:19:00 order: 02 categories: - 网络 - 网络技术 tags: - 网络 - 网络技术 - CDN permalink: /pages/ea758828/ --- # 网络技术之 CDN ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/1559138689425.png) ## 简介 ### CDN 是什么 CDN(**Content Delivery Network**),即**内容分发网络**。 CDN 是一个全球性的代理服务器分布式网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。它从靠近用户的位置提供内容。通常,HTML/CSS/JS,图片和视频等静态内容由 CDN 提供。CDN 的 DNS 解析会告知客户端连接哪台服务器。CDN 的关键技术主要有内容存储和分发技术。 ### CDN 的优缺点 - 优点 - **访问加速** - 由于 CDN 就近服务,大大降低了网络传播时延,所以自然提高了访问速度。 - **降低负载** - 如果 CDN 已经能获取数据,那么就不必请求源站,这自然降低了源站(服务器)的负载。 - 缺点 - CDN 成本可能因流量而异,可能在权衡之后你将不会使用 CDN。 - 如果在 TTL 过期之前更新内容,CDN 缓存内容可能会过时。 - CDN 需要更改静态内容的 URL 地址以指向 CDN。 ## CDN 原理 CDN 的基本原理是: - 广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中; - 在用户访问网站时,实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息来选择最佳缓存服务器; - 然后,将用户的请求重新导向最佳的缓存服务器上,由缓存服务器直接响应用户请求。 CDN 网络架构主要由两大部分,分为**中心**和**边缘**两部分: - 中心指 CDN 网管中心和 DNS 重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房; - 边缘主要指异地节点,CDN 分发的载体,主要由 Cache 和负载均衡器等组成。 CDN 是一个策略性部署的整体系统,包括**分布式存储**、**负载均衡**、**内容管理**和**网络请求的重定向**4个要件。 ### 分布式存储 CDN 网络将存储资源分布到各个地理位置、各个网段。存储系统作为 CDN 系统密不可分的一部分,将 CDN 分发的文件和数据库表记录内容存储起来,提供持续服务。存储系统采用三级存储架构,包括核心存储、CDN 服务节点分布式缓存和终端本地缓存。任意一个点的存储崩溃或失效,并不影响系统服务的可用性。 ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/1559140068433.png) 如 CDN 系统在 5 大运营商(中国电信、中国网通、中国铁通、中国移动、中国联通)以及 2 大专有网络(中国教育和科研计算机网、中国科技网)都布有 CDN 节点。**这样就消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。** ### 内容管理 内容管理和全局的网络流量管理(Traffic Management)是 CDN 的核心所在。**通过用户就近性和服务器负载的判断,CDN 确保内容以一种极为高效的方式为用户的请求提供服务**。总的来说,内容服务基于**缓存服务器**,也称作**代理缓存(Surrogate)**,它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于 CDN 服务提供商的数据中心)的一个透明镜像。这样的架构使得 CDN 服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用 CDN 技术,能处理整个网站页面的 70%~ 95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。 ### 负载均衡 CDN 负载均衡系统实现 CDN 的**内容路由功能**。它的作用是将用户的请求导向整个 CDN 网络中的最佳节点。最佳节点的选定可以根据多种策略,例如**距离最近**、**节点负载最轻**等。负载均衡系统是整个 CDN 的核心,负载均衡的准确性和效率直接决定了整个 CDN 的效率和性能。通常负载均衡可以分为两个层次:**全局负载均衡(GSLB)**和**本地负载均衡(SLB)**。 ### 网络请求的重定向 当用户访问了使用 CDN 服务的资源时,DNS 域名服务器通过 CNAME 方式将最终域名请求重定向到 CDN 系统中的智能 DNS 负载均衡系统。**智能 DNS 负载均衡系统通过一组预先定义好的策略(如内容类型、地理区域、网络负载状况等),将当时能够最快响应用户的节点地址提供给用户,使用户可以得到快速的服务**。 同时,它还与分布在不同地点的所有 CDN 节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。 > 参考: > > - [CDN-内容推送网络](https://www.cnblogs.com/skynet/archive/2012/12/18/2824141.html) > - [闲话 CDN](https://zhuanlan.zhihu.com/p/39028766) ## CDN 访问流程 ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/1559126750010.png) 1. 用户在浏览器中访问域名,域名解析的请求被发往网站的 DNS 域名解析服务器; 2. 由于网站的 DNS 域名解析服务器对此域名的解析设置了 CNAME,请求被指向 CDN 网络中的智能 DNS 负载均衡系统; 3. 智能 DNS 负载均衡系统对域名进行智能解析,将响应速度最快的节点 IP 返回给用户;浏览器在得到速度最快节点的 IP 地址以后,向 CDN 节点发出访问请求; 4. 由于是第一次访问,CDN 节点将回到源站取用户请求的数据并发给用户; 5. 当有其他用户再次访问同样内容时,CDN 将直接将数据返回给客户,完成请求/服务过程。 同时,它还与分布在不同地点的所有 CDN 节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。 > 参考: > > - [CDN-内容推送网络](https://www.cnblogs.com/skynet/archive/2012/12/18/2824141.html) > - [闲话 CDN](https://zhuanlan.zhihu.com/p/39028766) ## 推送和拉取 CDN 服务有推送和拉取两种方式: ### CDN 推送 当你服务器上内容发生变动时,推送 CDN 接受新内容。直接推送给 CDN 并重写 URL 地址以指向你的内容的 CDN 地址。你可以配置内容到期时间及何时更新。内容只有在更改或新增是才推送,流量最小化,但储存最大化。 优点在于节省源站带宽,提前将要分发的内容放到 CDN 节点上了,当某个流量高峰来临时,不会把你的源站带宽占满(源站还要留点带宽提供动态 HTML 啊)。 缺点是需要针对 CDN 做接口开发,在被分发内容生成时主动上传给 CDN。 ### CDN 拉取 CDN 拉取是当第一个用户请求该资源时,从服务器上拉取资源。你将内容留在自己的服务器上并重写 URL 指向 CDN 地址。直到内容被缓存在 CDN 上为止,这样请求只会更慢, [存活时间(TTL)](https://en.wikipedia.org/wiki/Time_to_live)决定缓存多久时间。CDN 拉取方式最小化 CDN 上的储存空间,但如果过期文件并在实际更改之前被拉取,则会导致冗余的流量。 高流量站点使用 CDN 拉取效果不错,因为只有最近请求的内容保存在 CDN 中,流量才能更平衡地分散。 优点在于实现简单。 > 参考:[推送式与拉取式 CDN 服务的优劣问题](https://segmentfault.com/q/1010000000119794) ## 资源 - 文章 - [Wikipedia - CDN](https://en.wikipedia.org/wiki/Content_delivery_network) - [CDN-内容推送网络](https://www.cnblogs.com/skynet/archive/2012/12/18/2824141.html) - [闲话 CDN](https://zhuanlan.zhihu.com/p/39028766) - [CDN 技术详解](https://www.cnblogs.com/losbyday/p/5843960.html) - [推送式与拉取式 CDN 服务的优劣问题](https://segmentfault.com/q/1010000000119794) - CDN 资源 - https://staticfile.org/ - https://unpkg.com/ - https://cdnjs.com/ - https://github.com/ossrs/srs - https://github.com/jsdelivr/jsdelivr