本文是作者工作中需要对atlas(360开源的MySQL中间件,可实现读写分离、分表、多从库负载均衡)进行测试时所设计和采用的一套脚本。由于对atlas测试,要测试对比的维度较多,脚本也相对复杂,这里我将脚本简化为适用于简单的mysql压测(当然若有同样需求的亲,作者也会将脚本共享,一起探讨哦)。总体思路如下:
准备测试数据(这步在脚本之外)----运行脚本测试(多线程,测试多次)----脚本对每次测试输出过滤并格式化后写入数据库----脚本通过sql语句将结果直观展示出来(该结果很容易导入excel,绘制趋势图)
其实我承认这个标题写的有些“大了”,该套脚本并未实现完全自动化的实现准备数据、测试、分析、绘图的整个流程(关于绘图,gnuplot完全可以基于格式化的分析结果自动绘制出趋势图。这个惭愧,小主没搞定啊~~)
下面为“测试”和“分析”的使用截图,将分析结果粘贴到记事本然后导入到excel即可绘制趋势图。
接下来说说sysbench-0.5,对于数据库的测试较0.4版本有较大不同,之前有内建的--test=oltp方法,现在改成了外部的lua脚本形式,这样更灵活,也方便用户构建自己的测试模型。
这些相关的lua脚本位于”/usr/share/doc/sysbench/tests/db/“ 目录,其内脚本如下图所示
我们需要了解我们最有可能用到的三个脚本:common.lua(公共脚本)、oltp.lua(oltp测试主脚本)和parallel_prepare.lua(并行准备数据)。common.lua中定义了一些选项的默认值(故而,这些选项的值既可以通过命令行指定也可直接修改该脚本里对应值来更改).
简单说一下oltp.lua脚本的逻辑:
默认通过显式的使用begin和commit语句将如下模式的sql组合在一起形成一个事务(只读测试的话则没有写请求),然后将此事务循环执行oltp_table_size次(若没有指定,则为10000次)。也就是如果测试命令中不加--oltp-table-size=,则只读测试共14w请求,混合测试18w请求。若觉得数量不够,可以设置--oltp-table-size=100000或者更高。
10条 SELECT c FROM sbtest6 WHERE id=5047;
1条 SELECT c FROM sbtest16 WHERE id BETWEEN 5050 AND 5050+99;
1条 SELECT SUM(K) FROM sbtest7 WHERE id BETWEEN 5039 AND 5039+99;
1条 SELECT c FROM sbtest7 WHERE id BETWEEN 4987 AND 4987+99 ORDER BY c;
1条 SELECT DISTINCT c FROM sbtest7 WHERE id BETWEEN 13 AND 13+99 ORDER BY c;
1条 UPDATE sbtest1 SET k=k+1 WHERE id=1234;
1条 UPDATE sbtest2 SET c='78864443858-59732318638' where id=2345;
1条 DELETE FROM sbtest11 WHERE id=4958;
1条 INSERT 语句;
以上是通过lua脚本里总结出来的,各位也可查看下这些lua脚本,来更好的理解测试的逻辑过程。
一般来说,对MySQL做压测会基于两种需求:
一种是通过压测来大致评估MySQL实例的最大能力,这种适合给定时长来测;
另一种就是来对比某些改动前后的性能变化(如版本升级、参数调整等),这种适合给定请求数来测。
以作者的小经验来看,后者要更多一些,所以我的测试模式也是趋向于后者的。
前提功课做好了,接下来一起看一下本例的测试过程
准备数据:
在被测的两台mysql上分别执行
#以8线程并发创建16张50w数据的表 sysbench --test=/usr/share/doc/sysbench/tests/db/parallel_prepare.lua \ --mysql-table-engine=innodb --oltp-table-size=500000 --mysql-user=user \ --mysql-password='passwd' --mysql-port=3306 --mysql-host=192.168.1.33 \ --oltp-tables-count=16 --num-threads=8 run还有另外一种方式,用oltp.lua脚本以串行方式准备数据
sysbench --test=/usr/share/doc/sysbench/tests/db/oltp.lua --mysql-table-engine=innodb \ --oltp-table-size=500000 --mysql-user=user --mysql-password='passwd' \ --mysql-port=3306 --mysql-host=192.168.1.33 --oltp-tables-count=16 prepare开始测试:
sh /root/shells/mysql_oltp_test.sh test read-only 192.168.1.44 3306 user passwd