我正在测试MongoDB上的分片,因为我的集合子集正在快速增长并寻找加速查询的方法。就像分片的想法一样,能够在单个查询上使用多个线程来加速它。
现在我发现当你启用分片或实际添加shardkey到集合时,查询响应时间会显着增加40%
到100%
,只有当对mongos进行查询时而不是mongod。得到了结果,所以我设置了一个测试,也许你可以帮助我解决为什么它更慢和我做错了,或者它是一个令人讨厌的错误/ Mongo分片的问题。
for(var i = 0; i < 200000; i++) { db.testcol.insert({field1: i}); }
db.testcol.ensureIndex({field1:1})
db.testcol.find({field1:{$gte: 0}}).explain();
在我的测试系统上,我得到了一致的300 ms
sh.enableSharding("testdb.testcol");
300 ms
sh.shardCollection("testdb.testcol", {field1:1})
再次测试查询速度几次:现在我的响应时间一致660 ms
!这里发生了什么?我得到完全相同的结果集,但现在具有显着更高的响应时间。一切都是localhost。
现在直接连接到mongod
use testdb
db.testcol.find({field1:{$gte: 0}}).explain();
您将看到300毫秒的响应时间。因此,在对分片进行分片后,通过mongos的响应时间将会明显更高。您需要2台机器才能获得与分片前相同的响应时间。这不应该是正确分片的想法,或者我在这里错过了一点,除了传播数据而不是提高性能?增加: 1.使用不同的块大小,1块,1000块测试它。对响应时间没有影响 2.监控CPU使用情况,所有CPU都在mongod上完成,mongos什么都不做。看起来当mongod查询分片集合(来自mongos的查询)时,与直接在mongod上完成的同一集合上的查询相比,它有一个很大的CPU。 3.嗅探查询,但是在分片之前和分片之后查询从mongos到mongod是相同的。
mongos> db.testcol.find({field1: {$gte: 0}},{_id:0,field1:1}).explain();
{
"cursor" : "BtreeCursor field1_1",
"isMultiKey" : false,
"n" : 5000000,
"nscannedObjects" : 0,
"nscanned" : 5000000,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 5000000,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 6,
"nChunkSkips" : 0,
"millis" : 4660,
"indexBounds" : {
"field1" : [
[
0,
1.7976931348623157e+308
]
]
},
"server" : "jvangaalen-PC:27020",
"millis" : 4660
}
mongos> sh.shardCollection("testdb.testcol",{field1:1});
{ "collectionsharded" : "testdb.testcol", "ok" : 1 }
mongos> db.testcol.find({field1: {$gte: 0}},{_id:0,field1:1}).explain();
{
"clusteredType" : "ParallelSort",
"shards" : {
"192.168.11.250:27020" : [
{
"cursor" : "BtreeCursor field1_1",
"isMultiKey" : false,
"n" : 5000000,
"nscannedObjects" : 5000000,
"nscanned" : 5000000,
"nscannedObjectsAllPlans" : 5000000,
"nscannedAllPlans" : 5000000,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 10,
"nChunkSkips" : 0,
"millis" : 9378,
"indexBounds" : {
"field1" : [
[
0,
1.7976931348623157e+308
]
]
},
"server" : "jvangaalen-PC:27020"
}
]
},
"cursor" : "BtreeCursor field1_1",
"n" : 5000000,
"nChunkSkips" : 0,
"nYields" : 10,
"nscanned" : 5000000,
"nscannedAllPlans" : 5000000,
"nscannedObjects" : 5000000,
"nscannedObjectsAllPlans" : 5000000,
"millisShardTotal" : 9378,
"millisShardAvg" : 9378,
"numQueries" : 1,
"numShards" : 1,
"indexBounds" : {
"field1" : [
[
0,
1.7976931348623157e+308
]
]
},
"millis" : 9426
}
分片前:4660 ms
响应时间。
分片后:9426 ms
响应时间。
索引的使用方法相同。一个区别是nscannedobjects
0
,现在是5000000
(所有文档)。分片后为什么nscannedobjects
不是0
?这可能是额外CPU的原因