当 rocksdb 无法将 memtable 刷新到 sst 文件时会发生什么?
What happens when rocksdb can't flush a memtable to a sst file?
我们的服务(使用 rockdb)的磁盘用完 space 大约 30 分钟。
我们手动删除了一些文件,释放了 650MiB。
然而,即使有那些免费的 650MiB,rocksdb 仍然抱怨:
IO error: Failed to pwrite for:
/path/to/database/454250.sst: There is not enough space on the disk.
memtable 是否有可能变得太大以至于需要超过 650MB 的磁盘space?
查看数据库文件夹中的其他sst文件,它们占用的空间不超过~40MiB。
如果不是,这些错误消息还有哪些其他原因?
有两种情况会发生这种情况,
1) Rocksdb 通过 WAL 文件持久化内存中的数据,并在刷新 memtable 时将其删除。当你有多个列族时,其中一些具有更高的插入率(memtable 填充速度更快)而另一些具有较低的插入率,.log files
(rocksdb WAL 文件)无法删除。这是因为,wal 文件包含来自所有列族的事务,并且在通过刷新持久化所有列族之前无法删除它。
这可能会导致 .log 文件停滞不前,从而导致磁盘 space 问题。
2) 假设,memtable大小配置为1GB,合并memtables个数为3,
您实际上是在等待 3 个内存表填满,然后触发刷新。即使您已将目标文件大小(因为您提到过您的 SST 约为 40MB)配置为 50MB,您也会生成 185 个 SST,每个大小为 50MB,总计 3GB。
但是您拥有的 space 大约是 650MB,这可能是个问题。
有多种选项会影响 rocksdb 中的刷新行为。你可以看看,
write_buffer_size
- 每个内存表的大小。
min_write_buffer_number_to_merge
- 刷新期间要合并的内存表数量,换句话说,当不可变内存表计数等于此值时,刷新到磁盘。
target_file_size_base
- 压实或冲洗产生的 SST 的大小。
target_file_size_multiplier
- 决定每个级别的 SST 大小。
您还可以看看 SST 压缩技术。如果有帮助,请告诉我。
我们的服务(使用 rockdb)的磁盘用完 space 大约 30 分钟。 我们手动删除了一些文件,释放了 650MiB。 然而,即使有那些免费的 650MiB,rocksdb 仍然抱怨:
IO error: Failed to pwrite for: /path/to/database/454250.sst: There is not enough space on the disk.
memtable 是否有可能变得太大以至于需要超过 650MB 的磁盘space? 查看数据库文件夹中的其他sst文件,它们占用的空间不超过~40MiB。
如果不是,这些错误消息还有哪些其他原因?
有两种情况会发生这种情况,
1) Rocksdb 通过 WAL 文件持久化内存中的数据,并在刷新 memtable 时将其删除。当你有多个列族时,其中一些具有更高的插入率(memtable 填充速度更快)而另一些具有较低的插入率,.log files
(rocksdb WAL 文件)无法删除。这是因为,wal 文件包含来自所有列族的事务,并且在通过刷新持久化所有列族之前无法删除它。
这可能会导致 .log 文件停滞不前,从而导致磁盘 space 问题。
2) 假设,memtable大小配置为1GB,合并memtables个数为3, 您实际上是在等待 3 个内存表填满,然后触发刷新。即使您已将目标文件大小(因为您提到过您的 SST 约为 40MB)配置为 50MB,您也会生成 185 个 SST,每个大小为 50MB,总计 3GB。 但是您拥有的 space 大约是 650MB,这可能是个问题。
有多种选项会影响 rocksdb 中的刷新行为。你可以看看,
write_buffer_size
- 每个内存表的大小。
min_write_buffer_number_to_merge
- 刷新期间要合并的内存表数量,换句话说,当不可变内存表计数等于此值时,刷新到磁盘。
target_file_size_base
- 压实或冲洗产生的 SST 的大小。
target_file_size_multiplier
- 决定每个级别的 SST 大小。
您还可以看看 SST 压缩技术。如果有帮助,请告诉我。