我在一个服务器中有一个包含数百万个对象的集合。我设置了一个配置服务器和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
答案 0 :(得分: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 );
飞行中的迁移完成后,再次尝试计数,看看它们是否有意义。由于您添加了新的分片,因此它们都将不断添加/删除文档。在它们达到平衡并且迁移停止之前,很难说出计数偏差的直接原因是什么,但是如果平衡完成后它们会更早地告诉你它们是否会再次显得健全。
编辑:根据评论 - 很高兴让您的版本和操作系统查看这是否可重现,如果是,请提交错误以修复它。
答案 1 :(得分:0)
请参阅https://jira.mongodb.org/browse/SERVER-6696 - 我相信此问题“按设计工作”