2

我想使用rocksdb,并想明确知道它是如何处理重复的。

文件说:

The entire database is stored in a set of sstfiles. When a memtable is full, 
its content is written out to a file in Level-0 (L0). RocksDB removes 
duplicate and overwritten keys in the memtable when it is flushed to a file in L0.

现在,在拥有多个数据库的环境的情况下,我找不到描述。在这种情况下,密钥是环境范围内唯一的,还是每个数据库都有其唯一的密钥?我找不到对整个环境的行为的描述。

4

1 回答 1

3

对您的问题的简短回答:有一个称为压缩的后台进程,它会定期将几个 sst 文件合并到一个排序的运行中(这个排序的运行可以表示为多个 sst 文件,但每个文件都有不相交的键范围。)在此期间压缩过程,它处理重复的键。

这是您问题的长答案:

RocksDB 是一个LSM数据库。当一个键值对被写入 RocksDB 时,RocksDB 只需为其创建一个数据条目并将其附加到一个名为 MemTable 的内存缓冲区中。

当 MemTable 变满时,RocksDB 将对所有键进行排序并将它们刷新为单个 sst 文件。随着我们不断写入更多数据,将会有更多的 sst 文件被刷新,这里的每个 sst 文件通常具有重叠的键范围。此时,假设我们有 N 个 sst 文件,并且有一个读取请求进来。那么这个读取请求必须检查所有这 N 个 sst 文件,看它是否包含请求的 key,因为每个 sst 文件可以有重叠的 key-range。结果,如果没有任何过程来重新组织这些 sst 文件,随着我们不断写入更多数据,读取将变得更慢。

重新组织这些 sst 文件的过程称为压缩,它本质上是一种类似于多路合并排序的操作,它输入多个 sst 文件并输出单个排序运行。在 compaction 过程中,RocksDB 会对这些输入的 sst 文件中的所有 key 进行排序,合并可能的数据条目,并在找到匹配的删除条目时删除数据条目。

于 2015-08-19T23:22:00.370 回答