使用YCSB测试mongodb分片集群性能

旧街凉风 提交于 2019-12-04 21:24:47

1. 测试工具

    本次测试选取YCSB(Yahoo! Cloud System Benchmark)作为测试客户端工具。YCSB是Yahoo开源的一个nosql测试工具,用来测试比较各种nosql的性能,项目地址:https://github.com/brianfrankcooper/YCSB。项目的mongodb目录下有详细的安装和测试方法。

    YCSB支持常见的nosql数据库读写,如插入,修改,删除,读取等。它可以使用多线程来提高客户端的性能。可以方便的自定义各种场景,如95%插入5%读,或者90%读5%更新5%插入等等。可以自定义数据请求分布方式:平均分布,zipfian(大约20%数据获得80%访问请求),最新数据。


2. 测试步骤

    1. 选择客户端线程数。使用YCSB测试,要选择一个合适的线程数,否则测试的瓶颈可能在客户端而不是数据库,经过比较,大概100个线程时,YCSB达到最大性能。


    2.定义测试场景。本次测试的场景如下:

workloada 写多读少,90%插入,5%读,5%更新。
workloadb 读多写少,95%读,5%更新。
workloadc 读多写少,100%读。
workloadd 读多写少,95%读,5%插入。
workloadf 读多写少,50%读,50%读写修改同一条记录。
workloadg 读多写少,60%读,20%读,20%更新。



    3.测试不同数量记录下的各种场景。分成两个阶段:


    1),load。加载数据。命令为:

    ./bin/ycsb load mongodb -threads 100 -s -P workloads/workloada -p mongodb.url=mongodb://mongos:28000/ycsb?w=0 > outputLoad.txt

    执行load 命令时,仅有recordcount参数起作用,如recordcount=60000000表示加载六千万条记录。执行run命令时,recordcount不起作用。mongos是集群中mongos实例的ip地址。


    2),run。load数据完成后,各种场景运行测试。

    测试场景workloada,位于workloads目录下:

    ./bin/ycsb run mongodb -threads 100 -s -P workloads/workloada -p mongodb.url=mongodb://mongos:28000/ycsb?w=0 > outputRun.txt

    每次load数据前要把上次测试中产生的数据删除,包括各个分片,配置服务器,mongos等的数据。


3. 测试系统架构

    集群配置服务器的3个实例部署在configs服务器上,YCSB,mongos实例,shard1,shard2各自部署在一台服务器。shard1和shard2都是单独的mongodb instance,不是replicate set。mongodb 使用2.6版本。


4. 服务器的配置


OS CPU RAM
YCSB ubuntu14.04 Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz 4核 1G
mongos Red Hat 4.4 Intel(R) Xeon(R) CPU E5645 @ 2.40GHz 1核 8G
shards Red Hat 4.4 Intel(R) Xeon(R) CPU E5645 @ 2.40GHz 1核 16G
configs ubuntu14.04 Intel(R) Core(TM) i5-4440 CPU@3.10GHz 1核 1G


5. 测试结果

    表1, 一个分片,1百万,1千万,6千万,1亿记录时各个场景的吞吐量(ops/sec)。

    表2,两个分片,1百万,1千万,6千万记录时各个场景的吞吐量(ops/sec)。

数据量(百万) workloada workloadb workloadc workloadd workloadf workloadg
1 4878 7352 7536 7885 2131 5986
10 4343 7282 7442 6996 2164 6119
60 1669 7242 7847 7810 2577 6054
100 157 7333 6796 7766 2082 4389

表1


数据量(百万) workloada workloadb workloadc workloadd workloadf workloadg
1 6462 7416 7518 7633 2622 6777
10 5826 8198 7664 8073 2093 7376
60 5662 7707 7546 7716 2181 6540







表2


6. 测试结果分析

    图1,一个分片时各个场景下吞吐量随记录量的变化曲线。

    图2,两个分片时各个场景下吞吐量随记录量的变化曲线。

    图3,重写场景(workloada) 不同分片数量的吞吐量随记录量的变化曲线。

    图4,重读场景(workloadb) 不同分片数量的吞吐量随记录量的变化曲线。

图1


图2


图3


图4

    由图1,workloada可以看出,mongodb的写性能率先达到瓶颈,随着记录数量增加,下降很快,而读取的性能变化很小。

    由图3和图4,可以看出,当mongodb遇到写瓶颈时,增加分片,大大增加写性能,少量增加读性能。

    可能由于数据量,或者YCSB的瓶颈,测试中mongodb读性能未出现瓶颈。

7.结论

    1.Mongodb的读性能很高,适合重读的场景。

    2.通过增加分片,可以大大增加mongodb集群的写性能, 部分增加读性能。

    3.与关系型数据库相比,mongodb 的优势

    • 文档型数据库,json风格的文件存储,结构清晰,无需ORM。

    • 复制和高可用性,易于扩展。

    • 自动分片

    • 使用基于文档的查询语言,有一定的查询能力。

    • 任何属性可索引。

    所以对于不太复杂的查询场景下,mongodb可以很方便的作为mysql的替代方案,提高db的读写能力。对于大数据场景,内容管理和交付平台,用户数据管理中心,日志平台等都适合使用mongodb。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!