CDN
概念
对于数字和文本类型的数据,比方说名字和电话号码相关的信息。我们需要有个地方存起来。我们通常会用mysql数据库去存。为了提升点性能,我们在mysql之前再加一层内存做缓存层,比如常说的redis,读数据优先到内存里读,读不到才到mysql里读,大大减少了读mysql的次数。有了这套组合拳,读性能轻松上万qps。
但如果现在我要处理的,不再是上面提到的文本类数据,而是图片数据。对于图片这样的文件对象,存储层不太可能再用mysql,应该改用专业的对象存储,比如oss。而缓存层,也不能继续用redis了,需要改成使用CDN(Content Delivery Network,内容分发网络)。
MySQL与Redis的关系,就像OSS与CDN的关系。对用户来说,这张图片数据存在了对象存储那,当有需要的时候,会从CDN那被读出来。
工作原理
一、域名解析阶段
- 用户请求域名解析
- 当用户想要访问一个网站时,会先向本地DNS(域名系统)服务器发起域名解析请求。例如,用户在浏览器地址栏输入“www.example.com”这个网址,浏览器会将这个域名发送给本地DNS服务器,请求获取对应的IP地址。
- 本地DNS服务器查询
- 本地DNS服务器首先会在自己的缓存中查找该域名对应的IP地址。如果缓存中有记录,就会直接将IP地址返回给用户。如果没有,它会向上游DNS服务器(如ISP的DNS服务器)发起查询请求。
- 全局负载均衡DNS解析
- 对于配置了CDN服务的域名,最终的解析请求会到达CDN的全局负载均衡DNS服务器。这个服务器会根据一系列因素来决定将用户请求引导到哪个CDN节点。
- 它会考虑用户的地理位置。比如,如果用户位于中国北京,而CDN在全球有多个节点,它可能会优先选择北京附近或者网络连接较好的CDN节点。同时,还会考虑节点的负载情况,如果某个节点当前的流量很大,就会尽量避免将新的用户请求分配到这个节点,以保证各个节点的负载均衡。
二、内容获取阶段
- 缓存命中情况
- 当用户请求被引导到某个CDN节点后,CDN节点会先检查本地缓存。如果该节点缓存中有用户请求的内容(如网页的HTML文件、图片、视频等),就会直接将内容返回给用户。例如,对于一些热门的新闻网站图片,CDN节点很可能已经缓存了这些图片,用户请求时就能快速获取。
- 缓存未命中情况
- 如果CDN节点的缓存中没有用户请求的内容,节点就会向源站服务器发起请求。源站服务器是网站内容的原始存储位置。CDN节点从源站获取内容后,会将内容存储到自己的缓存中,同时将内容返回给用户。这样,当下一次有用户请求相同的内容时,就可以直接从CDN节点的缓存中获取,而不需要再次访问源站,从而减轻源站的负载并提高内容的获取速度。
三、内容更新阶段
- 缓存失效策略
- CDN节点的缓存内容不会永久存储。每个缓存内容都有一个生存时间(TTL,Time To Live)。这个时间可以由网站管理员根据内容的更新频率来设置。例如,对于一些实时更新的新闻内容,TTL可能设置得较短,如几分钟;而对于一些不经常更新的静态页面,TTL可以设置为几天甚至更长时间。
- 当缓存内容的TTL到期后,该内容就会标记为失效。下次用户请求这个内容时,CDN节点会重新向源站获取最新的内容,并更新缓存。
- 主动更新机制
- 除了缓存自然失效外,网站管理员也可以主动触发内容更新。比如,当网站发布新的产品信息或者更新了重要的页面内容时,管理员可以通过CDN管理平台手动清除相关缓存,或者设置缓存更新策略,让CDN节点尽快从源站获取最新的内容,以保证用户能够访问到最新的网站信息。