对于开发生来说,CDN这个词既熟悉又陌生。
从事开发的你很少需要接触这个,但总能听到别人提起。
我们都听说过它可以加快速度,我们可能知道为什么,但我们更深入。
用CDN一定比不用快吗。
我觉得有点傻不过没关系今天,我们从另一个角度来认识一下CDN
什么是CDN。
我们一般用mysql数据库来存储。
文本存在于mysql中
当我们需要检索这些数据时,我们需要读取mysql数据库。
但是由于mysql的数据存在于磁盘上,单个实例的读取性能几乎是5kqps,相当不错了。
看起来还行,但是对于稍微大一点的系统来说,就有点着急了。
为了提高性能,我们在mysql之前再加一层内存作为缓存层,比如常说的redis在读取数据时,优先选择在内存中读取,只有在无法读取时,才能在mysql中读取,大大减少了读取mysql的次数有了这个组合拳,阅读性能轻松到几万qp
Mysql和redis
好了,到目前为止,我们说的都是平时容易接触到的开发场景。
比如我有一张很帅的照片就下面这个
每次听到有人翻唱蔡健雅的《放手》,就忍不住想发这张图。
用小品《我还是忘不了》。
那么问题来了。
再回到mysql和redis的场景,无非是存储层加缓存层。
存储层和缓存层
而缓存层,不能继续使用redis,需要改用CDN。
CDN可以简单理解为对象存储对应的缓存层。
CDN和OSS
CDN的工作原理
对于CDN和对象存储,现在让我们看看它们是如何工作的。
1667103075060
CDN的查询流程
第一阶段:你的电脑首先会通过DNS协议获取域名cdn.xiaobaidebug.top对应的IP。
第一步和第二步:首先检查浏览器缓存,然后查看操作系统中的/etc/hosts缓存如果没有,您将询问最近的DNS服务器最近的DNS服务器上有相应的缓存吗如果有,就退回去
第三步:如果最近的DNS服务器上没有对应的缓存,则查询根域,一级域,二级域,三级域服务器。
第二阶段:对应上图中的step8浏览器带着这个IP访问cdn节点,然后cdn节点返回数据
在上面的第一阶段过程中,提到了许多新术语,如CNAME,根域名,一级域名等它们在之前的《DNS中有哪些优秀的设计值得学习不知道的可以看看
我们知道DNS的目的是通过域名获取IP地址。
但这只是它众多功能中的一个。
DNS报文有很多种类型,其中A类是用域名来查域名对应的IP地址CNAME类型使用域名来检查该域名的别名
对于常见的域名,DNS解析后可以直接获得域名对应的IP地址。
例如,我使用dig命令发出DNS请求并打印进程数据。
$ dig+trace xiaobaidebug . top,,回答部分:小白debug.top.600INA47.102.221.141
可以看到xiaobaidebug.top直接解析得到对应的IP地址47.102.221.141。
看到这里,问题又来了。
为什么加个CNAME这么麻烦。
CNAME所指的其实是CDN专用的DNS域名服务器对于整个DNS系统来说,它只是小型DNS域名服务器中的一个,看起来和其他域名服务器没什么两样,平平淡淡DNS请求也将正常进入此服务器
但是,当请求真正击中它的时候,它的特殊性就体现出来了当查询请求进入域名服务器时,普通DNS域名服务器返回域名对应的部分IP就足够了,但是CDN专用的DNS域名服务器会要求将最近服务器的IP返回给调用者
CDN的专用DNS解析服务器会返回最近的CDN节点的IP怎么知道哪个服务器IP有最近的调用者
可以看到最近这个词实际上是用双引号括起来的。
CDN的专用DNS域名服务器实际上是由CDN提供商提供的比如阿里云当然知道自己有哪些CDN节点,以及这些CDN服务器当前的负载情况,响应延迟甚至权重,也能知道调用者的IP地址是什么它可以通过来电者的IP知道自己所属的运营商及其大概位置,根据条件选择最合适的CDN服务器,也就是所谓的最近
比如说假设地理位置最近的CDN机房流量较多,响应较慢,但地理位置较远的服务器可以更好地响应当前请求,按理说可能会选择地理位置较远的CDN服务器
也就是说,选择的服务器不一定是地理上最近的,但一定是目前最合适的服务器。
背后的源头是什么。
像下面这样。
这就好比问你能不能不用redis直接从mysql读取和显示文本数据。
当然可以。
但是成本较高这里的成本可以指性能成本,也可以指通话成本看下图
1667101182393
但是看到这里,问题又来了。
在上面的截图中,红框里有一个词叫回到源头。
但是cdn服务器本质上是一层缓存,不是数据源,对象存储才是数据源。
所以参观的过程就变成了如下。
1668605964836
那么回到源头还会发生什么。
除了上面提到的cdn,如果你拿不到数据,它会返回源站,如果cdn上的缓存过期,它也会返回源站。
另外,即使有缓存,而且缓存没有过期,也可以通过cdn提供的开放接口来触发,但是我们很少有机会接触到这个。
也是读取,细分为是直接从cdn读取,还是从源读取对象存储后由cdn返回。
直接缓存和不缓存回源是有区别的。
那么,我们有什么办法来判断是否发生了倒源呢。
是的我们继续往下看
如何判断是否发生货源回流。
以我们的云对象存储和CDN为例。
然后通过下面的标签开关查看响应头信息。
检查响应标头
回到源头
此时响应头下X—Cache的值为MISS TCP_MISS这意味着缓存未命中会导致CDN将oss检查回源,并在获得数据后返回
1667095186020
X—Cache的值变成HIT TCP_MEM_HIT,也就是命中缓存。
这是一个云的做法,和其他的东西,如腾云韵,也有很大的不同,几乎所有的相关信息都可以在响应头中找到。
用CDN比不用更快吗。
看到这里,就可以回答文章开头的问题了。
如果不接入CDN,直接接入源站,流程是这样的。
更新直接访问源站
但是,如果CDN已连接,并且CDN上没有缓存的数据,它将触发回源。
更新CDN,回归本源
相当于在原有流程上增加了一层CDN调用流程。
也就是使用CDN的时候会比不使用的时候慢,因为CDN缓存丢失,返回源。
如果缓存丢失,可能是cdn中根本没有这样的数据,也可能是有这样的数据但后来过期了。
这两种情况都很正常,大部分时候都不需要治疗。
Cdn刷新预热
当然,也可以通过灰度释放的模式,让少部分用户体验新功能,让这些用户热起来cdn
就是曾经有过这个数据,后来过期了对于热点数据,可以适当增加cdn数据的缓存时间
167344813600什么情况下不应该使用CDN。
从上面的描述来看,CDN最大的优势是对于来自世界各地的用户来说,可以就近分配CDN节点获取数据,在重复获取相同文件数据时可以加速缓存。
然后反过来想,问题就来了。
什么情况下不应该使用CDN。
注意上面两个加粗的要点。
1668612494972
摘要
如果使用CDN,实际上会比不使用时慢。
CDN最大的优势在于,对于来自世界各地的用户,可以就近分配CDN节点获取数据,当多次重复获取同一文件数据时,具有缓存加速的功能如果你的服务和对象存储都在内网,文件数据不太可能被重用,实际上就没有必要访问cdn
。