YCSB——使用YCSB测试分片mysql

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

最近在研究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.JdbcDBClient
    

    workload分为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)插入的数据如图
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值