分割mongodb后收集计数增加

时间:2016-04-08 13:12:23

标签: mongodb cluster-computing sharding

我无法理解为什么在分割mongodb之后收集计数会增加。

我有20M记录的集合,当我的分片收集数量不断增加时,plz帮帮我

clusture configration

3个碎片 3配置服务器 6个查询路由器

1 个答案:

答案 0 :(得分:3)

如果我说得对,那就意味着db.shardedCollection.count()会返回比您预期更多的文档。这是known bug (SERVER-3645)

TL; DR

问题在于分片的工作方式,可以在存在块迁移之后发生,即所谓的orphaned documents。这些文档作为副本存在于分片上,不对文档所涉及的键范围负责。对于几乎所有实际目的而言,这不是一个问题,因为mongos会对它们进行排序" (这有点简化,但在这种情况下已经足够了。)

但是,在分片集合上调用db.collection.count()时,此查询将路由到所有分片,因为它不包含分片键。

  

免责声明从这里开始,这是我的理论,从观察到的行为中推断出来

由于孤立的文档在技术上仍然存在于分片上,因此它们似乎被计算在内并且整个计数的结果会被报告给mongos,这简单地总结了所有结果。我假设.count()在单个分片上使用快捷方式,可能只是出于性能原因计算_id索引的条目。

解决方法

如故障单中所写,使用聚合可以缓解问题:

db.collection.aggregate({$group:{_id:"uniqueDocs",count:{$sum:1}}})

但是,这种聚合并不理想,如果您的分片键不是_id

,则在更改时应该显示更好的性能
db.books.aggregate([
    { $project:{ _id:0, yourShardKey: 1 }},
    { $group:{ _id:"uniqueDocs", count:{ $sum:1 }}}
])

db.books.aggregate([
    { $project:{ _id:1 }},
    { $group:{ _id:"uniqueDocs", count:{ $sum:1 }}}
])

如果您使用_id作为分片键。