我们如何使用Zstandard和Pingora节省数PB的缓存

我们能用同样的硬件获得更多的缓存空间吗?我们在Cloudflare的缓存中构建了压缩原型来找出答案。

内存成本正在急剧增加。RAM和硬盘驱动器价格在过去一年中都出现了爆炸式增长。在Cloudflare,我们运行着几种大规模分布式存储产品(包括我们著名的CDN ),这些产品依赖于有效利用我们部署的内存,以便我们可以继续为所有客户提供服务。考虑到这一点,我们设计了一种方法来扩展有效的缓存容量。

通过在Pingora内使用Zstandard对符合条件的资产进行编码,该架构以微小的CPU增加换取显着的存储和跨数据中心带宽节省。我们一直在构建一个名为Cache Transcoding的系统原型,该系统是我在Cloudflare实习期间构建的,是1.1.1.1实习计划的一部分。当符合条件的响应进入缓存时,我们使用Zstandard或zstd对其进行编码,然后将其写入磁盘。

当资产位于缓存中并通过分层缓存在数据中心之间移动时,我们保留压缩表单,然后在向客户端提供响应之前对其进行解码。在我们的初始测试中,这种编码将符合条件的资产平均缩小到其原始磁盘大小的1/3。我们面向原始代理的估计额外CPU成本很小,但这就是交易。

CPU的少量增加为Cloudflare提供了数PB的有效缓存容量,并减少了我们数据中心之间传输的数据。当资产进入缓存时,将支付一次编码成本。每次重复使用资产时,都会继续节省存储和带宽。Zstandard或zstd是由Facebook的Yann Collet开发的无损压缩算法,于2016年开源。

无损是指压缩数据解码后,每个字节都与原始字节相同。我们可以更改资产在磁盘上的表示方式,而无需更改资产本身。Zstd旨在平衡压缩比和速度。在我们早期的浏览器压缩测试中,它压缩数据的速度比Brotli快42%,同时生成的文件大小几乎相同,生成的文件比gzip小11.3%,速度相当。