RocksDB 配置与选项详解
详解 RocksDB 的配置体系:DB Options、ColumnFamilyOptions、ReadOptions、WriteOptions,以及 BlockCache、Compaction(LSM 层级压缩)、Memtable、Bloom 过滤器、WAL 等核心调优对象与常用默认值。基于 RocksDB v11.8.1。
RocksDB 配置与选项详解
目标:掌握 RocksDB 的配置体系与调优对象。RocksDB 是 Facebook 基于 LevelDB 演进的高性能嵌入 KV 引擎,配置分布在几组 Options 与运行时管理的组件(BlockCache / Compaction / Memtable / WAL / Bloom 过滤器)中。正确配置这些参数,对读写性能与内存占用影响显著。文中默认值以 RocksDB v11.8.1 为准。
一、配置体系概览
| 配置对象 | 作用 | 何时用 |
|---|---|---|
Options | DB 全局选项(含 ColumnFamilyOptions + 上层 DB 选项) | DB::Open |
DBOptions | 数据库实例级(后台线程、WAL、统计等) | 嵌套于 Options |
ColumnFamilyOptions | 单个列族(内存、压缩、Compaction 策略) | CreateColumnFamily |
ReadOptions | 每次读的附加行为 | Get/NewIterator |
WriteOptions | 每次写的同步 / WAL 行为 | Put/Write |
典型组织:
Options继承自DBOptions+ColumnFamilyOptions的组合,Options可直接传给DB::Open。
二、DB Options(数据库级)
| 选项 | 默认 | 说明 |
|---|---|---|
create_if_missing | false | 库不存在时自动创建,常用设为 true |
create_missing_column_families | false | 自动创建缺失列族 |
max_background_jobs | 2 | 后台 flush/compaction 线程数 |
max_background_compactions | -1 | 专用于 compaction 的后台线程(-1 跟随 backgroud_jobs) |
max_total_wal_size | 0 | WAL 累积大小上限(0 = 自动基于 4 * write_buffer_size) |
bytes_per_sync | 0 | 每写多少字节 fsync 一次(0 关闭) |
wal_bytes_per_sync | 0 | WAL 同步字节间隔 |
statistics | 空 | 记录统计(配合 GetProperty("rocksdb.stats")) |
db_write_buffer_size | 0 | 全库写缓冲区总预算 |
keep_log_file_num | 1000 | 保留的历史日志文件数 |
示例:
rocksdb::DBOptions db_opts;
db_opts.create_if_missing = true;
db_opts.max_background_jobs = 4; // 提升后台压缩并发
db_opts.bytes_per_sync = 1 << 20; // 每 1MB fsync,均衡性能与一致性
三、ColumnFamilyOptions(列族级,核心性能项)
| 选项 | 默认(约) | 说明 |
|---|---|---|
write_buffer_size | 64 MB | 单个 memtable 大小上限 |
max_write_buffer_number | 2 | 保留的 memtable(含 immutable) 数量,内存压力时触发 flush |
min_write_buffer_number_to_merge | 1 | 最小合并的 memtable 数 |
level0_file_num_compaction_trigger | 4 | L0 文件数达此值触发 compaction |
level0_slowdown_writes_trigger | 20 | L0 文件数达此值写变慢(背压) |
level0_stop_writes_trigger | 36 | L0 文件数达此值停止写入(落 memtable) |
max_bytes_for_level_base | 256 MB | L1 目标大小(多由 write_buffer 推导) |
max_bytes_for_level_multiplier | 10 | 相邻层大小放大倍数 |
target_file_size_base | 64 MB | 目标 SST 文件大小基线 |
compression | kLZ4Compression 等 | 压缩算法 |
bottommost_compression | 默认同上 | 最底层压缩(常换更强压缩) |
compaction_style | kCompactionStyleLevel | 压缩策略:Level / Universal / FIFO |
prefix_extractor | 随版本 | 前缀提取器(前缀查询优化) |
应往大调 / 往小调的典型
rocksdb::ColumnFamilyOptions cf;
// 大写入量:调大写缓冲与目标文件
cf.write_buffer_size = 256 << 20; // 256 MB
cf.max_write_buffer_number = 4;
cf.target_file_size_base = 256 << 20;
cf.max_bytes_for_level_base = 512 << 20;
// 读多:Bloom 过滤器 + 调大 L0 触发,避免频繁压缩
四、ReadOptions(读)
| 选项 | 默认 | 说明 |
|---|---|---|
verify_checksums | true | 读时校验数据页校验和 |
fill_cache | true | 命中数据是否写入 BlockCache |
readahead_size | 1<<17 | 顺序读预读字节 |
iterate_upper_bound / iterate_lower_bound | 空 | 迭代器上下限,限定遍历范围 |
auto_prefix_mode | false | 前缀布伦过滤优化 |
snapshot | 空 | 指定读快照 |
示例:
rocksdb::ReadOptions ro;
ro.readahead_size = 1 << 20; // 顺序扫描加大预读
std::string v;
db->Get(ro, "key", &v);
五、WriteOptions(写)
| 选项 | 默认 | 说明 |
|---|---|---|
sync | false | true = 每次写同步刷盘(更安全更慢) |
disable_wal | false | true = 关闭 WAL,仅适合可容忍数据丢失的降低延迟场景 |
no_slowdown | false | true = 遇限流立刻失败而非阻塞 |
rocksdb::WriteOptions wo;
wo.sync = true; // 事务级落盘
db->Put(wo, "key", "value");
六、核心运行时对象
6.1 BlockCache(读缓存)
L0/L1+ 数据块缓存,默认 8 MB 的 LRU:
rocksdb::BlockBasedTableOptions table;
table.block_cache = rocksdb::NewLRUCache(1 << 30); // 1 GB
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table));
6.2 Memtable(写缓冲)
默认 skip-list 内存表,write_buffer_size 控制大小;海量写可换 Hash 前缀隔离。
6.3 Compaction(LSM 层级压缩)
kCompactionStyleLevel:默认,逐层合并压缩。kCompactionStyleUniversal:大文件覆盖写,适合吞吐型。kCompactionStyleFIFO:TTL/大小淘汰,适合缓存型。- 用
level0_file_num_compaction_trigger/max_bytes_for_level_multiplier控制节奏。
6.4 Bloom 过滤器
加速判断 key 不存在,减少读放大:
table.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10));
// 10 = 每键约 10 bit,假阳性 ~1%
6.5 WAL(预写日志)
每次写先写 WAL 再写 memtable;skip-wal 场景用 disable_wal,可靠性场景保持默认。
七、查看统计与实时配置
可在运行时读取统计字符串排查读写情况(供《RocksDB 工具与使用示例》参考):
std::string stat;
db->GetProperty("rocksdb.stats", &stat);
std::cout << stat << std::endl;
常见 property 键:rocksdb.stats、rocksdb.num-immutable-mem-table、rocksdb.cur-size-active-mem-table、rocksdb.level-files-count。
八、常见问题(FAQ)
1. 写放大高怎么压?
调大 write_buffer_size + level0_file_num_compaction_trigger,或改 Universal 压缩,适度放宽 max_bytes_for_level_multiplier。
2. 内存常超?
write_buffer_size * max_write_buffer_number 是写路径内存主约束;BlockCache 单独用 block_cache 预算。调小二者控内存。
3. 读延迟高?
启 Bloom 过滤器、调大 block_cache、避免 verify_checksums 频繁校验;可用 CompactionFilter 整理。
4. 版本默认值以谁为准?
各参数默认值随版本演进(如 write_buffer_size 由旧 64MB 版本稳定),务必以当前版本 include/rocksdb/options 头文件与实际 GetProperty 输出为准,本文默认值供参考。
九、小结
RocksDB 性能高度依赖配置:write_buffer_size/max_write_buffer_number 控制写缓冲,block_cache/Bloom 控制读路径,level0_*/max_bytes_for_level_multiplier 控制 Compaction,sync/disable_wal 决定安全与延迟。结合《RocksDB 源码编译安装指南》与《RocksDB 工具与使用示例》的 db_bench/ldb 即可观察并调优。