我有一个由几个分片组成的小集群,每个分片都是2个真实节点和1个ARBITER的副本集。在集合上启用了分片,比如说generator_v1_food。
我已停止更新集合的所有程序(在这些程序中,只有 upsert
和find
操作,根本没有remove
。然后,收集计数像这样返回(2-3秒间隔)。我也关掉了平衡器。日志的最后几行(我操作的分片)都是关于副本集的。
mongos> db.generator_v1_food.find().count()
28279890
mongos> db.generator_v1_food.find().count()
28278067
mongos> db.generator_v1_food.find().count()
28278008
...
幕后发生了什么?任何指针都会很棒。
答案 0 :(得分:1)
报价:
仅仅因为你将平衡器状态设置为“关闭”并不意味着它仍然没有运行,并且从最后一次执行的moveChunk完成清理。
当最后一个moveChunk.commit事件发生时,你应该能够在changelog集合中的config DB中看到 - 当moveChunk进程提交给某个块的文档被移动到新的(目标)分片时。但在此之后,旧的分片异步地需要删除不再属于它的文档。由于“计数”是从元数据中获取的,并且实际上并不查询有多少文档存在“真实”,因此它会在平衡轮次(或任何未正确清理或未中止的平衡)中对“飞行中”的文档进行重复计算尝试)。
阿霞