【数据库评测报告】MyRocks VS MySQL57

导语

facebook 开源了他们的 Zstandard 压缩算法和 MyRocks 存储引擎,ZSTD 压缩算法志在取代当前普遍使用的的 zlib 压缩技术,而MyRocks 是基于 rocksdb 引擎嵌入到 MySQL5.6的一个分支,在 facebook 内部用作提升存储效率。那么,这个整合后的引擎性能如何呢,本周OMG-DBA 团队第一时间进行了调研。

一、MyRocks和MySQL的关系

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的平响

  • MySQL57开启表压缩后对写入性能损耗较大;1000并发时,与不开压缩相比,写入性能差别在500倍(因压缩和并发线程争抢综合因素)
  • MyROCKS开启压缩前后对写入性能差别较小
  • 并发对MyROCKS的读取影响大于MySQL57
  • 当并发低于50时候,MyROCKS写入性能略优于MySQL57
  • 随着并发增大,MyROCKS写入性能损耗严重
  • 较高并发下(并发大于50),MyROCKS写入性能远不及MySQL57

(二)、读取性能对比:

样本配置:57不开启压缩、57开启zlib压缩(压缩级别为最严格的第9级,relog刷盘参数设置为0)、rocks不开启压缩、rocks开启zlib压缩(压缩级别为默认设置)

结果图示:横轴为测试的并发数,纵轴为往4类样本表中查询sql的平响

  • MySQL57开启表压缩后对读取性能影响也比较大;1000并发时,与不开压缩相比,写入性能差别在30倍
  • MySQL57开启表压缩,对读写性能损耗均比较大;且对写入性能的影响远大于读取性能
  • MyROCKS开启压缩前后对读取性能差别较小
  • 并发对MyROCKS的读取影响大于MySQL57
  • 当并发低于200时,MyROCKS的读取性能优于MySQL57;
  • 随着并发增大,MyROCKS读取性能也损耗严重
  • 高并发下(并发大于200),MyROCKS读取性能也远不及MySQL57

(三)、数据空间对比方面:

样本配置:57开启zlib压缩(压缩级别为最严格的第9级,relog刷盘参数设置为0)、rocks开启zlib压缩(key_block_size设置为4k)、rocks开启zlib压缩(key_block_size设置为16k)

结果图示:横轴为导入的数据量,纵轴为数据磁盘占有量(单位为MB)

说明:因为MySQL57支持的透明页压缩算法依赖于hole punching技术和稀疏文件技术,而当前系统内核过低,因此本次只针对MyRocks和MySQL57的表压缩性能做测试。

  • MySQL57压缩效果较好,压缩前后磁盘占有量比例约1:2.6,即压缩后能减少60%的存储
  • MyROCKS默认ZLIB压缩效果较差。几乎和不开启压缩时磁盘占用量相当(怀疑是测试环境问题,这点待确认)
  • MyROCKS在不开启压缩时,存储成本高于MySQL57
  • 随着单表数据量增大,在不开压缩时,MyROCKS的存储成本增长速率高于MySQL57

三、测试总结:

通过第二部分的测试和分析,我们得出如下结论:

  • MySQL57的表压缩技术,对读写的性能损耗都比较大
  • MySQL57的表压缩技术,能降低约60%的磁盘存储
  • MyROCKS在高并发下的表现,并没有预期的那么强劲,尤其是在200并发以后,写入和读取性能均下降明显
  • MyROCKS不开启压缩时候,存储成本高于MySQL57

基于如上测试结论,我们建议:

  • MySQL57的表压缩技术适用于对读写要求不高,但对磁盘利用率要求搞的场景
  • MyROCKS在不开启压缩时,若出现单表数据量大于5G,无论从存储上还是读写性能,均不如选择MySQL57
  • MyROCKS的默认ZLIB压缩效果,与预期差距很大,暂不做建议。

四、其他测试细节步骤:

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云技术分享

快照是什么?揭秘存储快照的实现

存储网络行业协会SNIA(StorageNetworking Industry Association)快照的定义:关于指定数据集合的一个完全可用拷贝,该拷贝包...

49025
来自专栏IT技术精选文摘

Paxos协议学习小结

一直对Paxos协议比较感兴趣,之前对这个算法 有耳闻 但只是了解皮毛,最近在学Zookeeper,趁着这股新鲜劲,就花时间研究了下Zookeeper的选举算法...

23310
来自专栏菩提树下的杨过

ActiveMQ笔记(4):搭建Broker集群(cluster)

上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的b...

2199
来自专栏码洞

一个Raft开源项目的结构分析

Raft声称是一种易于理解的分布式一致性算法。有不少工程师们翻了它的论文,参考了很多资料,最后只好怀疑自己是不是智商有问题。

972
来自专栏张秀云的专栏

Spider 引擎分布式数据库解决方案(最全的 spider 教程)

最近开始负责财付通的数据库的相关维护工作,其中有几套系统使用的 spider 引擎,本文将 spider 引擎的功能、使用场景、部署、实战测试等做个简单的总结。

9130
来自专栏搜云库

Spring Cloud(一)服务的注册与发现(Eureka)

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控...

21210
来自专栏信达雅

用 Erlang 和 VoltDB 玩转 877,000 TPS

在一台合理配置的 EC2 下(详见下文),使用我们全新的 VoltDB Erlang 驱动程序,我们实现了 877,519 TPS。

3016
来自专栏北京马哥教育

常用集群架构实战练习篇

一、简介 企业中常用的web架构主要的目的是实现高可用及其容灾备份,说白了就是让用户有更好的用提体验,一个架构的可用性只有在经历过上线后接受用户的使用才能体现...

4216
来自专栏流柯技术学院

性能测试学习之一 ——性能测试指标

Virtual user,模拟真实业务逻辑步骤的虚拟用户,虚拟用户模拟的操作步骤都被记录在虚拟用户脚本里。Vuser脚本用于描述Vuser在场景中执行的操作。

1283
来自专栏KaliArch

记一次混合监控的反思

作为最底层的技术人员,目前由于有客户在运维中遇到混合架构,公有云上使用了产品级别Redis数据库,同时由于业务在云服务器和kubnets的容器内也有redis数...

1065

扫码关注云+社区