为什么rocksDB需要多个级别?

Yjy*_*eff 2 leveldb lsm-tree rocksdb

RocksDB 1 级中的所有键都已排序。因此我们可以在这个关卡中快速获得钥匙。为什么rocksDB还需要将level 1的文件压缩到level 2呢?

我在 LevelDB 的文档上找到了一种解释:如果同一目录中的文件太多,则在一个目录中打开文件会很慢。但是,正如文档中提到的,我们可以使用分片来解决这个问题。我认为分片比压缩容易得多。我对吗?

提前致谢!

小智 5

多个级别可以减少写入放大。

由于 上的数据level 0未排序,因此它可能与 上的大部分数据重叠level 1。这意味着从level0 -> level1需求到压缩大部分数据的压缩,这种情况经常发生。如果您还有 1 个 level: level2,那么 >90% 的数据位于第 2 级,因此level0->level1压缩会小得多,从而减少压缩带来的写入放大。一般来说,级别越多,写放大越小,但读放大越高,因为需要读取的级别越多。

不仅仅是RocksDB,所有LSM-tree都是如此。在 RocksDB 中,您实际上可以通过设置将级别数配置为 2,num_levels我们不建议在正常用例中这样做:https://github.com/facebook/rocksdb/blob/0ed8cb666de61d2e18bbb1fc90e05b734cee02de/include/rocksdb/advanced_options。 h#L433-L434