MySQL毫无疑问是当前OLTP领域的霸主,最新的MySQL 8.0版本更是能够轻松跑出百万QPS。

在KV内存领域,虽然这些年Redis风头正劲,但老大哥Memcached凭借其多线程的特性,依然牢牢占据一定的市场份额。

打开网易新闻 查看精彩图片

在前一篇文章:震惊!MySQL 8.0 220W QPS轻松达成,我们已经利用MySQL的Memcached Plugin插件跑出了220万的QPS,通过Memcached协议访问MySQL,然后读取InnoDB存储引擎中的数据。

所以,完全可以将MySQL数据库打造成一个KV数据库

那么,既然都是KV,MySQL KV和Memcached KV,谁的性能更好呢?

好了,这次安排~~~

业界没有好用的Memcached基准测试程序,所以,这次还是使用之前自己写的my_test测试程序,测试分为三种场景:

  1. 只读:Get 请求;
  2. 只写:Set 请求;
  3. 读写:Get、Set请求,读写比例 5:1;

只读测试是内存KV数据库的强项,但是我们的MySQL已经跑出了220万QPS,所以MySQL能否挑战Memcached呢?最后的结果如下所示:

打开网易新闻 查看精彩图片

可以看到Memcached非常强悍,在128个线程下可以跑到超过400万的QPS。

对比MySQL,虽然使用KV接口减少了SQL解析的开销,使用InnoDB的自适应哈希索引提升性能,但B+树的数据结构,依然无法匹敌Memcached。128线程下,MySQL的性能约280万。

只读测试让我有些郁闷,即便自适应哈希索引加持,MySQL依然无法战胜Memcached。性能差不多为Memcached只读测试的70%。

本以为接下去的测试会是一边倒的情况,没想到,只写测试,Memcached“翻车”了!!!

打开网易新闻 查看精彩图片

可以看到 Memcached 在Set只写测试中,8线程能够跑出35万的QPS,但是随着线程的增加,性能不断下降。反复测试,结果依然如此。

对比MySQL,在32线程下可以取得18万的Set结果。要知道这时,MySQL有事务的保障,需要有额外的开销。

这一轮,虽然Memcached的极限性能值更高,但是MySQL的表现更为平稳,并且有事务保障,数据不会丢失。这一轮,MySQL胜。

最后,我们来看看混合读写测试场景,大多KV数据库用于读多写少的场景,这里我们测试选择读写比例5:1,读取比例超过80%。最后的测试结果为:

打开网易新闻 查看精彩图片

测试结果与只写测试类似,在低并发下,Memcached优势明显,高并发下MySQL后来居上。极限值Memcached可以达到近100万的QPS,MySQL 32线程下表现最佳,性能可达62万QPS。

上述测试,我们都是将MySQL当作事务型内存KV在和Memcached对比。
如果允许MySQL侧降低事务的要求,荣仍数据的丢失,那么我们还可以对MySQL Memcached Plugin做如下的配置:

daemon_memcached_enable_binlog = OFF

skip_log_bin = 1innodb_flush_log_at_trx_commit = 0

loose_daemon_memcached_r_batch_size = 10

loose_daemon_memcached_w_batch_size = 10

transaction_isolation = READ-UNCOMMITTED

上面的配置中关闭了二进制日志的写入,然后将重做日志的刷新设置为每秒1次。接着就是比较魔幻的几个参数。

首先,在KV层设置为读写发生10次才提交一次,进一步降低刷盘频率。由于每10次写入才提交一次,因此需要将事物隔离级别设置为READ-UNCOMMITTED,这样才能读取到未提交的数据!

最后,我们还能继续降低写的频率,即通过下面的命令关闭InnoDB层的redo日志写入:

mysql > ALTER INSTANCE disable InnoDB redo_log;

这样在SET的过程中,没有任何二进制日志和重做日志的写入,进一步提升了MySQL Memcached Plugin在Set下的性能表现,最终SET的测试结果如下所示:

打开网易新闻 查看精彩图片

Memcached Plugin+就是启用“黑科技”后的MySQL性能,可以看到SET下性能得到了大幅提升,32、64线程极限值可达到48万+的QPS。

当然,取得上述性能的表现是因为我们牺牲了数据安全性!!!

最后,我再抛几个思考题给同学:

1. 目前还是有脏页刷新磁盘的问题,如何不修改内核将MySQL打造一个纯内存KV数据库?

2. 如何修改InnoDB层内核代码,将MySQL打造成段页式全内存数据库。其性能又能达到多少?

可以看到,即便开启事务安全的配置,将MySQL打造成KV的性能是完全不输原生Memcached的,在写场景和混合读写场景都能比原生Memcached更好的表现。

Memcached的优势在于他需要的资源更少,但他的缺点是他只能做KV操作。而将InnoDB表映射为KV访问,则不但能提升MySQL数据库的性能,也能利用MySQL的事务特性、复制功能、SQL查询等功能,而这是传统KV数据库所不具备的能力。

BTW,你们的线上内存KV性能多少?一般也就5-10W QPS吧,所以,真的需要Memcached么?

仔细想想,是不是都是错误的架构!!!

科学尚未普及。

希望各位粉丝看完后点击右下角的“点赞”,以示鼓励。长期坚持原创很不容易,多次想放弃。坚持是一种信仰,专注是一种态度,一路陪伴,一起星辰大海。