使用YCSB测试MongoDB的微分片性能(二)

2015-07-23 18:08:24 · 作者: · 浏览: 31
ux公社下载地址) 并解压到上面创建的ycsb目录下面:


MongoDB配置


单机基准测试


在我们测试使用微分片性能之前我们首先需要得出单机的最高性能。启动目标MongoDB服务器,登录上去后先删除ycsb数据库(如果已经存在)
# mongo
> use ycsb? ?
> db.dropDatabase()


场景S1: 数据插入
接下来开始运行YCSB。进到ycsb目录下,运行以下命令(确认当前目录下已经有场景文件S1, S2, S3, S4,S5)
./bin/ycsb load mongodb -P S1 -s


如果运行正常,你会看到每隔10秒YCSB打印一下当前状态,包括每秒的并发率以及平均响应时间。 如:
Loading workload…?
Starting test.? ?
0 sec: 0 operations;? ?
mongo connection created with localhost:27017/ycsb? ?
10 sec: 67169 operations; 7002.16 current ops/sec; [INSERT AverageLatency(us)=4546.87]? ?
20 sec: 151295 operations; 7909.24 current ops/sec; [INSERT AverageLatency(us)=3920.9]? ?
30 sec: 223663 operations; 7235.35 current ops/sec; [INSERT AverageLatency(us)=4422.63]


在运行的同时你可以用mongostat(或者更好的选择:MMS)来监控MongoDB的实时指标,看是否和YCSB的报告大体一致。


运行结束后可以看到类似于如下输出:
[OVERALL], RunTime(ms), 687134.0?
[OVERALL], Throughput(ops/sec), 7295.168457372555? ?
…? ?
[INSERT], Operations, 5000000? ?
[INSERT], AverageLatency(us), 4509.1105768? ?
[INSERT], MinLatency(us), 126? ?
[INSERT], MaxLatency(us), 3738063? ?
[INSERT], 95thPercentileLatency(ms), 10? ?
[INSERT], 99thPercentileLatency(ms), 37? ?
[INSERT], Return=0, 5000000? ?


这个输出告诉我们插入了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