这个输出告诉我们插入了500万条记录, 耗时687秒,平均并发量每秒7295条,平均响应时间4.5ms。注意这个数值本身来说对于MongoDB的性能指标没有任何参考价值。如果你的环境有任意一点不一致,或者插入数据的大小,或者索引的多少不一样,都会导致结果很大的不同。所以这个值只能在作为本次测试和微分片性能比较的基准值。
在MongoDB方面,要特别注意一下mongostat或者MMS汇报的page faults,network,DB Lock %等指标。如果你的network是1Gb/s 而mongostat汇报了100m的数字,那你的网络就基本是饱和了。1Gb/s的带宽也就是128m/s的传输速率。在我的这个测试里network in保持在14-15m/s的样子,和每秒的并发率及文档大小(7300x2KB)是一致的。
为了找到一个比较理��的客户端线程数,我对同样的操作重复了多次,每一次修改了场景文件里面的threadcount数值。测试的结果发现到了30 个线程左右并发量就到达了最高值。再增加线程数量性能不再提高。因为我的场景文件中的threadcount值设为32。
现在我们已经在数据库内有了500万测试数据,现在我们可以测一下其他的几个场景。注意:YCSB的第一个参数是测试阶段。刚才是数据导入所以第一个参数是”load”。导入完数据后接下来就是运行阶段所以第二个参数都是”run”。
场景S2: 写多读少
命令:
./bin/ycsb run mongodb -P S2 -s
结果
…
[OVERALL], Throughput(ops/sec), 12102.2928384723
场景S3: 混合读写(65%read)
命令:
./bin/ycsb run mongodb -P S3 -s
结果
…
[OVERALL], Throughput(ops/sec), 15982.39239483840
场景S4: 读多写少
命令:
./bin/ycsb run mongodb -P S4 -s
结果
…
[OVERALL], Throughput(ops/sec), 19102.39099223948
场景S5: 100% 读
命令:
./bin/ycsb run mongodb -P S5 -s
结果
…
[OVERALL], Throughput(ops/sec), 49020.29394020022
微分片测试
刚才我们已经得到了单机在5个场景下的性能指标。接下来我们可以开始测试在微分片以及不同数量微分片的情景下的性能指标。
首先我们停掉单机上MongoDB数据库。
接下来我们要建一个分片集群。在这里让我要推荐给大家一个非常方便的MongoDB工具:mtools https://github.com/rueckstiess/mtools
mtools是几个MongoDB相关工具的集合,其中的mlaunch可以帮助我们不费吹灰之力地在单机上创建复制集或分片集群。
安装mtools(需要Python以及Python的包管理工具pip 或者easy_install):
# pip install mtools
或
# easy_install mtools
然后建一个新的目录并在新目录下创建微分片集群:
# mkdir shard2
# cd shard2
# mlaunch –sharded 2 –single
这个命令会在同一台机器上创建一下4个进程:
* 1 个mongos 在27017 端口
* 1 个配置服务器的mongod 在27020端口
* 2 个分片服务器的mongod 在27018和27019端口
这四个进程组成了具有两个分片的微分片集群。值得指出的是虽然我们已经搭建了一个分片集群,在这个时候所有的数据还是只会去到其中一个分片,这个分片叫做主分片。要让MongoDB把数据分布到各个分片上,必须显式地激活需要分片的数据库以及集合名。
# mongo
mongos> sh.enableSharding(“ycsb”)
{ “ok” : 1 }
mongos> sh.shardCollection(“ycsb.usertable”, {_id:”hashed”})
{ “collectionsharded” : “ycsb.usertable”, “ok” : 1 }
上述两个命令分别激活了 ”ycsb“ 数据库以及库内 “usertable”集合的分片功能。在对集合开启分片的时候还需要指定分片键。在这里我们使用了 {_id: “hashed” } 表示使用 _id 字段的哈希值作为分片键。哈希值分片键对大量写的场景比较合适,可以把写操作均匀的分布到各个分片上。
接下来我们可以按顺序运行以下5个场景并收集测试结果(注意ycsb的第一个参数):
./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
测试完以后要用下述命令关掉整个集群:
# mlaunch stop
以次类推,可以对4个,6个,和8个成员的微分片集群分别建立单独的目录并重复5个场景的测试。如下是所有测试结果:
结论
从上表我们可以得出以下结论
* 微分片在合适的应用场景下可以显著的提高MongoDB并发量
* 微分片对只读的应用场景没有任何帮助
* 微分片对混合读写的场景(也是实际中最常见的场景)的优化最好:275%
* 6个微分片就已经基本到了饱和状态,再增加更多分片已经没有明显改善。 这个数字可能会因人而异。
CentOS 编译安装 MongoDB与mongoDB的php扩展
CentOS 6 使用 yum 安装MongoDB及服务器端配置
Ubuntu 13.04下安装MongoDB2.4.3