1

我有一个集合,其中包含数百万个对象,仅在一台服务器中。我设置了一个配置服务器和 2 个分片节点,其中一个拥有该集合文档。在我将集合添加为分片后,一切看起来都很好。但是发生了一些奇怪的事情,如果我一直询问集合的大小,mongod 正在分片该集合:db.activity_items.count()数量正在减少。为什么?我在某处丢失任何数据吗?

这是一些控制台输出,只是为了说明问题:

mongos> db.activity_items.count()
19107620
mongos> db.activity_items.count()
19107223
mongos> db.activity_items.count()
19106939
mongos> db.activity_items.count()
19106922
mongos> db.activity_items.count()
19027118

编辑

如果我运行db.activity_items.stats(); http://pastebin.com/85RqZmQM。它表明第一个分片节点正在减少计数器,而第二个分片节点没有增加它的计数器。这让我觉得我的数据陷入了困境.?。

编辑 2

我停止了平衡器。它停止丢失数据,但是我的旧数据没有回来..

mongos> db.activity_items.count()
15736936

编辑 3

我填写了一个关于它的错误:https ://jira.mongodb.org/browse/SERVER-6696

4

2 回答 2

0

首先让我说我不认为你在这里丢失数据。问题很可能在于 count() 命令在分片环境中的工作方式。存在具有相反行为的错误,例如:

https://jira.mongodb.org/browse/SERVER-3645

我认为这里发生的事情是计数实际上只是在原始分片上正确执行,而不是在新分片上返回(或返回零)。如果您直接连接到分片初选并在那里运行计数会发生什么?

此外,运行 sh.status() 以便您可以跟踪迁移。

作为一个实验,看看这是否是暂时的并且是由正在进行的迁移引起的,请尝试暂时禁用平衡器:

// connect to mongos
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );

飞行中迁移完成后,再次尝试计数,看看它们是否有意义。由于您添加了一个新的分片,因此它们都将不断地添加/删除文档。在它们平衡并且迁移停止之前,很难说出计数偏差的直接原因是什么,但这会尽早告诉您一旦平衡完成它们是否会再次看起来很正常。

编辑:根据评论 - 让您的版本和操作系统查看这是否可重现,如果可以,请提交错误以修复它。

于 2012-08-01T23:11:34.323 回答
0

请参阅https://jira.mongodb.org/browse/SERVER-6696 - 我相信这个问题“按设计工作”

于 2012-08-16T07:47:04.867 回答