CDN
假设你做了一个系统,要存放用户的一些信息,一般会把这些数据存放到MySQL当中,假设系统中有一些商品信息也是存放在MySQL中,慢慢的你的系统一天系统用户原来越多,查看商品的用户越来越多导致系统的响应速度越来越慢,于是你就将一些用户经常访问的商品信息存放到Redis中,来提高系统的响应速度。当我们要存储一张图片的时候,就不会将图片存储到MySQL中,同理也不会将图片缓存到Redis中,一般图片会存放到一些服务厂商的对象存储中,而如果要缓存的图片,那么此时CDN就登场了。对象存储及好比MySQL,CDN就好比Redis。
CDN(全称 Content Delivery Network),即内容分发网络。简单来说就是通过依靠分布在各地的CDN服务器,通过负载均衡、内容分发、调度等功能模块让用户从与其最近的CDN服务器获取数据,从而降低网络传输的开销,提高访问速度。
举个例子:你在某东官方下单了一件商品,某东就会在理你收货地址最近的仓库将货物发出,而这些仓库在分布在全国各个地点,从而提高快递到用户手上的速度。
假设我在湖南要访问www.baidu.com
百度网页,而百度的服务器在北京,其实是由这么一个流程:
- 先去查询浏览器的缓存看看没有有这个域名对应的ip地址
- 如果浏览器缓存没有查到就会去查找本地的host文件,看看本地的Host文件有没有这么该域名对应的Ip地址
- 如果还是没有就会走DNS解析流程,首先本地DNS就会去问DNS服务器的根服务器,根服务器就会告诉你负责
.com
域名的顶级域名服务器 - 接着就会去找负责
.com
顶级域名服务器,问顶级域名服务器,它说你去找baidu.com
的权威域名服务器 - 最后你去找到权威域名服务器问
www.baidu.com
域名对应的ip,本地DNS拿到域名对应的Ip后就会将ip返回给客户端。 - 拿到
www.baidu.com
域名对应的Ip后,就会去请求该Ip对应的服务器。
我从湖南请求北京的服务器,要跨域大半个中国,期间涉及到大量的网络传输细节,网络传输其实是一件非常复杂的事情,很可能出现丢包等一些以外情况,导致用户访问时间长甚至白屏现象
那么测试就可以用到CDN服务器,将一些静态资源存储到CDN服务器上,这些CDN服务器会有一群专门的人或者说厂商来维护,会分布在世界各地。同理假设百度在每个省份都设有CDN服务器,当我从湖南访问www.baidu.com
的时候,就是直接从就近的湖南CDN服务器来获取数据了,并不需要再去请求北京服务器来获取数据了,从而减少了网络传输的开销,简单理解CDN其实就是一个缓存服务器,CDN一般用来缓存一些静态数据,比如说图片、视频或者说一些软件安装包之类的。
假设你使用对象存储存放图片数据,使用CDN做缓存。那么访问图片的时候就是这么一个流程,假设范围的是www.test.com/demo.jpg
图片
- 首先去浏览器访问的时候会通过DNS解析流程拿到该域名对应的别名,DNS消息有很多种类型,其中A类型 ,就是用域名去查域名对应的IP地址。而CNAME类型 ,则是用域名去查这个域名的别名。
- 通过
www.test.com
查询到该域名对应的别名,也就是CDN服务器的域名。 - CNAME里指向的,其实是CDN专用的DNS域名服务器,再通过CND的域名服务器解析出对应的ip地址
- 拿到Ip地址后就会去访问对应的CDN服务器来获取数据
为啥需要CNAME别名?
- 其实CNAME对应的别名其实就用例解析出距离用户**"最近"**的CDN服务器
- 因为CDN厂商可定知道每台CDN服务的距离用户的距离以及每台服务器的负载,根据距离和负载挑选出最适合用户的服务器Ip返回给用户,让用户进行请求
回源是什么?
我们知道当我们访问一个数据在Redis中没有的时候,就会去访问MySQL数据库。CDN也是同理,如果用户访问的资源在CDN服务器中不存在,那么此时CND就会去真正的源服务器中获取数据,把数据缓存到CDN服务器上,下次用户访问的时候,就会从CDN中获取数据。
恶意攻击?
根据前面所说可以指定,在引入CDN后用户访问的其实并不是真正的源服务器而是CDN服务器,那么假设有恶意请求打到CDN服务器上的时候,CDN能承受的住吗?其实CDN的服务厂商肯定会考虑这个问题,一般采用负载均衡和任播技术来解决。就是多个CDN服务器对外都暴露的是同一个Ip地址,CND域名解析的时候就会采用任播技术根据一个服务器的负载来决定是否将用户请求分配一个距离用户最近的服务器,就可以通过负载均衡来将用户的请求流量分发给不同服务器。
费用问题?
既然CDN需要收费,那么使用CDN会不会让成本更高呢?如果不使用CDN服务,请求源服务器距离可能非常远在网络传输的时候可能会出现一些问题,最关键的是需要更到的网络带宽费用,而CDN采用的是**"最近"**原则,可以近一步降低网络传输成本。少走一段路,肯定比多走一段路开销是更小的。
小结
但我们需要将图片、视频或者说软件安装程序进行让全国甚至世界各地用户多次访问的时候,就可以介入CDN提高用户访问速度。但如果图片和服务都处于内网,并且这些文件并不会重复访问就不需要用到CDN服务了。