Cloudflare 如何用 Zstandard 和 Pingora 节省 PB 级缓存存储空间
Cloudflare 博客发表技术文章,详细介绍了他们如何通过 Zstandard 压缩算法和 Pingora 代理服务器的缓存转码(cache transcoding)技术,潜在节省 PB 级别的缓存存储空间。文章深入分析了传统缓存压缩方案的局限性,以及 Cloudflare 如何通过创新的转码架构在不影响缓存命中率的前提下大幅提升压缩率。这一技术对于大规模 CDN 和缓存系统的设计具有重要参考价值。
背景:缓存存储的挑战
Cloudflare 缓存的规模
Cloudflare 运营着全球最大的 CDN 网络之一:
- 覆盖 100+ 个国家的 300+ 城市
- 每天处理数万亿次请求
- 缓存存储达到 PB 级别
- 缓存内容包括静态资源、动态内容、视频等多种类型
随着互联网流量的持续增长,缓存存储的成本和管理变得越来越重要。
传统压缩方案的局限
传统的 CDN 缓存压缩方案存在几个问题:
- 压缩格式固定:缓存中存储的内容通常以单一压缩格式存储(如 gzip)
- 客户端兼容性问题:不同客户端支持不同的压缩算法,需要存储多个版本
- 压缩率不够高:gzip 等传统算法的压缩率有限
- 重新压缩成本高:要切换压缩算法需要重新压缩所有缓存内容
多版本存储的浪费
为了兼容不同客户端,传统 CDN 通常需要存储多个压缩版本:
- 未压缩版本(用于不支持压缩的客户端)
- gzip 版本(用于大多数客户端)
- Brotli 版本(用于现代浏览器)
- 可能还有其他格式
这意味着同一个内容可能存储 2-3 个副本,大幅增加了存储需求。
Zstandard:下一代压缩算法
Zstandard 简介
Zstandard(zstd)是由 Facebook(现 Meta)开发的现代压缩算法:
- 提供比 gzip 更高的压缩率
- 压缩和解压速度更快
- 支持多线程压缩
- 提供从 1 到 22 的广泛压缩级别
- 支持字典压缩(对小文件特别有效)
- 开源,BSD 许可证
Zstandard vs gzip vs Brotli
| 特性 | gzip | Brotli | Zstandard |
|---|---|---|---|
| 压缩率 | 中等 | 高 | 高 |
| 压缩速度 | 快 | 慢 | 快 |
| 解压速度 | 快 | 中等 | 快 |
| 多线程 | 否 | 否 | 是 |
| 字典压缩 | 否 | 部分 | 是 |
| 浏览器支持 | 全部 | 现代浏览器 | 部分 |
| 压缩级别 | 1-9 | 0-11 | 1-22 |
Zstandard 的优势在于同时提供高压缩率和快速度,这使其成为缓存存储的理想选择。
Pingora:Cloudflare 的新一代代理服务器
Pingora 简介
Pingora 是 Cloudflare 开发的新一代代理服务器框架,用 Rust 编写:
- 替代传统的 Nginx
- 提供更高的性能和更低的延迟
- 支持更灵活的请求处理流水线
- 内置异步 I/O 和多线程支持
- 开源,Apache 2.0 许可证
Pingora 的缓存架构
Pingora 的缓存架构设计支持更灵活的缓存处理:
- 可插拔的缓存后端
- 灵活的缓存键设计
- 支持缓存内容的转换和处理
- 细粒度的缓存控制
- 内置的压缩和解压缩支持
缓存转码:核心创新
什么是缓存转码
缓存转码(cache transcoding)是 Cloudflare 的核心创新:
传统方案:缓存中存储多个压缩版本,根据客户端请求返回对应版本。
转码方案:缓存中只存储一个高压缩率版本(如 Zstandard),在返回给客户端时实时转码为客户端支持的格式。
转码架构
转码架构的工作流程:
- 缓存写入:内容以 Zstandard 高压缩率格式存储到缓存
- 缓存读取:从缓存读取 Zstandard 格式的内容
- 格式检测:检测客户端支持的压缩格式(Accept-Encoding 头)
- 实时转码:
- 如果客户端支持 Zstandard,直接返回
- 如果客户端支持 gzip,实时转码为 gzip
- 如果客户端支持 Brotli,实时转码为 Brotli
- 如果客户端不支持压缩,实时解压
- 返回响应:将转码后的内容返回给客户端
转码的性能考量
实时转码会引入额外的计算开销,需要仔细优化:
- 解压速度:Zstandard 的解压速度非常快(通常 > 1 GB/s)
- 流式处理:转码可以流式进行,不需要等待完整内容
- 多线程:Pingora 的多线程架构可以并行处理转码
- 转码结果缓存:热门内容的转码结果可以缓存,避免重复转码
- 智能选择:对于不支持 Zstandard 的客户端,选择转码成本最低的格式
存储节省分析
压缩率提升
Zstandard 相比 gzip 通常可以提供:
- 10-30% 更高的压缩率(对于文本内容)
- 对于某些类型的内容,压缩率提升可达 50%
- 使用字典压缩时,小文件的压缩率提升更为显著
多版本消除
通过缓存转码,可以消除多版本存储:
- 传统方案:存储 2-3 个压缩版本
- 转码方案:只存储 1 个 Zstandard 版本
- 存储节省:50-67%
综合节省
综合压缩率提升和多版本消除:
- 文本内容:综合存储节省可达 50-70%
- JavaScript/CSS:综合存储节省可达 40-60%
- JSON/API 响应:综合存储节省可达 50-70%
- 整体平均:PB 级缓存系统可节省 30-50% 的存储空间
对于 Cloudflare 这样的 PB 级缓存系统,这意味着可以节省数百 PB 的存储,大幅降低硬件成本和能耗。
技术挑战和解决方案
挑战 1:转码延迟
实时转码可能增加响应延迟。
解决方案:
- Zstandard 的解压速度极快,转码开销很小
- 流式转码,首字节延迟低
- 热门内容的转码结果可以缓存
- 对于延迟敏感的内容,可以选择直接存储常用格式
挑战 2:CPU 开销
转码需要额外的 CPU 资源。
解决方案:
- Pingora 的多线程架构高效利用 CPU
- Zstandard 的快速解压降低 CPU 开销
- 智能转码策略(只在必要时转码)
- CPU 和存储的成本权衡分析
挑战 3:缓存命中率
转码不应该影响缓存命中率。
解决方案:
- 缓存键不包含压缩格式,所有客户端共享同一个缓存条目
- 转码在缓存读取后进行,不影响缓存写入和查找
- 缓存命中率与传统方案相同甚至更高(因为存储更多内容)
挑战 4:内容完整性
转码过程中必须保证内容完整性。
解决方案:
- 使用流式校验和
- 转码前后的内容哈希验证
- 错误处理和回退机制
- 定期的内容完整性检查
对行业的影响
对 CDN 提供商
缓存转码技术为 CDN 提供商提供了:
- 大幅降低存储成本
- 更灵活的压缩策略
- 更快的新压缩算法采用
- 更好的客户端兼容性
对大规模缓存系统
对于任何大规模缓存系统(不仅仅是 CDN),缓存转码的思路都有参考价值:
- 存储最优格式,读取时转换为需要的格式
- 减少冗余存储
- 灵活支持多种输出格式
- 在存储成本和计算成本之间找到最优平衡
对压缩算法的采用
缓存转码降低了新压缩算法的采用门槛:
- 不需要重新压缩所有缓存内容
- 可以逐步引入新算法
- 客户端兼容性不再是障碍
- 可以快速利用压缩算法的最新进展
总结
Cloudflare 的缓存转码技术通过结合 Zstandard 高压缩率算法和 Pingora 灵活的代理架构,实现了在缓存中只存储单一高压缩率版本、在读取时实时转码为客户端支持格式的创新方案。这一技术可以潜在节省 PB 级别的缓存存储空间,综合存储节省可达 30-70%,同时不影响缓存命中率和客户端兼容性。关键挑战包括转码延迟、CPU 开销、缓存命中率和内容完整性,Cloudflare 通过 Zstandard 的快速解压、Pingora 的多线程架构、流式处理和智能转码策略有效解决了这些问题。缓存转码的思路不仅适用于 CDN,对于任何大规模缓存系统都有重要参考价值,同时也降低了新压缩算法的采用门槛。随着互联网流量的持续增长,这样的存储优化技术将变得越来越重要。
来源:https://blog.cloudflare.com/cache-transcoding/