网站怎么做下载,网站收录优化,武强网站建设,服装网站设计理念文章目录 前言CDN是什么?CDN的工作原理为什么要加个CNAME那么麻烦#xff1f;怎么知道哪个服务器IP里调用方最近#xff1f; 回源是什么回源是什么#xff1f;那还有哪些情况会发生回源呢#xff1f; 怎么判断是否发生回源用了CDN一定比不用的更快吗#xff1f;什么情况下… 文章目录 前言CDN是什么?CDN的工作原理为什么要加个CNAME那么麻烦怎么知道哪个服务器IP里调用方最近 回源是什么回源是什么那还有哪些情况会发生回源呢 怎么判断是否发生回源用了CDN一定比不用的更快吗什么情况下不应该使用CDN什么情况下不应该使用CDN 总结参考 看到了小白的文章, 为了加深印象自己来整理一下
前言
对于开发同学来说CDN这个词既熟悉又陌生。 平时搞开发的时候很少需要碰这个但却总能听到别人提起。 我们都听说过它能加速也大概知道个原因但是往深了问。用了CDN就一定比不用更快吗 就感觉有些懵了。但没关系今天我们换个角度重新认识下CDN。
CDN是什么?
对于数字和文本类型的数据比方说名字和电话号码相关的信息。我们需要有个地方存起来。我们通常会用mysql数据库去存。 当我们需要重新将这一数据取出的时候就需要去读mysql数据库。但因为mysql的数据是存在磁盘上的单台实例读性能到差不多5kqps就已经很不错了。
看起来还凑合但对于稍微大一点的系统就稍微有点捉急了。 为了提升点性能我们在mysql之前再加一层内存做缓存层比如常说的redis读数据优先到内存里读读不到才到mysql里读大大减少了读mysql的次数。有了这套组合拳读性能轻松上万qps。 到这里我们说的都是我们平时比较容易接触的开发场景。
但如果现在我要处理的不再是上面提到的文本类数据而是图片数据。
那么问题来了。这张图片数据应该存在哪又该从哪里读
我们回过头去看mysql和redis的场景无非就是存储层加缓存层。 对于图片这样的文件对象存储层不太可能再用mysql应该改用专业的对象存储比如亚马逊的S3Amazon Simple Storage Service注意后面是三个S开头的单词所以叫s3或者阿里云的ossObject Storage Service。
下面的内容我们就用比较常见的oss去做解释。
而缓存层也不能继续用redis了需要改成使用CDNContent Delivery Network内容分发网络。可以将CDN简单理解为对象存储对应的缓存层。 现在就可以回答上面的提问对用户来说这张图片数据存在了对象存储那当有需要的时候会从CDN那被读出来。
CDN的工作原理
有了CDN和对象存储之后现在我们来看下他们之间是怎么工作的。
我们平时看到的图片可以右键复制查看它的URL。 会发现图片的URL长这样。https://cdn.xiaobaidebug.top/1667106197000.png
其中前面的cdn.xiaobaidebug.top就是CDN的域名后面的1667106197000.png是图片的路径名。
当我们在浏览器输入这个URL就会发起HTTP GET请求然后经历以下过程。 第一阶段: 你的电脑会先通过DNS协议获得cdn.xiaobaidebug.top 这个域名对应的IP。
step1和step2先查看浏览器缓存再看操作系统里的/etc/hosts 缓存如果都没有就会去询问最近的DNS服务器比如你房间里的家用路由器。看看最近的DNS服务器上有没有对应的缓存如果有则返回。step3如果最近的DNS服务器上没有对应的缓存就会去查询根域一级域二级域三级域服务器。step4然后最近的DNS服务器会得到这个cdn.xiaobaidebug.top 域名的别名CNAME比如cdn.xiaobaidebug.top.w.kunlunaq.com .kunlunaq.com是阿里CDN专用的DNS调度系统。step5到step7此时最近的DNS服务器会去请求这个kunlunaq.com 然后返回一个离你最近的IP地址返回给你。
第二阶段: 对应上图里的step8。浏览器拿着这个IP去访问cdn节点然后cdn节点返回数据。 上面第一阶段流程里提到了很多新的名词比如CNAME根域一级域啥的可以自行查阅资料了解一下. 我们知道DNS的目的就是通过域名去获得IP地址。但这只是它的众多功能之一。
DNS消息有很多种类型其中A类型就是用 域名 去查 域名对应的IP地址。而CNAME类型则是用 域名 去查 这个域名的别名。 对于普通域名DNS解析后一般就能直接得到域名对应的IP 地址又叫A类型记录A指Address。
比如下面用dig命令发出DNS请求并打印过程数据。
$ dig trace xiaobaidebug.top
;; ANSWER SECTION:
xiaobaidebug.top. 600 IN A 47.102.221.141可以看到xiaobaidebug.top直接解析得到对应的IP地址47.102.221.141。
但对于cdn域名一波查询下来先得到的却是一条CNAME的记录xx.kunlunaq.com然后dig这个xx.kunlunaq.com才能得到对应的IP地址。
$ dig trace cdn.xiaobaidebug.top
cdn.xiaobaidebug.top. 600 IN CNAME cdn.xiaobaidebug.top.w.kunlunaq.com.$ dig trace cdn.xiaobaidebug.top.w.kunlunaq.com
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.243
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.241
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.244
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.249
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.248
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.242
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.250
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.251看到这里问题就又来了。
为什么要加个CNAME那么麻烦
CNAME里指向的其实是CDN专用的DNS域名服务器它对整个DNS体系来说只是其中一台小小的DNS域名服务器看起来就跟其他域名服务器一样平平无奇。DNS请求也会正常打入这个服务器里。
但当请求真正打到它上面的时候它的特别之处就体现出来了当查询请求打入域名服务器时普通的DNS域名服务器返回域名对应的部分IP就够了但CDN专用的DNS域名服务器却会要求返回离调用方最近的服务器IP。
怎么知道哪个服务器IP里调用方最近
可以看到最近这个词其实是加了双引号的。
CDN专用的DNS域名服务器其实是CDN提供商提供的比如阿里云当然知道自己的的CDN节点有哪些以及这些CDN服务器目前的负载情况和响应延时甚至权重啥的并且也能知道调用方的IP地址是什么可以通过调用方的IP知道它所属的运营商以及大概所在地根据条件筛选出最合适的CDN服务器这就是所谓的最近。
举个例子。假设地理位置最近的CDN机房流量较多响应较慢但地理位置远一些的服务器却能更好的响应当前请求那按理说可能会选择地理位置远一些的那台CDN服务器。
也就是说选出来的服务器不一定在地理位置最近但一定是当前最合适的服务器。
回源是什么
上面的图片URL是https://cdn域名/图片地址.png的形式。也就是说这张图片是访问CDN拿到的。
那么直接访问对象存储能不能拿到图片数据并展示比如像这样。https://oss域名/图片地址.png
这就像问不走redis直接从mysql中能不能读取到文本数据并展示一样。当然能。
但这样成本更高这里的成本可以指性能成本也可以指调用成本。看下面这个图。 可以看到直接请求oss的费用差不多是通过cdn请求oss的两倍考虑到家境贫寒同时也为了让博客获取图片的速度更快就接入了CDN。
但看到这里问题又又来了。上面的截图里红框里有个词叫回源。
回源是什么
当我们访问https://cdn域名/图片地址.png时请求会打到cdn服务器上面。
但cdn服务器本质上就是一层缓存并不是数据源对象存储才是数据源。
第一次访问cdn获取某张图片时大概率在cdn里并没有这张图片的数据因此需要回到数据源那去取出这份图片数据。然后再放到cdn上。下次再次访问cdn时只要缓存不过期就能命中缓存直接返回这就不需要再回源。
于是访问的过程就变成了下面这样。
那还有哪些情况会发生回源呢
除了上面提到的cdn上拿不到数据会回源站外还有cdn上的缓存过期失效了也会导致回源站。
另外就算有缓存且缓存不过期也可以通过cdn提供的开放接口来触发主动回源但这个我们比较少机会能接触到。
另外回源这个事情其实用户是感知不到的因为用户去读图片的时候只能知道自己读到了还是读不到。
同样是读到了还细分为是从cdn那直接读的还是cdn回源读对象存储之后返回的。
那么**我们有办法判断是否发生过回源吗**有。我们接着往下看。
怎么判断是否发生回源
我们以某里云的对象存储和CDN为例。
假设我要请求下面这张图https://cdn.xiaobaidebug.top/image/image-20220404094549469.png
为了更方便的查看响应数据的http header我们可以用上postman。
通过GET方法去请求图片数据。
然后通过下面的tab切换查看response header信息。 此时查看response header下的X-Cache的值是MISS TCP_MISS。意思是未命中缓存导致CDN回源查oss拿到数据后再返回。
那此时CDN里肯定是有这张图片的缓存了。我们可以试着再执行一次 GET 方法获取图片。 X-Cache的值就变成了HIT TCP_MEM_HIT这就是命中缓存了。
这个是某里云的做法其他比如腾某云啥的也都大差不差几乎都可以从response header里找到相关的信息。
用了CDN一定比不用的更快吗
看到这里我们就可以回答文章开头的问题了。
如果没有接入CDN直接访问源站流程是这样的。 但如果接入了CDN且CDN上没有缓存数据那就会触发回源。 相当于在原来的流程上还多了一层CDN的调用流程。
也就是用了CDN时未命中CDN缓存导致回源就会比不用的时候更慢。
未命中缓存可能是cdn里压根就没这一数据也可能是曾经有这条数据但后来过期失效了。
这两种情况都正常大部分时候并不需要做任何处理。
但对于极个别场景我们可能需要做些优化。比如你们源站数据有大版本更新就像更换cdn域名啥的那在上线的那一刻用户全用新cdn域名去请求图片啥的新CDN节点基本上百分百触发回源严重的时候甚至可能会拖垮对象存储。这时候你可能需要提前将热点数据筛选出来利用工具预先请求一波让CDN加载上热数据缓存。比如某里云上的CDN就有这样的刷新预热功能。
当然也可以通过灰度发布的模式先让少量用户体验新功能让这些用户把cdn热起来然后再逐步放开流量。
还有就是曾经有这条数据但后来过期失效了对于热点数据可以适当提高一下cdn数据的缓存时间。
什么情况下不应该使用CDN
从上面的描述看下来CDN最大的优势在于对于来自世界各地的用户它可以就近分配CDN节点获取数据并且多次重复获取同一个文件数据的时候有缓存加速的作用。
这对于网页图片这样的场景是再合适不过了。因为底层用的是对象存储也就是说只要是文件对象比如视频啥的都可以用这套流程接入cdn做加速。比如平时刷的某音某手短视频就是这么干的。
那反过来想想问题就来了。
什么情况下不应该使用CDN
如果你有一个公司内网的服务并且服务请求的图片等文件不太可能被多次重复调用这时候其实没必要使用CDN。
注意上面两个加粗了的关键点。
内网服务是为了保证你是了解服务的请求来源的也能拿到对象存储的读权限并且如果你的对象存储也是公司内部的那大概率跟你的服务已经在同一个机房里这已经很近了。接入CDN也享受不到就近分配CDN节点所带来的好处。图片或其他文件不太可能被多次重复使用如果接入了CDN那你每次去访问CDN获取图片的时候CDN节点上大概率没有你要的数据相当于每次都需要回源到对象存储去取一把。那接入CDN相当于给自己加了一层代理多一层代理就多一层耗时。 关于上面的第二点如果你需要一个明确的指标去说服自己那我可以给你一个。从上面的介绍内容我们知道可以通过cdn响应的http header中的X-Cache字段看到一个请求是否触发过回源统计次数再除以总的请求数就能得到回源的比例比如回源比例高达90%那还接啥cdn。
总结
对于文本类数据我们习惯用mysql做存储redis做缓存。但属于文件类数据比如视频图片则需要使用oss等做对象存储cdn做缓存用了CDN如果发生回源那实际上会比不用的时候更慢一些。CDN最大的优势在于对于来自世界各地的用户它可以就近分配CDN节点获取数据并且多次重复获取同一个文件数据的时候有缓存加速的作用。如果你的服务和对象存储都在内网并且文件数据也不太会有重复使用的可能性那其实没必要接入cdn。
参考
侵删 来自微信公众号: 小白debug