Post

The Rum Conjecture

Harvard的论文

原文及参考地址

文中提出了一个猜想,我们无法为存储系统设计一种在以下三个方面(读(Read)、写(Update,或者Insert)、存储空间(Memory,这里只包括内存,硬盘等一切存储介质))都达到最优的访问方法。该猜想提出,我们总是必须牺牲一个方面来使另外两个方面达到最优,使得这三个方面构成了一个竞争三角形,与著名的CAP定理非常相似。

在日常的工作上,可以在该猜想的基础上做这几方面的权衡。理想的存储开销,既有最优的读写性能,又不使用额外存储空间–是不可能的。

下文中“主数据”指要更新或者读取的数据本身,其他数据均为辅助数据。

读开销

存储引擎读取数据时会产生读开销。一般的数据结构都需要辅助的数据结构(索引)或者自身按照一定结构设计(比如),通常不会一次磁盘访问即马上命中。

读开销通过读取放大来衡量,它定义为读取的总数据量(主数据 + 辅助数据)与要读取的主要数据量之间的比率。

写开销

当存储引擎对辅助数据或某些未修改的原数据执行写入操作以及对原数据执行预期更新时,就会发生写开销。

写开销通过写入放大来衡量,它定义为写入的总数据量(主数据 + 辅助数据)与要更新的主数据量之间的比率。

存储开销

当存储系统使用辅助数据结构来加速读取、写入或满足常见访问模式时,就会产生内存开销。此存储是主数据存储需求之外的额外存储。

存储开销通过空间放大来衡量,它定义为辅助数据和主数据所使用的空间与主数据所使用的空间之间的比率。

读优化

如果追求最优的读取性能,需要添加一些额外的辅助数据结构(比如多级索引等)来加速读取,但维护提供高性能读的辅助数据结构需要增加存储空间和写入开销。

比如,支持点查常数级复杂度的数据结构(哈希索引),以及提供对数级复杂度的结构(B树,跳表等)都属于这一类。

写优化

写优化通常需要尽量避免写入数据的写放大,以及随机写入。一般使用辅助数据结构保存差异数据,并在批量更新时再合并到主数据结构上,从而提供比较低的更新开销。使用辅助数据结构需要增加存储开销,读取的时候也需要检查主数据结构和辅助数据结构,增加了读开销。

写优化的例子有:LSM-tree、分区B树等

存储优化

存储优化主要在于减少访问和更新主数据所需要的辅助数据结构空间大小。通常会使用压缩主数据和辅助存储,或允许一定的错误率,如误报。

存储优化系统提供一些有损索引结构(即. 不一定准确,得到的数据位置也不一定具体),比如Bloom-filter,Count-min sketches,稀疏索引等;主数据也有可能进行压缩存储。因此读写该系统会增加额外的读写开销(索引和主数据都包含额外开销)

This post is licensed under CC BY 4.0 by the author.