我们有一个写入密集型应用程序,每小时将数千条日志写入 RocksDB 表中的 MariaDB 数据库。我们想要管理磁盘空间几乎被填满的情况。
当前,当可用空间达到预定义的限制时,我们开始使用如下查询删除 1% 的最旧日志:
DELETE FROM log_table LIMIT 1000000;
当然,将行数分解为较小的数量并延迟查询以避免磁盘过载。
问题是删除行不会释放磁盘空间,只会创建逻辑删除,因此我们无法检查可用空间是否可用,也无法再次运行此查询。
因此,我们在所有查询完成后使用手动压缩来真正释放磁盘空间,查询如下:
SET GLOBAL `rocksdb_compact_cf` = 'log_family';
这产生了另一个问题,这也是我们当前的问题。这个手动压缩过程,大约需要当前数据库大小2倍的可用空间,而要做这样的压缩,我们需要保留一半的磁盘容量,这是一个很大的浪费。
我非常感谢对我们的问题提供的任何帮助/建议。
非常感谢。
平台信息:
OS: OpenSUSE 15.5
DBMS: MariaDB 10.6.14
MariaDB 配置:
[mysqld]
plugin-load-add=ha_rocksdb
rocksdb_compaction_sequential_deletes = 10000
rocksdb_compaction_sequential_deletes_count_sd = true
rocksdb_max_total_wal_size = 128MB
rocksdb_keep_log_file_num = 1
rocksdb_delete_obsolete_files_period_micros = 30000000
rocksdb_max_background_jobs = 2
rocksdb_max_subcompactions = 2
rocksdb-override-cf-options='default={compression=kZlibCompression; bottommost_compression=kZlibCompression; max_write_buffer_number=6; write_buffer_size=16m; min_write_buffer_number_to_merge=2; level0_file_num_compaction_trigger=4; max_bytes_for_level_base=128m; max_bytes_for_level_multiplier=10; target_file_size_base=12800k; target_file_size_multiplier=10; level0_slowdown_writes_trigger=16; level0_stop_writes_trigger=20;}'
我们阅读了许多 RocksDB github wiki 页面并尝试了不同设置的组合,但没有成功
在搜索和阅读文档很多天后,我最终使用了 FIFO 式压缩,其最大大小由应用程序动态更新。