前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速学习-Mycat 性能测试指南

快速学习-Mycat 性能测试指南

作者头像
cwl_java
发布2021-12-30 17:32:08
6280
发布2021-12-30 17:32:08
举报
文章被收录于专栏:cwl_Javacwl_Java

Mycat 性能测试指南

Mycat 自身提供了一套基准性能测试工具,这套工具可以用于性能测试、疲劳测试等,包括分片表插入性能测试、分片表查询性能测试、更新性能测试、全局表插入性能测试等基准测试工具。

这里需要说明的一点是,分片表的性能测试不同于普通单表,因为它的数据是分布在几个 Datahost 上的,因此插入和查询,都必需要特定的工具,才能做到多个节点同时负载请求,通过观察每个主机的负载,能够确定是否你的测试是合理和正确的。

大量测试表明,当带宽不是问题而且带宽没有占满,比如千兆网网络连接的 Mycat 和 MySQL 服务器,以及测试客户端,(通常个人电脑到服务器的连接为 100M),分片表的性能取决于后端部署 MySQL 的物理机的个数,比如每个 MySQL 的性能是 5 万 Tps,则 3 台理论上是 15 万,而 Mycat 能达到 80-95%之间,即 12 万以上。

关于带宽问题,是一个比较棘手的问题,通常需要监控交换机、MySQL 服务器、Mycat 服务器、以获取测试过程中的端口流量信息,才能确定是否带宽存在问题,另外,很多企业里,千兆交换机采用了百兆的普通网线的情况时有发生,防不胜防,所以,在不能控制的网络环境里,测试最大性能的目标通常无法实现。

另外,很多人测试的时候,并不知道 MySQL 直连的性能,因此无法正确比较 Mycat 的性能,所以,建议性能测试过程里,首先直连 MySQL 进行性能测试,可以同时直连多个 MYSQL 服务器,然后把测试结果累计,作为直连的性能指标,然后改为连接 Mycat 进行测试,这样的对比才是有价值的,当插件过大的时候,需要先排除是否存在 MySQL 冷热不均的现象,然后考虑 Mycat 性能调优。

测试工具在单独的包中,解压到任意机器中执行使用,跟 MyCAT Server 没有关联关系,此测试工具很强大,可以测试任意表,和任意数据库,测试工具下载: https://github.com/MyCATApache/Mycat-download 目录下的 testtool.tar.gz 中。 解压后,在 bin 目录里运行文中的测试脚本。

代码语言:javascript
复制
标准插入性能测试脚本 test_stand_insert_perf.sh 支持任意表的定制化业务数据的随机生成功能了,在 sql 模板文件中
用${int(1-100)}这种变量,测试程序会随机生成符合要求的值并插入数据库。
./test_stand_insert_perf.sh jdbc:mysql://localhost:8066/TESTDB test test 10 file=mydata-create.sql
其中 mydata-create.sql 的内容如下:
total=10000000
sql=insert into my_table1 (….) values ('${date(yyyyMMddHHmmssSSS-[2014-2015]y)}-${int(0-
9999)}ok${int(1111-9999)}xxx ','${char([0-9]2:2)} OPP_${enum(BJ,SH,WU,GZ)}_1',10,${int(10-999)},${int(10-
99)},100,3,15,'${date(yyyyMMddHHmmssSSS-[2014-2015]y}${char([a-f,0-9]8:8)} ',${phone(139-
189)},2,${date(yyyyMMddHH-[2014-2015]y},${date(HHmmssSSS)},${int(100-1000)},'${enum(0000,0001,0002)}')
目前支持的有以下类型变量:
Int:${int(..)} 可以是,${int(10-999)}或者,${int(10,999)}前者表示从 10 到 999 的值,后者表示 10 或者 999
Date:日期如${date(yyyyMMddHHmmssSSS-[2014-2015]y)}表示从 2014 到 2015 年的时间,前面是输出格式,符
合 Java 标准
Char:字符串${char([0-9]2:2)}表示从 0 到 9 的字符,长度为 2 位(2:2),}${char([a-f,0-9]8:8)}表示从 a 到 f 以及 0
到 9 的字符串随机组成,定常为 8 位。
Enmu:枚举,表示从指定范围内获取一个值,${enum(0000,0001,0002)},里面可以是任意字符串或数字等内容。
 
标准查询性能测试脚本 test_stand_select_perf 也支持 sqlTemplate 的变量方式,查询任意指定的 sql
./test_stand_select_perf.sh jdbc:mysql://localhost:8066/TESTDB test test 10 100000 file=mysql-select.sql
其中 oppcall-select.sql 的内容类似下面:
sql=select * from mytravelrecord where id = ${int(1-1000000)}
表明查询 id 为 1 到 1000000 之间的随机 SQL。
注意:Windows 下 file=xxx.slq 需要加引号:
test_stand_insert_perf.bat jdbc:mysql://localhost:8066/TESTDB test test 50 "file=oppcall.sql"

首先参考 MyCAT 性能调优,确保整个系统达到最优配置。

性能测试,建议先小规模压力预热 10-20 分钟,这是众所周知的 Java 的特性,越跑越快。测试的硬件和网络条件:

  • 建议至少 3 台服务器;
  • MyCAT Server 一台;
  • Mysql 一台;
  • 带宽应该是至少 100M,建议千兆;
  • 压力程序在另一台,压力程序的机器也可以由性能差的机器来代替。

有条件的话,分片库在不同的 MYSQL 实例上,如 20 个分片,每个 MYSQL 实例 7 个分片,而且最好有多台MYSQL 物理机。

分片表的录入性能测试-T01测试案例:分片表的并发录入性能测试,测试 DEMO 中的 travelrecord 表,此表的基准 DDL 语句:

代码语言:javascript
复制
create travelrecord: create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate
DATE, fee decimal,days int);

此表的标准分片方式为基于 ID 范围的自动分片策略。Schema.xml 中配置如下:

代码语言:javascript
复制
默认是 3 个分片,分片 ID 范围定义在 autopartition-long.txt 中,建议修改为以下或更大的数值范围分片,每个分片 500 万数据# range start-end ,data node index 
0-2000000=0
2000001-4000000=1
4000001-6000000=2
根据自己的情况,可以每个分片放更多的数据,进行对比性能测试,当分片 index 增加时,注意 dataNode也增加(dataNode=“dn1,dn2,dn3”)。测试的输入参数如下[jdbcurl] [user] [password] [threadpoolsize] [recordrange]:
Jdbcurl:连接 mycat 的地址,格式为 jdbc:mysql://localhost:8066/TESTDB
User 连接 Mycat 的用户名
Password:密码
Threadpoolsize:并发线程请求,可以在 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,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,会
初始建立 minCon 个连接,并发测试结果更好,另外,也可以验证是否当前内存设置,以及 MYSQL 是否支持开启这么
多连接,若无法支持,则 logs/mycat.log 日志中会有告警错误信息,建议测试过程中 tail –f logs/mycat.log 观察有无
错误信息。另外,开启单独的 Mycat 管理窗口,mysql –utest –ptest –P9066 然后运行 show @@datasource 可以
看到后端连接的使用情况。Show @@threadpool 可以看线程和 SQL 任务积压的情况。
也可以同时启动多个测试程序,在不同的机器上,并发进行测试,每个测试程序写入一个分片的数据范围,对于 1 个亿的
数据插入测试来说,可能效果更好,毕竟单机并发线程 50 个左右已经差不多极限:
test_stand_insert_perf jdbc:mysql://localhost:8066/TESTDB test test 100 “0-100M” 
est_stand_insert_perf jdbc:mysql://localhost:8066/TESTDB test test 100 100M1-200M”
全局表的查询性能测试 T02:全局表自动在多个节点上同步插入,因此其插入性能有所降低,这里的插入表为 goods 表,执行的命令类似T01 的测试。温馨提示:全局表是同时往多个分片上写数据,因此所需并发 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:8066/TESTDB test test 100 1000000
本机笔记本,4G 内存,数据库与 Mycat 以及测试程序都在一起,跑出来每秒 1000 多的插入速度:分片表的查询性能测试 T03:
 此测试可以在 T01 的集成上运行,先生成大量 travelrecord 记录,然后进行并发随机查询,此测试是在分片库上,基于分片的主键 ID 进行随机查询,返回单条记录,多线程并发随机执行 N 此记录查询,每次查询的记录主键 ID 是随机选择,在 maxID(参数)范围之内。测试工具 test_stand_select_perf 的参数如下[jdbcurl] [user] [password] [threadpoolsize] [executetimes] [maxId]
Executetimes:每个线程总共执行多少次随机查询,建议 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 记录,然后进行并发随机查询,此测试执行分片库上的聚合、排序、分页的性能,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] [limit]
Executetimes:每个线程总共执行多少次随机查询,建议 1000 次以上
limit:分页返回的记录个数,必须大于 30 
Example:
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] [record]
record:总共修改多少条记录,>5000 
Example:
test_stand_update_perf.bat jdbc:mysql://localhost:8066/TESTDB test test 10 10000
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mycat 性能测试指南
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档