最近在研究YCSB测试工具,其主要是对Nosql数据库进行性能测试,还可以对分片MySQL进行测试。下面为分片MySQL测试过程。
1. 编译安装
-
下载源码链接:https://github.com/brianfrankcooper/YCSB或者YCSB-master(提取码:uizj) 。
-
这里选择YCSB-master,解压到文件夹中,使用cmd进入该目录,由于该项目是使用maven进行管理,所以运行命令
mvn clean package进行编译(出错看3.(1))。 -
编译成功后,会在./YCSB-master/distribution/target目录下有ycsb-0.17.0-SNAPSHOT.tar,拷贝到自己的环境就可以使用。本次是将编译完的YCSB导入了eclipse。可以看到YCSB可以测试的数据库都包括哪些,测试分片mysql需要使用core和jdbc-binding,core是YCSB测试工具的核心包。
2. 测试过程
YCSB测试主要分为两个阶段,一个是初始化测试数据即数据装载阶段,第二个是测试阶段。
-
建库建表
不知道不手动建库建表是否可以运行时候自动建,我是手动建的。
分别在mysql的节点建立test库,需要和参数配置一致,表结构有统一要求,sql语句为CREATE TABLE usertable ( YCSB_KEY VARCHAR(255) PRIMARY KEY, FIELD0 TEXT, FIELD1 TEXT, FIELD2 TEXT, FIELD3 TEXT, FIELD4 TEXT, FIELD5 TEXT, FIELD6 TEXT, FIELD7 TEXT, FIELD8 TEXT, FIELD9 TEXT ); -
装载数据
在eclipse上使用YCSB测试,需要在启动前配置core项目下的com.yahoo.ycsb包中的Client:main()的运行参数。配置过程参考:eclipse在运行main函数时,怎么给args数组传参数
1)装载数据,需要配置的参数为(本次使用了两个测试节点)-load -s -P E:/YCSB-master/workloads/workloada -threads 128 \ -p db.url=jdbc:mysql://xxx.xx.xx.xx:3306/test,jdbc:mysql://127.0.0.1:3306/test \ -p db.user=root -p db.passwd=123456 \ -p db.driver=com.mysql.jdbc.Driver -db com.yahoo.ycsb.db.JdbcDBClient其中,
-load 表示处于数据装载阶段;
-s 表示显示运行状态;
-P 后面跟的为workload的路径,此处使用的绝对路径;
-threads 后面跟的是线程数;
-db 是要测试的数据库需要加载的类,此次测试的是mysql,所以使用的是JdbcDBClient,这个地方容易报错找不到该类,需要右键core项目–>Build Path --> configure build path --> projects,add jdbc-binding项目;
-p 其后面是测试mysql需要的参数,这个可以在jdbc-binding项目下的README.md文件中或者其主类JdbcDBClient中的init()找到,参照下面的解析。
2)配置完参数后Apply,运行Client主类,装载数据。从下面的运行结果可以看到,向mysql数据库一共装载了1000条数据,这1000条数据按照分片节点个数进行划分,每个节点的数据比大概为1:1。YCSB启动128个线程按url顺序将数据写入mysql分片节点。Command line: -load -s -P E:/YCSB-master/workloads/workloada -threads 128 -p db.url=jdbc:mysql://xxx.xx.xx.xx:3306/test -p db.user=root -p db.passwd=123456 -p db.driver=com.mysql.jdbc.Driver -db com.yahoo.ycsb.db.JdbcDBClient args---load **--128 YCSB Client 0.17.0-SNAPSHOT Loading workload... Starting test. 2019-07-13 16:42:59:612 0 sec: 0 operations; est completion in 0 second Adding shard node URL: jdbc:mysql://xxx.xx.xx.xx:3306/test Adding shard node URL: jdbc:mysql://xxx.xx.xx.xx:3306/test 。。。。。。 Adding shard node URL: jdbc:mysql://127.0.0.1:3306/test Adding shard node URL: jdbc:mysql://127.0.0.1:3306/test 。。。。。。 2019-07-13 16:45:24:990 8 sec: 1000 operations; 120.54 current ops/sec; [CLEANUP: Count=128, Max=1151, Min=94, Avg=232.12, 90=552, 99=1139, 99.9=1151, 99.99=1151] [INSERT: Count=1000, Max=6967295, Min=16704, Avg=600969.8, 90=1876991, 99=6213631, 99.9=6918143, 99.99=6967295] [OVERALL], RunTime(ms), 8295 [OVERALL], Throughput(ops/sec), 120.55455093429777 [TOTAL_GCS_PS_Scavenge], Count, 3 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 13 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.15672091621458709 [TOTAL_GCS_PS_MarkSweep], Count, 0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 3 [TOTAL_GC_TIME], Time(ms), 13 [TOTAL_GC_TIME_%], Time(%), 0.15672091621458709 [CLEANUP], Operations, 128 [CLEANUP], AverageLatency(us), 232.125 [CLEANUP], MinLatency(us), 94 [CLEANUP], MaxLatency(us), 1151 [CLEANUP], 95thPercentileLatency(us), 656 [CLEANUP], 99thPercentileLatency(us), 1139 [INSERT], Operations, 1000 [INSERT], AverageLatency(us), 600969.8 [INSERT], MinLatency(us), 16704 [INSERT], MaxLatency(us), 6967295 [INSERT], 95thPercentileLatency(us), 3102719 [INSERT], 99thPercentileLatency(us), 6213631 [INSERT], Return=OK, 1000 -
测试运行
参数配置为,只是把-load去掉了。-s -P E:/YCSB-master/workloads/workloada -threads 128 \ -p db.url=jdbc:mysql://xxx.xx.xx.xx:3306/test,jdbc:mysql://127.0.0.1:3306/test \ -p db.user=root -p db.passwd=123456 -p db.driver=com.mysql.jdbc.Driver \ -db com.yahoo.ycsb.db.JdbcDBClientworkload分为6种:(此次使用的是workloada)
workloada:读写混合1:1;
workloadb:95%的读和5%的写;
workloadc:100%读,只读;
workloadd:读取最新数据;
workloade:扫描一定范围的数据;
workloadf:读-修改-写混合。
具体解释参见 YCSB-WorkLoad运行结果如下:
[OVERALL], RunTime(ms), 6376 [OVERALL], Throughput(ops/sec), 156.83814303638644 [TOTAL_GCS_PS_Scavenge], Count, 2 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 13 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2038895859473024 [TOTAL_GCS_PS_MarkSweep], Count, 0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 2 [TOTAL_GC_TIME], Time(ms), 13 [TOTAL_GC_TIME_%], Time(%), 0.2038895859473024 [READ], Operations, 524 [READ], AverageLatency(us), 462658.4599236641 [READ], MinLatency(us), 93 [READ], MaxLatency(us), 5435391 [READ], 95thPercentileLatency(us), 2506751 [READ], 99thPercentileLatency(us), 4681727 [READ], Return=OK, 524 [CLEANUP], Operations, 128 [CLEANUP], AverageLatency(us), 227.921875 [CLEANUP], MinLatency(us), 98 [CLEANUP], MaxLatency(us), 981 [CLEANUP], 95thPercentileLatency(us), 699 [CLEANUP], 99thPercentileLatency(us), 884 [UPDATE], Operations, 476 [UPDATE], AverageLatency(us), 561121.9831932773 [UPDATE], MinLatency(us), 16688 [UPDATE], MaxLatency(us), 5152767 [UPDATE], 95thPercentileLatency(us), 2699263 [UPDATE], 99thPercentileLatency(us), 4382719 [UPDATE], Return=OK, 476
3. 遇到的问题&解释
(1) 如果编译出现错误,则运行mvn clean package -Dmaven.test.skip=true


(2)查看mysql测试需要的参数,在jdbc-binding项目中主类JdbcDBClient中的init()方法有写,可以从下图看到需要urls,user,passwd和driver。具体的调用key值如箭头所示,在该类最开始的地方有声明静态成员变量。


urls里面包含多个mysql分片节点的地址,使用逗号隔开。下面是具体使用代码。

(3)debug调试想查看过程的时候,跳不到jdbc-binding的代码,右键core–>build path --> link source 将jdbc-binding加进去即可。

(4)插入的数据如图


本文介绍如何使用YCSB工具对分片MySQL数据库进行性能测试,包括编译安装步骤、测试流程详解及遇到的问题解决方法。

1121

被折叠的 条评论
为什么被折叠?



