为什么MongoDb分片集合文档计数在减少?

3
我有一个Mongo分片集群,有3个分片,所有对此数据库的操作都是findupdate(使用upsert=true选项)。这意味着集合的计数将继续增加,但当集合的计数(db.mycollection.find().count())增加到80000000或更大时,我发现有时它在增加,但有时它在减少,为什么?我保证没有对此数据库进行删除操作。
我正在使用db.myCollection.getShardDistribution()来显示分布情况,而shard2仅占总量的29%,低于平均水平。
这里是计数的趋势:
mongos> db.myCollection.find().count()
84374837
mongos> db.myCollection.find().count()
84375036
mongos> db.myCollection.find().count()
84409281
mongos> db.myCollection.find().count()
84408921
mongos> db.myCollection.find().count()
84407190
mongos> db.myCollection.find().count()
84407173
mongos> db.myCollection.find().count()
84407013
mongos> db.myCollection.find().count()
84406911

Totals data : 53.89GiB docs : 84399594 chunks : 1732 Shard shard1 contains 35.44% data, 35.78% docs in cluster, avg obj size on shard : 679B Shard shard2 contains 29.7% data, 29.51% docs in cluster, avg obj size on shard : 690B Shard shard3 contains 34.84% data, 34.69% docs in cluster, avg obj size on shard : 688B - user1337896
我正在使用 db.myCollection.getShardDistribution() 来显示分布情况,shard1:35%,shard2:29%,shard3:36%,这有问题吗? - user1337896
1个回答

2
我敢打赌这就是分片的工作原理。它的工作方式如下:
  • 所有文档都被分成虚拟块
  • 块可以在分片之间移动
  • 当平衡器移动一个块时,它会

    1) 将该块中的所有文档复制到新的分片中

    2) 将该块的所有权转移到新的分片

    3) 从旧的分片中删除文档。

同样地,这只是一种猜测,基于提供的信息。但既然你发誓应用程序中没有删除操作,那么就一定是这个原因。


我正在mongos中查询计数,而不是单个分片。如果这是在分片之间移动的操作,则总计数不会减少。 - user1337896
再次强调,“移动”是一个三步过程。 - Sergio Tulentsev
集群已运行2天,但收集总数未增加,仍为84407173。 - user1337896

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接