一.前言

        现在有个项目,五年时间会产生一亿条数据,所以领导想知道使用mongodb数据库,一亿条数据量中查询一条数据的响应时间。

二.工具调研

        mongodb的版本是4.4.6,jmeter的版本是5.0,最开始想用jmeter去做压测,将jmeter的配置文件做了修改,出现了mongodb source config,但是最后执行报错,最后查询到是mongodb4.0以上废除了这个方法,所以无奈只能放弃jmeter。有兴趣了解的小伙伴可以见最后一章,共同探讨。

        最后选择的工具为YCSB,以下基于centos 8,从安装部署开始,介绍YCSB的使用。

三.安装部署

1.安装jdk1.8

        一行命令即可:sudo apt-get install openjdk-8-jdk

2.安装maven

①下载地址:https://maven.apache.org/download.cgi

②拷贝到服务器,然后解压:tar -zxvf apache-maven-3.8.1-bin.tar.gz

③配置maven_home:sudo vi /etc/profile

    在最后一行追加:

#Maven_home
    export MAVEN_HOME=/usr/local/apache-maven-3.8.1
    export PATH=${MAVEN_HOME}/bin:$PATH

④执行命令立即生效:source /etc/profile

⑤验证是否安装成功:mvn -version

3.安装python2.7

        执行命令:apt install python-minimal

4.安装YCSB

①下载地址:https://github.com/brianfrankcooper/YCSB/releases/tag/0.17.0

②拷贝到服务器后解压:tar -zxvf ycsb-0.17.0.tar.gz

③进入ycsb的bin目录下,执行./ycsb,如果执行成功,则证明可以使用

四.workload配置文件参数解释

ycsb是通过加载workload文件来进行操作的,ycsb提供了几个workload模板,在workloads文件夹下,分别是:

workloada:混合了50%的读和50%的写;
workloadb:混合了95%的读和5%的写,该workload侧重于测试集群的读能力;
workloadc:100%只读
workloadd:插入数据,接着就读取这些新插入的数据
workloade:短范围scan,不同于随机读,每个测试线程都会去scan一段数据
workloadf: 读改写,客户端读出一个记录,修改它并将被修改的记录返回

 

workload文件中具体的参数意义如下,可以自己添加修改:

fieldcount: 每条记录字段个数 (default: 10)

fieldlength: 每个字段长度 (default: 100)

readallfields: 是否读取所有字段true或者读取一个字段false (default: true)

readproportion: 读取作业比例 (default: 0.95)

updateproportion: 更新作业比例 (default: 0.05)

insertproportion: 插入作业比例 (default: 0)

scanproportion: 扫描作业比例 (default: 0)

readmodifywriteproportion: 读取一条记录修改它并写回的比例 (default: 0)

requestdistribution: 请求的分布规则 uniform, zipfian or latest (default: uniform)

maxscanlength: 扫描作业最大记录数 (default: 1000)

scanlengthdistribution: 在1和最大扫描记录数的之间的分布规则 (default: uniform)

insertorder: 记录被插入的规则ordered或者hashed (default: hashed)

operationcount: 执行的操作数.

maxexecutiontime: 执行操作的最长时间,当然如果没有超过这个时间以运行时间为主。

table: 测试表的名称 (default: usertable)

recordcount: 加载到数据库的纪录条数 (default: 0)

 

例如,我插入一亿条数据的workload文件配置如下,由于是纯插入,所以readproportion读写比例是0,就是纯插入,另外指定了5个字段,每个字段长度为150:

 

五.执行压测

可以把自定义的workload文件放置到bin目录下,如此可执行以下命令:./ycsb load mongodb -s -P myworkload -threads 100 >load_test.txt

threads指定了100线程,>后面的参数代表着报告所在的路径

测试的报告如下:

在此期间cpu、内存的使用率如下(8核16G):

 

六.执行查询

由于只查询一条即可,也没并发要求,所以我在MongoDB Compass执行的查询操作。

在没有设置index的时候,查询速度要160多秒,如下图

 

在加上index后,查询时间只需1-2毫秒,如下图:

但是加上index后,内存的使用率也会涨到53%左右。

七.jmeter使用

        由于对其它项目的压测都是用jmter,所以mongodb也是第一反应使用jmeter进行压测,但是最后以失败告终,放在这里纯属探讨。

1.首先jmter3.0以上就不支持mongodb了,需要在配置文件中强行开启,然后才能看到mongod source config

        修改bin/user.properties文件,在最后一行追加:not_in_menu =

2.设置MongoDB配置文件属性

转自于:https://www.cnblogs.com/greattao/p/6541718.html

可以参照上面的博客进行配置

3.执行时报错

错误内容为:'no such command: '$eval''

4.网上找到的解释

所以放弃了jmeter

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐