【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第二节:CDN优化

【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第二节:CDN优化

本篇文章我们来学习CDN的优化。

CDN的概述

我们的系统部署在互联网上的某个节点上,这个系统别人要访问的时候,有一个IP地址,我们的客户端通过DNS的解析,拿到IP地址之后,根据这个IP地址去访问对应的这个服务器。

在这里插入图片描述

比如说我们的机房部署在北京,然后我们的用户就那么几千个人,就服务北京的这一圈人,那么我们的这样的1000人在这个北京范围内访问系统还好,没有什么太大的问题。

但是,如果我的网站是一个大型的网站,我们的用户遍布全国,或者说全球,如果我们只有一台服务器,那么广州的用户要去访问北京的这个服务器,或者说新疆的用户要去访问北京的这个服务器,是不是系统的延时就是不一样的。因为北京的人访问,大概率北京的节点提供给北京的用户响应的速度是快的,这是由物理的定律决定的。

在这里插入图片描述

比如说光速,每秒30万公里,那么我们的互联网的信息在光纤中传播也是需要30万公里,但是我们还要加上损耗。比如说信息在各个网络节点当中有接收、有转化、有计算。综合下来能算每秒20万公里就不错了,加上传输中经过各种网络设备的处理,做一些路由什么的反正乱七八糟的事情,算下来能达到每秒十万公里就很快了。

也就是北京到广州2000公里,需要20毫秒差不多。据统计,在正常情况下,北京到广州的往返时延是50毫秒,算下来差不多也是单程是20毫秒左右。这个可能在我们人类的活动当中,几十毫秒无所谓,但是在对于系统来说,几十毫秒,那就是很大的延迟了。

所以,为了让全国的用户在用系统的时候能快速的响应。原来只在北京有,那么最好在广州也部署一台服务器,让广州的用户呢,能就近访问,这样的话就会减少了五十毫秒的延时。这样的话呢,按照这个思路,我们可以在全国部署多个节点让好多用户就近访问。

在这里插入图片描述

这样做的话,有几个目的:

  • 第一,能够让所有的请求都分配到多个系统上。
  • 第二,可以让每个用户的请求路由到与这个用户最近的一个系统上,降低网络延时,减少用户的响应时间。

好了,部署多个系统呢,也有缺点:增加部署和维护的成本。

一台服务器比较简单,两台也还行,三台也还行,那么一百台呢?全国各地有100台服务器,你要让这些服务器将图片视频附件等乱七八糟的同步到各个服务器上,这已经是很复杂的一些事情了。

生产中,多个服务节点,一般的怎么用呢?这些个服务节点,我们可以将视频、音频、图片、附件、文件等对流量消耗大且不经常变的静态资源部署到网络的各个节点去,就减少了这些大资源在网络中的传输。而核心系统可以部署到一个地方,也可以部署到多个地方,这个得看自己的情况。

刚才所说的,服务器的资源靠用户近一些,其实这个就是我们CDN做的事情。CDN叫做Content Delivery Network,叫内容分发网络。

在这里插入图片描述

CDN的结构

CDN有两种节点,一个叫做源站;还有一个叫做边缘节点。

源站就是原始数据的来源,包括业务的计算,静态资源,都可以从源站获取。还有一个就是边缘节点,边缘节点一般放的是静态资源啊。

源站是动态和静态信息的主要来源,是一切数据的大本营,就算边缘节点没有,源站也要有。

而cdn的节点就是与接入的用户有较少中间环节的网络节点。这个节点离用户是近一些的,这种节点相比于源站,用户请求到达边缘节点的网络延迟更小。

在这里插入图片描述

用户到边缘节点去请求数据,边缘节点先会判断是否缓存了用户要请求的内容,如果内容已经缓存,则直接给到用户。如果说边缘节点也没有用户要请求的内容,它会去源站去访问,拿到数据再发给用户,同时根据CDN规则的配置,要不要将拿到的这份响应在节点中也缓存一份,所以说边缘节点是源站中部分内容的备份。

网宿

CDN节点的数目当然是越多越好。为什么说越多越好呢?因为越多的话,离用户近的概率就更大一些。你在全国都布了节点,那么全国的用户去访问你的系统的响应大概率是最快的,中间环节越少,时延就越少,但是成本极高。因此CDN节点由专门的服务商来提供部署,一般的小公司也不自己做CDN,都是大公司在做,一般的企业呢,也搞不了。

能搞CDN的都是些什么公司?网宿、云服务商阿里云、三大运营商。

那么CDN的结构有了,CDN节点里面放的内容一般是什么呢?CDN节点一般只缓存静态的内容,一些涉及到动态内容的请求,仍然需要源站去处理。什么是动态,什么是静态呢?静态就是每次来它都一样,不需要经过服务器的计算。动态是什么呢?动态就是我需要源站服务器的计算。

在这里插入图片描述

我们会通过CDN的控制中心为各个节点配置规则,CDN会根据规则列表对请求内容进行分发,也就是说你来请求我,我判断一下你这个URL符合哪些规则。动态请求分配到源站了。当然了,实际工作中源站由于异地多活的方案,源站可能在全国也有多个。对于静态的内容呢?CDN节点会从源站去拿,拿到内容拿到静态内容之后呢?放在CDN节点当中,在自身的缓存一段时间,这是有时间限制的,不是说拿了一辈子不变,接下来再收到同样的请求呢,CDN节点就直接把自己缓存的内容给响应回去。对于动态的内容呢?节点对这些内容一般是不缓存的,而是将请求转发给源站去处理。

这样的话CDN为源站分担了大量的静态请求,降低了源站并发的请求数,使得同样的软硬件配置的源站,原来只有我一个源站要扛1000个请求,结果我部署了好多个CDN,CDN给我挡住了500个静态请求,那么我就能直接再扛上500个动态请求。这样的话,把压力往CDN节点上分散一些。

CDN的原理

我们来看一下CDN的原理。

学一个东西。最好的办法是自己做一个,那我们就来设计一个CDN。

当客户端发送请求的时候,他请求的目的地是哪里?是源站是吧?比如我们访问www.baidu.com,那如何做到将发向源站地址的请求分散到不同的CDN节点上呢?这个就是核心问题。本来用户请求源站,怎么能把这个请求拦截下来,把它分配到最近的节点上呢?是不是类似于spring的AOP?

还记得我们前面讲过DNS的记录吗?DNS的记录有A记录、CNAME记录和NS记录。DNS解析需要经过本地的DNS、根DNS、顶级域名的DNS、下一级域名的DNS,直到找到记录,那么我们怎么做呢?他要找源站的域名,我们不让他找到源站,让它找到某一个地方,然后另外一个地方能知道用户离哪个节点最近,是不是就OK了?所以我们用CNAME记录,把它发向源站的域名,给它转化到另外一个域名,这个域名是CDN服务商的域名。

在这里插入图片描述

比如说我们给CDN服务商花钱,让这个服务商给我们在全国布了三个节点。那么,我用CNAME的方式将我的服务器的域名映射成这个CDN服务商的域名。然后根据他的IP地址去访问它,访问它的时候,然它知道这个请求来源的IP(请求头里携带着),比如说来源的IP新疆,CDN发现来自新疆,而我给你在新疆布了一台机器,那CDN就把这个请求指向新疆的服务器,这不就让用户找到了离他最近的服务器嘛。

CDN的小结

CDN的工作原理是什么?

比如说有一个用户,他要去请求某一个CDN,比如他要找abc.com,那么他先去LDNS,然后LDNS最后把它找到,通过域名解析,把abc.com映射到了CDN服务商的域名,然后CDN服务商拿到请求之后分析一下,它来源是新疆,那么CDN服务商给他一个新疆CDN的节点的IP地址。

访问CDN节点的时候呢?如果CDN节点有他要的数据呢?就直接响应,如果没用户要的数据呢?CDN节点还需要去源站去拉取这个数据,然后完了之后再给到用户。

那么这个时候我们要想一件事情啊,我要去请求一个服务,然后我还需要去一个地方拿到这个服务的IP地址,这是不是类似于注册中心?我先去注册中心拿到IP地址,然后我再去访问IP地址所对应的服务。注册中心可以为不同的用户提供不同的服务器的IP地址,也就是根据不同用户的IP请求分配给他不同的就近的服务地址。

在这里插入图片描述

大家可以看到,其实好多技术,看起来名字不一样,其实它的原理是差不多的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值