Dropbox 近日介绍了其如何通过重新设计压缩策略,提高 Magic Pocket 的存储效率。Magic Pocket 是公司用于大规模存储用户文件的内部不可变对象存储系统。新的方案会定期将有效数据重新组织到新的存储卷中,从而释放并复用那些部分占用的旧卷空间。
正如在《Increasing Magic Pocket write throughput by removing our SSD cache disks》一文中所述,Dropbox 去年引入了一项新服务,改变了数据在该不可变对象存储中的分布方式,从而降低了后台写入的写放大。但这一变化也带来了一个非预期结果:数据碎片化增加。
Dropbox 的后端将文件拆分为小对象,分布存储在不同服务器上,并将数据视为不可变。虽然这种设计提升了可靠性,但在文件更新或删除时,旧数据无法立即移除。Dropbox 的资深软件工程师 Facundo Agriel 解释道:
由于数据是不可变的,删除操作不会立即释放磁盘空间。旧数据仍然保留在存储卷中。一旦一个卷被关闭,就不会再被重新打开。这种权衡带来的结果是,删除会留下未使用空间,如果不主动回收,这些浪费会随着时间不断累积。若缺乏回收机制,存储卷会逐渐变为部分填充状态,使有效数据分散在更多磁盘上。由此产生的碎片化会显著增加存储开销。
今年早些时候,Dropbox 发现一个名为“Live Coder”的新服务生成了大量严重未填满的存储卷,有些卷的使用率甚至低于 5%。这使得数据分散在大量几乎空置的卷中,进一步加剧了碎片化和存储开销,同时也暴露了现有压缩系统的局限。
Dropbox 早期的压缩策略在大多数存储卷接近满载时运行良好,但当大量卷严重未填满时,其效率显著下降。为了解决这一问题,Dropbox 重新设计了负责空间回收的系统。更新后的方案优先处理效率最低的存储卷,并更加精细地管理清理任务,以避免对系统资源造成压力。Agriel 补充道:
压缩过程负责执行物理层面的空间回收。由于卷在关闭后无法修改,我们会从这些卷中收集仍然有效的数据块(blob),将其写入新的卷,并淘汰旧卷。这就是删除最终转化为可复用空间的方式。
新的压缩策略被称为 L2,当大量存储卷处于低填充状态时,它可以更快地回收空间。与之前逐步填满已有高密度卷的方法不同,L2 会将多个稀疏卷合并为一个接近满载的卷,从而加快空间回收速度。

Dropbox Magic Pocket
Dropbox 还引入了第三种压缩策略 L3,用于处理那些极度未填满、此前方法难以高效回收的存储卷。该策略通过 Live Coder 服务,将这些稀疏卷中剩余的有效数据流式迁移,并逐步重写到新的纠删码(erasure-coded)卷中。
在 Dropbox 的不可变存储系统中,压缩通过将有效数据重写到新卷并淘汰旧卷来回收磁盘空间,而纠删码则通过将数据拆分为多个片段并附加校验块来防止硬件故障,在部分数据丢失时仍可恢复。
在 Hacker News 的讨论中,一些用户质疑该产品的可用性(“如此出色的工程工作却被一个问题重重的产品所掩盖”)以及其定价,也有人对大型公司中所谓“非预期后果”的说法提出疑问。用户 nopurpose 写道:
我原以为这种体量的公司,在动这种会影响巨额基础设施成本的改动前,都会拿生产数据反复建模推演……结果发现也差不多:先发了再说,看看哪儿先炸。
Agriel 在讨论中回应称,大规模系统的运行往往是缓慢且不均匀的,这使得基础设施变更带来的影响难以及时察觉。
正如 InfoQ 此前报道,Magic Pocket 是 Dropbox 自研的对象存储系统,具备横向扩展能力,可支持 EB 级规模,已替代 Amazon S3,提供 99.99% 的可用性和极高的数据持久性。Agriel 曾在 QCon Plus 2023 上介绍过 Magic Pocket 的实现。
原文链接:
https://www.infoq.com/news/2026/04/dropbox-tiered-compaction/





