当我们需要访问一个网站的时候,会指定这个网站的域名,DNS就会将这个域名解析为地址,然后让用户去访问这个地址,同理,我在网上下单,也是快递去帮我送到了家门口

那么有什么优化的地方?

就好比,我们去下单买个东西,这个东西一定要从电商的总部仓库送过来吗,快递一定要送到我们家门口吗?

原来的时候是这样,每一单都是单独的配送,速度很慢,但是后来电商网站的物流好多了,在全国各个地方建立了多个仓库,可以直接从仓库配送,而且很多地方都有菜鸟驿站,可以帮助放快递

电商网站提前将一些商品从中心仓库发往各个仓库,这样一旦客户下单了,就可以从最近的仓库发出,第二天就收到了

那么网站也可以借鉴这个思路,全球那么多的数据中心,无论在哪里上网,附近都有着数据中心,是不是可以在这些数据中心里面部署几台设备,形成一个缓存的集群来缓存部分数据,访问的时候就近访问

部署在各个数据中心的节点,就是被称为了边缘节点

由于边缘节目数目多,每个集群的规模比较小,不可能缓存下来所有的东西,因为无法命中,这样就会在边缘节点上,有着一层区域节点,缓存更多的数据,然后在往上就是中心节点,缓存的数据更多,如果还没法命中,就只能回源网站访问了

图片

这就是简单的CDN的分发系统的架构,CDN的缓存是一层层的,能不去访问最原始的源,就不去打扰他,这也是电商物流的思路,北京局找不到,就去华北局,然后再去北方局找

有了这个分发系统,客户端如何找到最合适的边缘节点的呢?

图片

在之前讲解的过程中,如果没有CDN,直接查找DNS,就是在浏览器输入了www.web.com的域名. 客户端去访问了本地DNS服务器,如果本地DNS服务器能够命中,就可以返回IP,如果没有命中,就是逐步的去递归的查询,直到查询到权威的DNS服务器,这个权威的DNS可能做负载均衡,但是最终会返回IP地址,客户端直接访问这个IP地址

但是对于CDN,就不一样了,在web.com的权威DNS服务器上,会设置一个CNAME的别名,指向另一个域名,www.web.cdn.com 返回给本地DNS服务器

本地DNS服务器拿到这个域名后,继续解析,这时候,访问的就不是web.com的权威DNS服务器,而是web.cdn.com的权威DNS服务器,这个服务器,会设置一个CNAME,指向CDN的全局负载均衡

然后本地DNS会请求全局负载均衡,获得最近的边缘节点的服务器IP

在全局负载均衡服务器上,会判断哪一台的服务器离用户比较近

判断的依据主要有:

1.根据用户的IP地址,判断哪一台的服务器距离用户比较近

2.用户所在运营商

3.根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有相对应的内容

4.查询各个服务器的负载情况,根据负载均衡

然后返回一个可用的IP地址,本地DNS获取到这个IP地址并缓存,客户端去这个IP地址请求需要的内容,如果这个服务器上没有用户需要的内容,就会去上一级,区域节点去请求内容,并拉倒本地上

CDN可以缓存的内容

常见的就是静态的一些图片和一些网站,这些东西不常变化,比较适合做缓存

图片

我们实际的缓存和这个上面的应用的缓存架构类似,在进入数据中心之前,我们希望能够通过最外层的接入层的缓存,将大部分的静态资源的缓存拦在边缘节点,

但是,对于直播这种使用CDN分发的网络,使用了流媒体协议,例如RTMP,在很多的情况下,相当于一个代理,从上一级的缓存中读取内容,转发给用户

一般来说,对于静态内容,内容的分发往往是进行回源拉取,但发现没有命中的时候,再去上一级去拉取,但是,流媒体的数据量很大,如果出现了回源,压力也很大,所以一般是主动的推送,将热点的数据主动推送到边缘节点

而且CDN并非简单的推送,而是进行了一些预处理服务,在分发之前,进行一些处理,可以直接将视频转换为不同的码流,方便不同的用户选择,这就是常见的 高清 超清 流畅的分辨率

对于可能的盗链问题,就是可能流媒体被他人窃取,在他人网站上播放

常见的就是使用Http头的referer字段,在浏览器发送请求的时候,带上Referer,告诉服务器从哪个页面过来的,服务器基于此可以获取一些信息

但是这种使用容易,破解同样容易,

我们再此基础上,可以使用时间戳防盗链

在客户端上,保留着一个密钥,客户端可以取出当前的时间戳,要访问的资源和路径,连同加密的字符串进行签名算法得到一个字符串,然后生成一个下载链接,带上这个签名的字符串和截止的时间戳去访问CDN

在CDN的端,也能拿到相同的密钥,那么就可以查看过期的时间戳,看看是否超时了,然后利用资源路径和相关的请求时间戳,进行相同的加密,然后匹配双方的签名字符串,如果一致,就可以访问拉取流

我们说完了静态的资源,别忘了还有着一些动态的资源,就好比库存

那么动态CDN,主要有两种模式

一种是边缘计算,既然数据是动态生成的,那么可以将计算数据的逻辑,从源服务器上,放在边缘节点上,然后定时的从源数据中心同步存储的数据,在用户访问边缘服务器的时候,先从边缘直接计算出结果

二是路径优化的模式,数据只从源站产生,但是下发的过程中,用户请求的时候,从边缘节点到源站,会计算出一个最短的路径,这个路径跑在CDN的内部网络,非常快速,就类似专线访问

对于常用的TCP的连接,在公网的传输上非常容易丢失,导致TCP的窗口很小,发送速度上不去,但是CDN的优化网络可以调整TCP的参数,在内部网路更加快速的,激进的传输数据

而且可以利用长连接,多个请求复用一个连接,导致避免了三次握手或者建立过多的连接,增加服务器的压力

本章小结:

CDN和电商的分布式存储一样,分为了中心节点,区域节点,边缘节点,数据缓存在用户位置较近的地方

CDN可以缓存静态资源,也可以缓存流媒体数据,对于这种数据,需要注意盗链问题,利用referer或者密钥加密

对于动态数据的分发,可以使用边缘计算的模式,或者链路优化进行分发

课后思考,

1.CDN能否使用HttpDNS呢?

2.客户端对于DNS HttpDNS,CDN访问了半天,都没进入数据中心,数据中心是什么样子的呢>

1.必然可以,同样是请求了DNS服务器,不过是放在了本地客户端去请求,而不是委托本地DNS服务器去请求,只要到了解析服务器上,依然可以走CDN的全局负载均衡器

具体的,可以参考阿里云的CDN的HTTPDNS的方式,客户端请求服务URL:umc.danuoyi,alicdn.com

参数是客户端ip地址和待解析的域名,然后返回多个ip地址,等待客户端去轮询这些ip地址

2.数据中心应该是缓存了大量数据的服务器集群吧

发表评论

邮箱地址不会被公开。 必填项已用*标注