1、MyCAT 性能测试指南首先参考 MyCAT 性能调优,确保整个系统达到最优配置。性能测试,建议先小规模压力预热 10-20 分钟,这是众所周知的 Java 的特性,越跑越快。测试的硬件和网络条件: 建议至少 3 台服务器: MyCAT Server 一台 Mysql 一台 带宽应该是至少 100M,建议千兆 压力程序在另一台,压力程序的机器也可以由性能差的机器来代替。有条件的话,分片库在不同的 MYSQL 实例上,如 20 个分片,每个 MYSQL 实例 7个分片,而且最好有多台 MYSQL 物理机。分片表的录入性能测试-T01测试案例:分片表的并发录入性能测试,测试 DEMO 中的 tra
2、velrecord 表,此表的基准DDL 语句: create travelrecord: create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);此表的标准分片方式为基于 ID 范围的自动分片策略。Schema.xml 中配置如下:默认是 3 个分片,分片 ID 范围定义在 autopartition-long.txt 中,建议修改为以下或更大的数值范围分片,每个分片 500 万数据# range start-en
3、d ,data node index0-2000000=02000001-4000000=14000001-6000000=2根据自己的情况,可以每个分片放更多的数据,进行对比性能测试,当分片 index 增加时,注意dataNode 也增加(dataNode=“dn1,dn2,dn3“)。测试的输入参数如下jdbcurl user password threadpoolsize recordrange:Jdbcurl:连接 mycat 的地址,格式为 jdbc:mysql:/localhost:8066/TESTDB User 连接 Mycat 的用户名Password:密码Threadpo
4、olsize:并发线程请求,可以在 50-2000 左右调整,看看哪种情况下的性能最好Recordrang:插入的分片系列以及对应的 ID 范围,minId-maxId 然后逗号分开,对应多组分片的ID 范围,如 0-200000,200001-400000,400001-600000,跟分片配置保持一致。 测试过程:每次测试,建议先执行重建表的操作,以保证测试环境的一致性:连接 mycat 8066 端口,在命令行执行下面的操作:drop table travelrecord;create table travelrecord (id bigint not null primary key,
5、user_id varchar(100),traveldate DATE, fee decimal,days int);先预测试:执行命令:test_stand_insert_perf jdbc:mysql:/localhost:8066/TESTDB test test 100 “0-100M,100M1-200M,200M1-400”MyCAT 温馨提示:并发线程数表明同时至少有多少个 Mysql 连接会被打开,当 SQL 不跨分片的时候,并发线程数=MYSQL 连接数,在 Mycat conf/schema.xml 中,将 minCon 设置为=并发连接数,这种情况下重启 MYCAT,会
6、初始建立 minCon 个连接,并发测试结果更好,另外,也可以验证是否当前内存设置,以及 MYSQL 是否支持开启这么多连接,若无法支持,则 logs/mycat.log 日志中会有告警错误信息,建议测试过程中 tail f logs/mycat.log 观察有无错误信息。另外,开启单独的 Mycat 管理窗口, mysql utest ptest P9066 然后运行 show datasource 可以看到后端连接的使用情况。Show threadpool 可以看线程和 SQL 任务积压的情况。也可以同时启动多个测试程序,在不同的机器上,并发进行测试,每个测试程序写入一个分片的数据范围,对
7、于 1 个亿的数据插入测试来说,可能效果更好,毕竟单机并发线程 50 个左右已经差不多极限: test_stand_insert_perf jdbc:mysql:/localhost:8066/TESTDB test test 100 “0-100M” test_stand_insert_perf jdbc:mysql:/localhost:8066/TESTDB test test 100 100M1-200M”全局表的查询性能测试 T02:全局表自动在多个节点上同步插入,因此其插入性能有所降低,这里的插入表为 goods 表,执行的命令类似 T01 的测试。温馨提示:全局表是同时往多个分片
8、上写数据,因此所需并发 MYSQL 数连接为普通表的 3 倍,最好的模式是全局表分别在多个 mysql 实例上。建表语句:drop table goods;create table goods(id int not null primary key,name varchar(200),good_type tinyint,good_img_url varchar(200),good_created date,good_desc varchar(500), price double);test_globaltable_insert_perf.bat jdbc:mysql:/localhost:80
9、66/TESTDB test test 100 1000000本机笔记本,4G 内存,数据库与 Mycat 以及测试程序都在一起,跑出来每秒 1000 多的插入速度:分片表的查询性能测试 T03:此测试可以在 T01 的集成上运行,先生成大量 travelrecord 记录,然后进行并发随机查询,此测试是在分片库上,基于分片的主键 ID 进行随机查询,返回单条记录,多线程并发随机执行 N此记录查询,每次查询的记录主键 ID 是随机选择,在 maxID(参数)范围之内。测试工具 test_stand_select_perf 的参数如下jdbcurl user password threadpoo
10、lsize executetimes maxIdExecutetimes:每个线程总共执行多少次随机查询,建议 1000 次以上maxId: travelrecord 表的最大 ID,可以执行 select max(id) from travelrecord 来获取。Example:test_stand_select_perf.bat jdbc:mysql:/localhost:8066/TESTDB test test 100 10000 50000分片表的汇聚性能测试 T04:此测试可以在 T01 的集成上运行,先生成大量 travelrecord 记录,然后进行并发随机查询,此测试执行分
11、片库上的聚合、排序、分页的性能,SQL 如下:select sum(fee) total_fee, days,count(id),max(fee),min(fee) from travelrecord group by days order by days desc limit ?测试工具 test_stand_merge_sel_perf 的参数如下jdbcurl user password threadpoolsize executetimes limitExecutetimes:每个线程总共执行多少次随机查询,建议 1000 次以上limit: 分页返回的记录个数,必须大于 30Exam
12、ple:test_stand_merge_sel_perf.bat jdbc:mysql:/localhost:8066/TESTDB test test 10 100 100分片表的更新性能测试 T05:此测试可以在 T01 的集成上运行,先生成大量 travelrecord 记录,然后进行并发更新操作,update travelrecord set user =? ,traveldate=?,fee=?,days=? where id=?测试工具 test_stand_update_perf 的参数如下jdbcurl user password threadpoolsize recordrecord:总共修改多少条记录, 5000Example:test_stand_update_perf.bat jdbc:mysql:/localhost:8066/TESTDB test test 10 10000