当rocksdb无法将内存表刷新到sst文件时会发生什么?

时间:2019-02-10 15:16:25

标签: rocksdb

我们的服务(使用rockdb)的磁盘空间不足约30分钟。 我们手动删除了一些释放650MiB的文件。 但是,即使有了那些免费的650MiB,rocksdb仍然抱怨:

  

IO错误:无法为以下内容进行写操作:   /path/to/database/454250.sst:磁盘上没有足够的空间。

内存表是否有可能太大而需要超过650MB的磁盘空间? 查看数据库文件夹中的其他sst文件,它们占用的空间不超过40MiB。

如果没有,这些错误消息还有什么其他原因?

1 个答案:

答案 0 :(得分:0)

在两种情况下可能会发生这种情况,

1)Rocksdb通过WAL文件保留内存中数据,并在刷新内存表时将其删除。当您有多个列系列时,其中一些具有较高的插入率(内存填充速度更快),而另一些具有较低的插入率,则无法删除.log files(rocksdb WAL文件)。这是因为,wal文件包含来自所有列族的事务,并且只有通过刷新将所有列族都保留下来后才能将其删除。 这可能会导致.log文件停滞,从而导致磁盘空间问题。

2)假设将内存表大小配置为1GB,要合并的内存表数为3, 您实际上等待3个内存表填充,然后触发刷新。即使您已将目标文件大小配置为50MB(因为您已经提到过SST约为40MB),您仍将生成185个SST,每个大小为50MB,总计3GB。 但是您拥有的空间约为650MB,这可能是个问题。

有多种选项会影响rocksdb中的刷新行为。您可以看一下

write_buffer_size-每个内存表的大小。

min_write_buffer_number_to_merge-在刷新期间要合并的内存表的数量,换句话说,当不可变内存表的计数等于该值时,请刷新磁盘。

target_file_size_base-通过压缩或冲洗生成的SST的大小。

target_file_size_multiplier-确定每个级别中SST的大小。

您还可以查看SST压缩技术。让我知道是否有帮助。