官方推荐的参数文件配置:
[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=1G
rocksdb_block_size=16384
rocksdb_block_cache_size=2G
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}
调优建议:
1.字符集:
MyRocks使用大小写敏感的校验规则性能更佳,如latin1_bin, utf8_bin, binary。
在国内由于emoji字符支持的需求,使用utf8mb4字符集,校验规则则建议使用utf8mb4_bin。
2.事务:
推荐配置的事务隔离级别为Read Committed。MyRocks的事务实现是不同于InnoDB的,
但是比较接近Postgresql,Postgresql的默认事务隔离级别是Read Committed。
3.压缩:
1.设置kNoCompression或者kLZ4Compression使用L0-1 or L0-2。
2.处于最低级别(bottommost level)推荐使用更强的压缩算法如Zlib或者ZSTD
若使用zlib压缩设置kZlibCompression 使用最低级别(bottommost_compression)
若使用zlib压缩,需要设置相应的压缩级别。
compression_opts=-14:1:0则表示使用压缩级别为1;
compression_opts=-14:6:0则表使用压缩级别为6,适用写不紧张的应用并且可以节省更多空间。
设置了kLZ4Compression则使用其他压缩级别。
4.数据块、文件和compactions:
1.level_compaction_dynamic_level_bytes=true
2.设置合适的rocksdb_block_size值,默认是4096.
较大的块尺寸会减少空间但会增加CPU开销,因为MyRocks必须解压缩更多的字节。
因此需要权衡空间和CPU使用。
3.设置合理的rocksdb_max_background_jobs值
4.设置rocksdb_max_open_files=-1。
若设置此值大于0则 当你每次访问该文件时都会锁定互斥锁,RocksDB会一直使用table_cache。
设置为-1回更好,因为你不需要通过LRUcache访问表。
5.target_file_size_base值不要设置的太小,默认是4M,32M通常是足够的。4M对于MyRocks来说
通常太小了回创建很多的sst文件,太多的sst文件会让操作变得困难。
6.设置rate limiter。若没有设置rate limiter ,在纯闪存设备上每当写速度 300--500MB/s的时候回频繁的
压缩(compaction),这将导致短暂的停顿。在单主机4实例的MyRocks测试中 的速率限制40MB/s 每实例的限制表现
了很稳定的结果(iostat查看的峰值小于200MB/s)
5.Bloom 过滤器:
1.配置bloom filter 和前缀提取器(Prefix Extractor).
推荐使用full filter ,Block based filter does not work for Get() + prefix bloom.
Prefix extractor可以被配置到每个column family 并且使用第一个Prefix extractor bits 作为键。
若使用bigint列作为主键,推荐使用bloom filter的大小为12(前4位作为内部索引+8位bigint)
2.配置Memtable bloom filter。若你看到 rocksdb::MemTable::KeyComparator检查到高CPU利用率,
在配置Memtable bloom filter对于减少CPU利用率很有帮助。Memtable bloom filter的大小依赖于
Memtable的大小。
推荐设置
memtable_prefix_bloom_bits=41943040 for 128MB Memtable (30/128M=4M keys * 10 bits per key)
6.缓存:cache
1.不要在rocksdb_default_cf_options参数中设置block_based_table_factory值,
若设置了快缓存大小 在默认的column family,在所有的column family 上相同的cache就不能重用。
2.考虑设置db_write_buffer_size,共享写缓存大小。
3.考虑设置 compaction_pri=kMinOverlappingRatio,在compaction写的更少一些。
参数验证:
为了验证参数设置的是否正确,可以在$datadir/.rocksdb/log查看日志文件,用参数名搜索。
参考:
https://github.com/facebook/mysql-5.6/wiki/my.cnf-tuning
https://www.percona.com/blog/2018/02/01/myrocks-engine-things-know-start/
https://www.percona.com/blog/2018/04/30/a-look-at-myrocks-performance/