0

我有一个由几个分片组成的小集群,每个分片都是 2 个真实节点和 1 个仲裁者的副本集。对集合启用分片,比如说 generator_v1_food。

我已经停止了所有更新集合的程序(在这些程序中,只有 upsertfind操作,根本没有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
... 

幕后发生了什么?任何指针都会很棒。

4

1 回答 1

1

引用:

仅仅因为您将平衡器状态设置为“关闭”并不意味着它仍然没有运行,并且完成了从执行的最后一个 moveChunk 的清理。

当最后一个 moveChunk.commit 事件发生时,您应该能够在更改日志集合中的配置 DB 中看到 - 那是 moveChunk 进程提交到从某个块移动到新(目标)分片的文档时。但在那之后,旧分片需要异步删除不再属于它的文档。由于“计数”是从元数据中获取的,并且实际上并没有查询有多少文档是“真实的”,因此它将在平衡轮(或任何未正确清理或中止的平衡中)对“飞行中”的文档进行双重计数尝试)。

阿霞

于 2013-09-06T03:04:50.660 回答