MongoDB Sharding将查询速度降低40-120%!

时间:2013-05-12 10:07:17

标签: performance mongodb sharding

我正在测试MongoDB上的分片,因为我的集合子集正在快速增长并寻找加速查询的方法。就像分片的想法一样,能够在单个查询上使用多个线程来加速它。

现在我发现当你启用分片或实际添加shardkey到集合时,查询响应时间会显着增加40%100%,只有当对mongos进行查询时而不是mongod。得到了结果,所以我设置了一个测试,也许你可以帮助我解决为什么它更慢和我做错了,或者它是一个令人讨厌的错误/ Mongo分片的问题。

  1. 启动空配置服务器
  2. 开始一个空的mongod
  3. 启动mongos
  4. 连接到mongos
  5. 使用testdb
  6. 添加数据:for(var i = 0; i < 200000; i++) { db.testcol.insert({field1: i}); }
  7. 添加索引:db.testcol.ensureIndex({field1:1})
  8. 多次测试查询速度:db.testcol.find({field1:{$gte: 0}}).explain(); 在我的测试系统上,我得到了一致的300 ms
  9. 启用分片:sh.enableSharding("testdb.testcol");
  10. 测试查询速度:仍为300 ms
  11. shard collection:sh.shardCollection("testdb.testcol", {field1:1})
  12. 再次测试查询速度几次:现在我的响应时间一致660 ms!这里发生了什么?我得到完全相同的结果集,但现在具有显着更高的响应时间。一切都是localhost。

  13. 现在直接连接到mongod

  14. use testdb
  15. 使用相同的查询进行测试:db.testcol.find({field1:{$gte: 0}}).explain(); 您将看到300毫秒的响应时间。因此,在对分片进行分片后,通过mongos的响应时间将会明显更高。您需要2台机器才能获得与分片前相同的响应时间。这不应该是正确分片的想法,或者我在这里错过了一点,除了传播数据而不是提高性能?
  16. 增加: 1.使用不同的块大小,1块,1000块测试它。对响应时间没有影响 2.监控CPU使用情况,所有CPU都在mongod上完成,mongos什么都不做。看起来当mongod查询分片集合(来自mongos的查询)时,与直接在mongod上完成的同一集合上的查询相比,它有一个很大的CPU。 3.嗅探查询,但是在分片之前和分片之后查询从mongos到mongod是相同的。

    1. 另一个有趣的发现!请看下面的过程:
    2. 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的原因

0 个答案:

没有答案