CDN 技术详解与问题分析
目录 🔗︎
CDN 的不同用法 🔗︎
同资源多份缓存 🔗︎
- 描述:通过
Vary: Accept-Encoding
实现同资源多份缓存。 - 实现原理:
- 源站返回响应头
Vary: Accept-Encoding
,CDN 会识别该头部。 - 当客户端请求时,如果带上
Accept-Encoding: gzip
,CDN 返回 Gzip 压缩版本;如果客户端不支持 Gzip,则返回普通版本。
- 源站返回响应头
Auto Polyfill 🔗︎
- 描述:针对不同浏览器版本提供不同的 Polyfill。
- 实现原理:
- 使用自定义头部(如
User-Agent
集合)来区分浏览器版本。 - 源站返回
Vary
头部,CDN 根据客户端的User-Agent
提供对应的 Polyfill 文件。
- 使用自定义头部(如
Auto WebP/AVIF 🔗︎
- 描述:根据客户端支持的图片格式动态返回 WebP 或 AVIF 格式。
- 实现原理:
- 客户端请求头带上
Accept: image/avif
,CDN 自动返回 AVIF 图片格式。 - 如果客户端不支持 AVIF,则返回默认格式(如 JPEG 或 PNG)。
- 客户端请求头带上
动态加速 🔗︎
- 描述:通过网络专线或 CDN 路由优化提升动态请求性能。
- 实现原理:
- 路由优化:通过改变 BGP 选路路径,结合多路探测技术,选择最优链路(基于丢包率、RTT、整体下载时间等指标)。
- IP 获取:
- HTTP 请求:CDN 通过
X-Forwarded-For
或ORIG_CLIENT_IP
标记用户 IP。 - HTTPS 请求:由于加密报文无法解密,CDN 将用户 IP 放入 TCP Option 中,避免解密 HTTPS 报文。
- HTTP 请求:CDN 通过
举个具体例子: 如果用户访问html请求,CDN回源如果有配置动态加速,不是走的公网,走的CDN优化过的专线那么传输时间会更快。
Prefetch 加速 🔗︎
- 描述:提前将静态资源从源站加载到 CDN 边缘节点。
- 实现原理:
- DNS 解析时,权威 DNS 返回 CNAME 指令指向 CDN 全局调度器。
- CDN 从源站获取 HTML 文件并解析出图片 URL,提前缓存到边缘节点。
CDN 场景问题 🔗︎
CDN 节点故障导致 HTML 请求超时:
- 可能原因:节点宕机或网络异常。
- 解决方案:切换到其他可用节点或回源。
新增节点丢包率 100%:
- 可能原因:网络配置错误或硬件故障。
- 解决方案:检查网络设备和配置,确保链路正常。
调度方式 🔗︎
基于成本:
- 描述:在某些国家节点少但访问量大的情况下,为了降低成本,可以将流量调度到其他国家的节点。
基于优先级:
- 描述:高优先级用户的调度精准率更高,确保优质用户体验。
指定缓存时间 🔗︎
- 实现方式:通过响应头中的
s-maxage
指定 CDN 缓存时间。 - 作用:避免 HTML 在浏览器端缓存,导致 PV 计算不准确。
IVS 架构 🔗︎
LVS(Linux Virtual Server):
- 一种基于 Linux 的负载均衡解决方案,能够将用户请求分发到多个后端服务器,提高系统可用性和扩展性。
Full NAT(全地址转换):
- 将进入 LVS 的请求源 IP 和端口号转换为 LVS 自身的 IP 和端口号,然后转发到后端真实服务器。
四层转发(L4 Forwarding):
- 基于传输层(TCP/UDP)进行负载均衡,效率高但灵活性较低。
RealServer(真实服务器):
- 承担具体业务逻辑的服务器。
Linux 内核 TCP Kernel:
- 处理 TCP 协议栈,解析 TCP 报文并提取相关信息。
CDN 的问题 🔗︎
覆盖式发布导致缓存不生效:
- 原因:新版本文件未及时刷新缓存。
- 解决方案:主动刷新 CDN 缓存。
带时间戳可能导致缓存击穿:
- 原因:每次请求的时间戳不同,导致缓存失效。
- 解决方案:去掉时间戳或使用固定版本号。
专业技术 🔗︎
- CDN 是网络加速:
- 一般将资源推送到 OSS,然后刷新 CDN 缓存。
案例 🔗︎
- 用 CDN 还是 OSS:
- CDN 更适合动态加速和全球分发,OSS 更适合存储静态资源。
Vercel CNAME 优化 🔗︎
- CNAME Value:
cname-china.vercel-dns.com
- 特点:Vercel 针对中国网络做了专门优化,提升访问速度和稳定性。
CDN 的作用 🔗︎
- 定义:CDN 是一种分布式网络,用于缓存和分发静态资源。
- 功能:
- 将静态资源缓存到离用户最近的边缘节点,减少延迟。
- 提升资源加载速度,改善用户体验。
- 减轻源站的负载压力。
- 适用场景:适用于高频访问的静态资源(如图片、CSS、JavaScript 文件等)。
源站的角色 🔗︎
- 定义:源站是资源的原始存储位置,通常是一个服务器或服务集群。
- 功能:
- 当 CDN 缓存未命中时,请求会回源到源站获取资源。
- 源站负责提供最新的资源版本。
- 特点:
- 源站通常是动态内容的处理中心。
- 在静态资源分发中,源站更多扮演后备角色。
OSS 的本质 🔗︎
- 定义:OSS(对象存储服务)是一种高可用、高可靠的云存储服务。
- 功能:
- 存储海量的静态资源(如图片、视频、文档等)。
- 提供高并发访问能力,支持全球加速。
- 本质:OSS 本质上是一个存储服务,专注于数据的持久化和管理。
- 优势:
- 高扩展性:支持海量文件存储。
- 成本低:按需付费,适合大规模存储需求。
- 可靠性高:多副本存储,保障数据安全。
协作流程 🔗︎
优先走 CDN:
- 用户请求资源时,首先尝试从 CDN 获取。
- 如果 CDN 缓存命中,则直接返回资源,无需访问源站。
回源到源站:
- 如果 CDN 缓存未命中,请求会回源到源站。
源站走 OSS:
- 源站接收到请求后,从 OSS 中获取资源。
- OSS 作为底层存储服务,提供资源的最终存储和管理。
更新缓存:
- 源站返回资源后,CDN 会缓存该资源,以便后续请求直接从 CDN 获取。