现在,我们应该对包括本地 缓存、分布式缓存等缓存组件的适用场景和使用技巧有了一定了解了。结合我们前面学过的客户端高可用方案,我们会将单个缓存节点扩展为高可用的缓存集群,现在,我们的系统架构演变成了下面这样:
在这个架构中我们使用分布式缓存对动态请求数据的读取做了加速,但是在我们的系统中存在着大量的静态资源请求:
- 对于移动 APP 来说,这些静态资源主要是图片、视频和流媒体信息。
- 对于 Web 网站来说,则包括了 JavaScript 文件,CSS 文件,静态 HTML 文件等等。
具体到电商系统来说,商品的图片,介绍商品使用方法的视频等等静态资源,现在都放在了 Nginx 等 Web 服务器上,它们的读请求量极大,并且对访问速度的要求很高,并且占据了很高的带宽,这时会出现访问速度慢,带宽被占满影响动态请求的问题,那么我们就需要考虑如何针对这些静态资源进行读加速了。
静态资源加速的考虑点
我可能会有疑问:“是否也可以使用分布式缓存来解决这个问题呢?”答案是否定的。一般来说,图片和视频的大小会在几兆到几百兆之间不等,如果我们的应用服务器和分布式缓存都部署在北京的机房里,这时一个杭州的用户要访问缓存中的一个视频,那这个视频文件就需要从北京传输到杭州,期间会经过多个公网骨干网络,延迟很高,会让用户感觉视频打开很慢,严重影响到用户的使用体验。
所以,静态资源访问的关键点是就近访问,即北京用户访问北京的数据,杭州用户访问杭州 的数据,这样才可以达到性能的最优。
当然我们不可能在各个地方都部署服务器,这样成本太高了,而且当静态资源发生变化,需要更新所有的静态资源服务器,这显然是不现实的。而且,单个视频和图片等静态资源很大,并且访问量又极高,如果使用业务服务器和分布式缓存来承担这些流量,无论是对于内网还是外网的带宽都会是很大的考验。
所以我们考虑在业务服务器的上层,增加一层特殊的缓存,用来承担绝大部分对于静态资源 的访问,这一层特殊缓存的节点需要遍布在全国各地,这样可以让用户选择最近的节点访问。缓存的命中率也需要一定的保证,尽量减少访问资源存储源站的请求数量(回源请 求)。这一层缓存就是我们这节课的重点:CDN。
CDN 的关键技术
CDN(Content Delivery Network/Content Distribution Network,内容分发网络)。 简单来说,CDN 就是将静态的资源分发到,位于多个地理位置机房中的服务器上,因此它 能很好地解决数据就近访问的问题,也就加快了静态资源的访问速度。
在大中型公司里面,CDN 的应用非常的普遍,大公司为了提供更稳定的 CDN 服务会选择 自建 CDN,而大部分公司基于成本的考虑还是会选择专业的 CDN 厂商,网宿、阿里云、 腾讯云、蓝汛等等,其中网宿和蓝汛是老牌的 CDN 厂商,阿里云和腾讯云是云厂商提供的 服务,如果服务部署在云上可以选择相应云厂商的 CDN 服务,这些 CDN 厂商都是现今行业内比较主流的。
对于 CDN 来说,我们可能已经从运维的口中听说过,并且也了解了它的作用。但是当让我们来配置 CDN 或者是排查 CDN 方面的问题时,就有可能因为不了解它的原理而束手无策 了。
所以,我们来了解一下,要搭建一个 CDN 系统需要考虑哪两点:
- 如何将用户的请求映射到 CDN 节点上;
- 如何根据用户的地理位置信息选择到比较近的节点;
下面我们就具体了解一下 CDN 系统是如何实现加速用户对于静态资源的请求的。
-
如何让用户的请求到达 CDN 节点
首先,我们考虑一下如何让用户的请求到达 CDN 节点,你可能会觉得,这很简单啊,只需要告诉用户 CDN 节点的 IP 地址,然后请求这个 IP 地址上面部署的 CDN 服务就可以了 啊。但是这样会有一个问题:就是我们使用的是第三方厂商的 CDN 服务,CDN 厂商会给 我们一个 CDN 的节点 IP,比如说这个 IP 地址是“111.202.34.130”,那么我们的电商系 统中的图片的地址很可能是这样的:“http://111.202.34.130/1.jpg”, 这个地址是要存储在数据库中的。那么如果这个节点 IP 发生了变更怎么办?或者我们如果更改了 CDN 厂商怎么办?是不是 要修改所有的商品的 url 域名呢?这就是一个比较大的工作量了。所以,我们要做的事情是 将第三方厂商提供的 IP 隐藏起来,给到用户的最好是一个本公司域名的子域名。
那么如何做到这一点呢?这就需要依靠 DNS 来帮我们解决域名映射的问题了。
DNS(Domain Name System,域名系统)实际上就是一个存储域名和 IP 地址对应关系 的分布式数据库。而域名解析的结果一般有两种,一种叫做“A 记录”,返回的是域名对应 的 IP 地址;另一种是“CNAME 记录”,返回的是另一个域名,也就是说当前域名的解析 要跳转到另一个域名的解析上,实际上 www.baidu.com 域名的解析结果就是一个 CNAME 记录,域名的解析被跳转到 www.a.shifen.com 上了,我们正是利用 CNAME 记 录来解决域名映射问题的,具体是怎么解决的呢?我们举个例子。
比如我们公司的一级域名叫做 example.com,那么你可以给你的图片服务的域名定义 为“img.example.com”,然后将这个域名的解析结果的 CNAME 配置到 CDN 提供的域 名上,比如 uclound 可能会提供一个域名是“80f21f91.cdn.ucloud.com.cn”这个域名。 这样你的电商系统使用的图片地址可以是“http://img.example.com/1.jpg”。
用户在请求这个地址时,DNS 服务器会将域名解析到 80f21f91.cdn.ucloud.com.cn 域名 上,然后再将这个域名解析为 CDN 的节点 IP,这样就可以得到 CDN 上面的资源数据了。
不过,这里面有一个问题:因为域名解析过程是分级的,每一级有专门的域名服务器承担解 析的职责,所以,域名的解析过程有可能需要跨越公网做多次 DNS 查询,在性能上是比较差的。
从“ 域名分级解析示意图”中你可以看出 DNS 分为很多种,有根 DNS,顶级 DNS 等等。除此之外还有两种 DNS 需要特别留意:一种是 Local DNS,它是由你的运营商提供的 DNS,一般域名解析的第一站会到这里;另一种是权威 DNS,它的含义是自身数据库中存 储了这个域名对应关系的 DNS。 -
如何找到离用户最近的 CDN 节点
GSLB(Global Server Load Balance,全局负载均衡),它的含义是对于部署在不同地域的服务器之间做负载均衡,下面可能管理了很多的本地负载均衡组件。它有两方面的作用:
一方面,它是一种负载均衡服务器,负载均衡,顾名思义嘛,指的是让流量平均分配使得下面管理的服务器的负载更平均;
另一方面,它还需要保证流量流经的服务器与流量源头在地缘上是比较接近的。
GSLB 可以通过多种策略,来保证返回的 CDN 节点和用户尽量保证在同一地缘区域,比如说可以将用户的 IP 地址按照地理位置划分为若干的区域,然后将 CDN 节点对应到一个区 域上,然后根据用户所在区域来返回合适的节点;也可以通过发送数据包测量 RTT 的方式来决定返回哪一个节点。
有了 GSLB 之后,节点的解析过程变成了下图中的样子:
当然,是否能够从 CDN 节点上获取到资源还取决于 CDN 的同步延时。一般,我们会通过 CDN 厂商的接口将静态的资源写入到某一个 CDN 节点上,再由 CDN 内部的同步机制将 资源分散同步到每个 CDN 节点,即使 CDN 内部网络经过了优化,这个同步的过程是有延时的,一旦我们无法从选定的 CDN 节点上获取到数据,我们就不得不从源站获取数据,而 用户网络到源站的网络可能会跨越多个主干网,这样不仅性能上有损耗,也会消耗源站的带宽,带来更高的研发成本。所以,我们在使用 CDN 的时候需要关注 CDN 的命中率和源站 的带宽情况。
总结
我们了解了 CDN 对静态资源进行加速的原理和使用的核心技术,这里你需 要了解的重点有以下几点:
- DNS 技术是 CDN 实现中使用的核心技术,可以将用户的请求映射到 CDN 节点上;
- DNS 解析结果需要做本地缓存,降低 DNS 解析过程的响应时间;
- GSLB 可以给用户返回一个离着他更近的节点,加快静态资源的访问速度。
作为一个服务端开发人员,我们可能会忽略 CDN 的重要性,对于偶尔出现的 CDN 问题嗤之以鼻,觉得这个不是我们应该关心的内容,这种想法是错的。
CDN 是我们系统的门面,其缓存的静态数据,如图片和视频数据的请求量很可能是接口请 求数据的几倍甚至更高,一旦发生故障,对于整体系统的影响是巨大的。另外 CDN 的带宽 历来是我们研发成本的大头,尤其是目前处于小视频和直播风口上,大量的小视频和直播研发团队都在绞尽脑汁地减少 CDN 的成本。由此看出,CDN 是我们整体系统至关重要的组 成部分,而它作为一种特殊的缓存,其命中率和可用性也是我们服务端开发人员需要重点关注的指标。
原文链接:https://blog.csdn.net/zhanglu0302/article/details/120405023?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165934458816781667869865%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165934458816781667869865&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-9-120405023-null-null.nonecase&utm_term=%E8%87%AA%E5%BB%BAcdn
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/5968