MyRocks_zh_doc

my.cnf 配置参数设置

MyRocks配置示例用于linkbench以外的用途

[mysqld]
rocksdb
default-storage-engine=rocksdb
skip-innodb
default-tmp-storage-engine=MyISAM
binlog_format=ROW
collation-server=latin1_bin
transaction-isolation=READ-COMMITTED

rocksdb_max_open_files=-1
rocksdb_max_background_jobs=8
rocksdb_max_total_wal_size=4G
rocksdb_block_size=16384
rocksdb_block_cache_size=32G
rocksdb_table_cache_numshardbits=6

# rate limiter
rocksdb_bytes_per_sync=4194304
rocksdb_wal_bytes_per_sync=4194304
rocksdb_rate_limiter_bytes_per_sec=104857600 #100MB/s. Increase if you're running on higher spec machines

# triggering compaction if there are many sequential deletes
rocksdb_compaction_sequential_deletes_count_sd=1
rocksdb_compaction_sequential_deletes=199999
rocksdb_compaction_sequential_deletes_window=200000

# read free replication
rocksdb_rpl_lookup_rows=0

rocksdb_default_cf_options=write_buffer_size=128m;target_file_size_base=32m;max_bytes_for_level_base=512m;level0_file_num_compaction_trigger=4;level0_slowdown_writes_trigger=10;level0_stop_writes_trigger=15;max_write_buffer_number=4;compression_per_level=kLZ4Compression;bottommost_compression=kZSTD;compression_opts=-14:1:0;block_based_table_factory={cache_index_and_filter_blocks=1;filter_policy=bloomfilter:10:false;whole_key_filtering=1};level_compaction_dynamic_level_bytes=true;optimize_filters_for_hits=true;compaction_pri=kMinOverlappingRatio

linkbench的MyRocks配置示例

[mysqld]
rocksdb
default-storage-engine=rocksdb
skip-innodb
default-tmp-storage-engine=MyISAM
binlog_format=ROW
collation-server=latin1_bin
transaction-isolation=READ-COMMITTED

rocksdb_max_open_files=-1
rocksdb_max_background_jobs=8
rocksdb_max_total_wal_size=4G
rocksdb_block_size=16384
rocksdb_block_cache_size=32G
rocksdb_table_cache_numshardbits=6

# rate limiter
rocksdb_bytes_per_sync=4194304
rocksdb_wal_bytes_per_sync=4194304
rocksdb_rate_limiter_bytes_per_sec=104857600 #100MB/s

# triggering compaction if there are many sequential deletes
rocksdb_compaction_sequential_deletes_count_sd=1
rocksdb_compaction_sequential_deletes=199999
rocksdb_compaction_sequential_deletes_window=200000

# read free replication
rocksdb_rpl_lookup_rows=0

rocksdb_default_cf_options=write_buffer_size=128m;target_file_size_base=32m;max_bytes_for_level_base=512m;level0_file_num_compaction_trigger=4;level0_slowdown_writes_trigger=10;level0_stop_writes_trigger=15;max_write_buffer_number=4;compression_per_level=kLZ4Compression;bottommost_compression=kZSTD;compression_opts=-14:1:0;block_based_table_factory={cache_index_and_filter_blocks=1;filter_policy=bloomfilter:10:false;whole_key_filtering=0};level_compaction_dynamic_level_bytes=true;optimize_filters_for_hits=true;memtable_prefix_bloom_size_ratio=0.05;prefix_extractor=capped:12;compaction_pri=kMinOverlappingRatio

rocksdb_override_cf_options=cf_link_pk={prefix_extractor=capped:20};rev:cf_link_id1_type={prefix_extractor=capped:20}

调整技巧

字符集

* MyRocks使用区分大小写的排序规则(latin1_bin、utf8_bin、binary)提供更好的性能。

事务

* 建议使用Read Committed隔离级别。MyRocks的事务隔离级别实现与InnoDB不同,但接近PostgreSQL,PostgreSQL默认隔离级别是 Read Committed

压缩

* 在L0-1或L0-2设置kNoCompression(或kLZ4Compression)
* 在最底层,建议使用更强的压缩算法(Zlib或ZSTD)
* 如果使用zlib压缩,请将zZlibCompression设置在最底层(bottommost_compression)
* 如果使用zlib压缩,请相应地设置压缩级别。上面的示例(compression_opts = -14:1:0)
  使用zlib压缩级别 1、如果您的引用程序不是写入密集型,设置(compression_opts = -14:1:0)将提供更好的空间节省(使用zlib压缩级别6)
* 对于其他级别,请设置kLZ4Compression。

数据库,文件和压缩

* 设置 level_compaction_dynamic_level_bytes=true
* 设置正确的rocksdb_block_size(默认值为4096)。较大的块大小会减少空间,但会增加CPU开销,
  因为MyRocks必须解压缩更多的字节。空间和CPU使用之间存在权衡。
* 设置 rocksdb_max_open_files = -1 如果设置大于0,RocksDB仍然使用table_cache,每次访问该文件时都会锁定互斥锁。
  我认为你会看到-1有更大的好处,因为那时你不需要通过LRUCache来获得你需要的表。
* 设置合理的rocksdb_max_background_jobs
* 设置不小的target_file_size_base(通常32MB就足够了)。默认值为4MB
  通常大小而且创建的sst文件太多。太多的sst文件使操作更加困难。
* 设置速率限制器。如果没有速率限制器,压缩通常会在纯闪存上写入300 ~ 500MB/s,这可能会导致短暂停顿。
   在4x MyRocks测试中,每个实例40MB/s 的速率限制器给出了非常稳定的结果(来自iostat的峰值小于200MB/s)

布隆过滤器

* 配置Bloom Filter布隆过滤器 和 Prefix Extractor前缀提取器。建议使用完全过滤器(基于块的过滤器不适用于get()+前缀bloom)。
  可以为每个列族配置前缀提取器,并使用第一个prefix_extractor前缀提取器位作为键。
  如果使用一个BIGINT列作为主键。建议bloom过滤器大小为12(前4个字节用于内部索引id + 8个字节BIGINT)

* 配置Memtable bloom过滤器。Memtable Bloom过滤器有助于降低CPU使用率,如果您在rocksdb::MemTable::KeyComparaator中看到高CPU使用率。
  大小取决于Memtable大小。将 memtable_prefix_bloom_bits = 41943040设置为128MB 
  Memtable(30/128M = 4M keys键 * 每个keys键10位)

缓存

* 不要在rocksdb_default_cf_options(block_based_table_factory)中设置block_cache
  如果确实在默认列族上提供了块高速缓存大小,则不会对所有此类列族重用相同的高速缓存。
* 考虑设置共享写缓冲区大小(db_write_buffer_size)
* 考虑使用compaction_pri = kMinOverlappingRatio来减少对压缩的写入。

验证参数

要验证配置是否正确,请查看LOG文件和搜索参数名称。LOG文件位于$datadir/.rocksdb/LOG.