什么是YCSB?
YCSB是Yahoo开发的一个专门用来对新一代数据库进行基准测试的工具。全名是Yahoo! Cloud Serving Benchmark。 他们开发这个工具的目的是希望有一个标准的工具用来衡量不同数据库的性能。YCSB做了很多优化来提高客户端性能,例如在数据类型上用了最原始的比特数组以减少数据对象本身创建转换所需的时间等。YCSB的几大特性:
- 支持常见的数据库读写操作,如插入,修改,删除及读取
多线程支持。YCSB用Java实现,有很好的多线程支持。
灵活定义场景文件。可以通过参数灵活的指定测试场景,如100%插入, 50%读50%写等等
- 数据请求分布方式:支持随机,zipfian(只有小部分的数据得到大部分的访问请求)以及最新数据几种请求分布方式
- 可扩展性:可以通过扩展Workload的方式来修改或者扩展YCSB的功能
准备条件
- 安装JDK ,安装Maven
- 下载实现了MongoDB驱动的YCSB编译版:
- 解压缩:
tar -xzvf ycsb-0.1.4.tar.gz 进入到ycsb目录并运行(本地要有一个Mongo数据库在 27017端口上):
./bin/ycsb run mongodb -P workloads/workloada如果YCSB可以运行则表明安装成功
YCSB场景文件
使用YCSB测试不同场景只需要提供不同的场景文件就可以。YCSB会按照你的场景文件的属性而自动生成响应的客户端请求。在我们这次测试里我们会使用到几种场景:
场景S1: 100%插入。用来加载测试数据
场景S2: 写多读少 90% 更新 10%读
场景S3: 混合读写 65%读, 25% 插入, 10% 更新
场景S4: 读多写少 90% 读, 10% 插入、更新
场景S5: 100%读
如下是其中场景文件S2的内容:
recordcount=5000000
operationcount=100000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=true
readproportion=0.1
updateproportion=0.9
scanproportion=0
insertproportion=0
requestdistribution=uniform
insertorder=hashed
fieldlength=250
fieldcount=8
mongodb.url=mongodb://192.168.1.2:27017
mongodb.writeConcern=acknowledged
threadcount=32
一些说明:
- 测试数据包括500万个文档(recordcount)
- 每个文档大小大约2KB(fieldlength x fieldcount)。数据总共大小是10G+600M的索引
- MongoDB数据库的url是192.168.1.2:27017
- MongoDB的写安全设置(mongodb.writeConcern)是acknowledged
- 线程数是32(threadcount)
- 插入文档的顺序:哈希/随机 (insertorder)
- 更新操作: 90% (0.9)
- 读操作: 10% (0.1)
点击此处下载所有场景文件(S1 – S5) 并解压到上面创建的ycsb目录下面: http://pan.baidu.com/s/1voJAA
基准测试
启动目标MongoDB服务器,登录上去后先删除ycsb数据库(如果已经存在)
- mongo
> use ycsb
> db.dropDatabase()
接下来开始运行YCSB。进到ycsb目录下,运行以下命令(确认当前目录下已经有场景文件S1, S2, S3, S4,S5)
./bin/ycsb load mongodb -P S1 -s
./bin/ycsb run mongodb -P S2 -s
./bin/ycsb run mongodb -P S3 -s
./bin/ycsb run mongodb -P S4 -s
./bin/ycsb run mongodb -P S5 -s
常见错误
- Could not initialize MongoDB connection pool for Loader: java.lang.NullPointerException
方法:检查mongodb.url 的连接地址是否正确 - 0 sec: 0 operations;
java.lang.NullPointerException
0 sec: 0 operations; [INSERT AverageLatency(us)=28605]
方法:修改mongodb.writeConcern=acknowledged为mongodb.writeConcern=normal
参考
感谢以下大神,您的分享使我少走弯路:
[1] @TJ_MongoDB:http://ju.outofmemory.cn/entry/90953
[2]广州巨杉软件开发有限公司:http://www.sohu.com/a/118497423_406112
[3]lyc417356935:https://blog.csdn.net/lyc417356935/article/details/54928445