为什么 rocksDB 需要多层次?
Why rocksDB needs multiple levels?
rocksDB 的 level 1 中的所有键都已经排序。因此,我们可以在这个级别快速获得密钥。为什么rocksDB还需要将level 1的文件压缩到level 2?
我在 LevelDB 上找到了解释 doc:如果同一目录中的文件太多,则在一个目录中打开文件会很慢。但是,正如文档中提到的,我们可以使用分片来解决这个问题。我认为分片比压缩要容易得多。我说得对吗?
提前致谢!
多个级别可以减少写入放大。
因为 level 0
上的数据未排序,所以它可能与 level 1
上的大部分数据重叠。这意味着来自 level0 -> level1
的压缩需要压缩大部分数据,这经常发生。
如果你还有 1 层:level2
,那么 >90% 的数据都在第 2 层,所以 level0->level1
压缩会变得更小,从而减少压缩带来的写入放大。一般level越多,write amplification越小,read amplification越高,因为要读的levels越多
不仅仅是RocksDB,所有的LSM-tree都是如此。而在 RocksDB 中,您实际上可以通过设置 num_levels
将级别数配置为 2,我们不建议将其用于正常用例:https://github.com/facebook/rocksdb/blob/0ed8cb666de61d2e18bbb1fc90e05b734cee02de/include/rocksdb/advanced_options.h#L433-L434
rocksDB 的 level 1 中的所有键都已经排序。因此,我们可以在这个级别快速获得密钥。为什么rocksDB还需要将level 1的文件压缩到level 2?
我在 LevelDB 上找到了解释 doc:如果同一目录中的文件太多,则在一个目录中打开文件会很慢。但是,正如文档中提到的,我们可以使用分片来解决这个问题。我认为分片比压缩要容易得多。我说得对吗?
提前致谢!
多个级别可以减少写入放大。
因为 level 0
上的数据未排序,所以它可能与 level 1
上的大部分数据重叠。这意味着来自 level0 -> level1
的压缩需要压缩大部分数据,这经常发生。
如果你还有 1 层:level2
,那么 >90% 的数据都在第 2 层,所以 level0->level1
压缩会变得更小,从而减少压缩带来的写入放大。一般level越多,write amplification越小,read amplification越高,因为要读的levels越多
不仅仅是RocksDB,所有的LSM-tree都是如此。而在 RocksDB 中,您实际上可以通过设置 num_levels
将级别数配置为 2,我们不建议将其用于正常用例:https://github.com/facebook/rocksdb/blob/0ed8cb666de61d2e18bbb1fc90e05b734cee02de/include/rocksdb/advanced_options.h#L433-L434