facebook 开源了他们的 Zstandard 压缩算法和 MyRocks 存储引擎,ZSTD 压缩算法志在取代当前普遍使用的的 zlib 压缩技术,而MyRocks 是基于 rocksdb 引擎嵌入到 MySQL5.6的一个分支,在 facebook 内部用作提升存储效率。那么,这个整合后的引擎性能如何呢,本周OMG-DBA 团队第一时间进行了调研。
MySQL是一个当前使用最广泛、且支持插件式存储引擎的开源数据库。我们常用的MySQL引擎有:InnoDB、MyISAM等;而MyRocks是 facebook 将他们自己的修改后的RocksDB引擎嵌入到MySQL56中实现的。
MyRocks基于RocksDB引擎,不同于基于B+tree组织方式的InnoDB引擎,RocksDB是基于LSM方式组织数据的,这种append only的写入方式,很少出现随机io的情况,是在内存merge之后才写入,写入放大较小;在压缩方面,MySQL5.7之后实现了透明页压缩技术,压缩之后的页对齐会导致压缩效率降低,虽然MyRocks也是页压缩,但不用页对齐(存储的SST文件需要与操作系统对齐,但因SST size是2M,和InnoDB的单页16k相比,这里的SST文件级别对齐对压缩效率的影响可忽略不计),除此之外,MyRocks还在索引层面实现了2点来减少存储开销:Prefix Key Encoding 技术(索引中前缀相同的不重复存储)和 Zero-filling row metadata 技术(压缩索引中额外表示的seqid)。
因此,MyRocks整体上被描述为一个写入性能、存储效率均优于InnoDB的新引擎。但具体性能如何,下面我们一探究竟。
本文主要分3个方面进行对比:1.写入性能;2读取性能;3.压缩性能;
说明:因MyROCKS为facebook内部使用的分支版本,外部公开资源较少,因此本次测试上有如下几方面的局限:
1、最新的ZSTD压缩算法,可以编译进MyROCKS中,但不能通过DDL指定压缩算法使用,因此MyROCKS的压缩只能针对原生的ZLIB压缩算法做测试。
3、MySQL57版本,同时支持传统表压缩技术和透明页压缩技术,但透明页压缩技术依赖于内核版本和文件系统的稀疏文件特性和打孔技术,当前测试机环境不能满足,因此MySQL57的压缩只能针对透明表压缩技术进行测试。
(一)、写入性能对比
样本表配置:57不开启压缩、57开启zlib压缩(压缩级别为最严格的第9级,relog刷盘参数设置为0)、rocks不开启压缩、rocks开启zlib压缩(压缩级别为默认设置)
结果图示:横轴为测试的并发数,纵轴为往4类样本表中写入sql的平响
(二)、读取性能对比:
样本配置:57不开启压缩、57开启zlib压缩(压缩级别为最严格的第9级,relog刷盘参数设置为0)、rocks不开启压缩、rocks开启zlib压缩(压缩级别为默认设置)
结果图示:横轴为测试的并发数,纵轴为往4类样本表中查询sql的平响
(三)、数据空间对比方面:
样本配置:57开启zlib压缩(压缩级别为最严格的第9级,relog刷盘参数设置为0)、rocks开启zlib压缩(key_block_size设置为4k)、rocks开启zlib压缩(key_block_size设置为16k)
结果图示:横轴为导入的数据量,纵轴为数据磁盘占有量(单位为MB)
说明:因为MySQL57支持的透明页压缩算法依赖于hole punching技术和稀疏文件技术,而当前系统内核过低,因此本次只针对MyRocks和MySQL57的表压缩性能做测试。
通过第二部分的测试和分析,我们得出如下结论:
基于如上测试结论,我们建议:
1、软硬件配置:
描述 | 详细参数 | |
---|---|---|
硬件 | TS90机型: 2个12核CPU256G内存12*800G SSD万兆网卡 | |
软件-数据库1 | MyRocks(基于MySQL5.6) | [mysqld]basedir=/data/webroot/myrocksandmysql57/myrocksdatadir=/data/webroot/myrocksandmysql57/myrocks/var/port=3701socket =/data/webroot/myrocksandmysql57/myrocks/tmp/mysql.sockpid-file =/data/webroot/myrocksandmysql57/myrocks/var/mysql.pidmax_connection=10000rocksdbdefault-storage-engine=rocksdbskip-innodbdefault-tmp-storage-engine=MyISAMbinlog_format=ROWcollation-server=latin1_bintransaction-isolation=READ-COMMITTEDrocksdb_max_open_files=-1rocksdb_base_background_compactions=1rocksdb_max_background_compactions=8rocksdb_max_total_wal_size=4Grocksdb_max_background_flushes=4rocksdb_block_size=16384rocksdb_block_cache_size=32Grocksdb_table_cache_numshardbits=6# rate limiterrocksdb_bytes_per_sync=4194304rocksdb_wal_bytes_per_sync=4194304rocksdb_rate_limiter_bytes_per_sec=104857600 #100MB/s# triggering compaction if there are many sequential deletesrocksdb_compaction_sequential_deletes_count_sd=1rocksdb_compaction_sequential_deletes=199999rocksdb_compaction_sequential_deletes_window=200000rocksdb_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_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_bits=41943040;memtable_prefix_bloom_probes=6;prefix_extractor=capped:12rocksdb_override_cf_options=cf_link_pk={prefix_extractor=capped:20};rev:cf_link_id1_type={prefix_extractor=capped:20}#ali tunningrocksdb_skip_unique_check=1rocksdb_commit_in_the_middle=1rocksdb_write_disable_wal=1rocksdb_max_background_flushes=40rocksdb_max_background_compactions=40 |
软件-数据库2 | MySQL5.7.13 | [mysqld]basedir = /data/webroot/myrocksandmysql57/mysql57datadir = /data/webroot/myrocksandmysql57/mysql57/var/port = 3700 server_id = 110socket = /data/webroot/myrocksandmysql57/mysql57/tmp/mysql.socklog-error = /data/webroot/myrocksandmysql57/mysql57/var/mysql.errinnodb_compression_level=9default-storage-engine=INNODBpid-file = /data/webroot/myrocksandmysql57/mysql57/var/mysql.pidskip-external-lockingkey_buffer_size = 2048Mmax_allowed_packet = 128Mmax_binlog_size=1024Mmax_connect_errors=99999999999sort_buffer_size=8M#thread_stack = 192K#thread_cache_size = 8user = webrootmax_connections = 20000sort_buffer_size = 4Mjoin_buffer_size = 4Mquery_cache_limit = 1Mquery_cache_size = 16Mexpire_logs_days = 10max_binlog_size = 100M innodb_buffer_pool_size=20480Minnodb_thread_concurrency = 8innodb_flush_method = O_DSYNCinnodb_flush_log_at_trx_commit = 0innodb_lock_wait_timeout=50innodb_log_files_in_group = 4innodb_log_file_size = 256Minnodb_log_buffer_size = 32Minnodb_file_per_table = 1innodb_table_locks = 0innodb_read_io_threads=48innodb_write_io_threads=48innodb_thread_concurrency=1000interactive_timeout=86400skip-name-resolveslow_query_log=1enforce_gtid_consistency=ongtid_mode=on#thread_handling=pool-of-threads#thread_pool_size=10# Remove leading # to set options mainly useful for reporting servers.# The server defaults are faster for transactions and fast SELECTs.# Adjust sizes as needed, experiment to find the optimal values.# join_buffer_size = 128M# sort_buffer_size = 2M# read_rnd_buffer_size = 2Msql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO |
2、测试工具:
mydbtest是阿里开源的一个数据库压测工具,支持定制化SQL和表结构。
示例配置文件: option name mysql_test loop 25000 user mydbtest/mydbtest@10.62.19.103:3700:mysqlslap declare a int 10 30000 id0 char 1 32 id1 char 1 32 charcol1 char 512 1024 intcol1 int 1 10000000 intcol2 int 1 10000000 intcol3 int 1 10000000 begin insert into tmp_nocompress set id0 = :id0 ,id1 = :id1 , intcol1 = :intcol1 , intcol2 = :intcol2 , intcol3 = :intcol3 ; insert into tmp_lz4compress set id0 = :id0 ,id1 = :id1 , intcol1 = :intcol1 , intcol2 = :intcol2 , intcol3 = :intcol3 ; end
使用方法:./mydbtest_linux64.bin query=conffile degree=200
https://github.com/facebook/mysql-5.6/wiki/Build-Steps https://github.com/facebook/mysql-5.6/wiki/MyRocks-advantages-over-InnoDB
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。