我们的服务(使用rockdb)的磁盘空间不足约30分钟。 我们手动删除了一些释放650MiB的文件。 但是,即使有了那些免费的650MiB,rocksdb仍然抱怨:
IO错误:无法为以下内容进行写操作: /path/to/database/454250.sst:磁盘上没有足够的空间。
内存表是否有可能太大而需要超过650MB的磁盘空间? 查看数据库文件夹中的其他sst文件,它们占用的空间不超过40MiB。
如果没有,这些错误消息还有什么其他原因?
答案 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压缩技术。让我知道是否有帮助。