【问题标题】:Why MongoDB db.col.count() shows more documents than was inserted为什么 MongoDB db.col.count() 显示的文档多于插入的文档
【发布时间】:2014-03-13 02:12:51
【问题描述】:

使用 MongoDB 的 Java 驱动程序我试图将 25,637,015 个文档插入 MongoDB 集群。这些文档是从 SQL Server 数据库中检索出来的,并以多线程方式(8 个并发线程)插入到最初为空的 MongoDB 分片集合(称为 col)中。这个过程花了2个小时。有趣和令人费解的是,在节目结束后,某些事情持续了超过 6(!)小时。

首先,我的集群节点计算机中的硬盘继续疯狂地旋转。 其次,更重要的是,以不到一秒的时间间隔运行的 db.col.count() 继续呈现不同的结果:

mongos> db.col.count() 
25694898
mongos> db.col.count()
25694917
mongos> db.col.count()
25695154
mongos> db.col.count()
25695207
mongos> db.col.count()
25695422
mongos> db.col.count()
25695493
mongos> db.col.count()
25696024
mongos> db.col.count()
25696130
mongos> db.col.count()
25698565
mongos> db.col.count()
25695145

所有这些计数器在上升和下降时更有趣的是超过插入文档的数量:25,637,015。如果它们更小,我可以推测文档进入某种队列并且正在缓慢处理,但更大?!

就像我说的,六个小时后一切都稳定了:硬盘停止旋转,mongos> db.col.count() 终于呈现正确的数字:25637015。

如果它很重要。我的分片集群中有 2 个副本集。每个副本集有 2 个数据节点和 1 个仅仲裁节点。我运行 3 个配置服务器。和 3 个 mongos。全部分布在 Windows 主机上运行的 4 个 Centos 盒子(虚拟)之间。源 SQL Server 位于另一台物理计算机上。在插入期间或之后的任何时间都没有禁用平衡器。我的 MongoDB 版本是 2.2.6 64 位。

知道 Java 程序完成插入后 6 小时 MongoDB 在做什么吗?为什么计数这么高?

谢谢

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    对于大多数驱动程序,mongodb 使用内存来提高写入性能。您的插入首先进入内存和日志,然后立即返回。到那时,您的数据还没有在磁盘上。有关更多信息,请查看 MongoDB 手册的 Write Concern 部分。这就是您的收藏不断增长的原因。

    关于计数返回多于准确数字的问题,其实有一个JIRA issue 关于它。看看它是否回答了你的问题。不幸的是,它还没有修复。

    编辑:
    关于花费的时间,很难确定。取决于您的硬件,尤其是您的磁盘。运行mongostat 和mongotop 看看发生了什么会很有帮助。一旦知道插入是否仍在运行,您就会知道计数结果是否有意义。在这里,我找到了另一个相关的JIRA Issue,解释了分片集群中的计数操作。这可能会导致您的情况。但是,它仅在服务器迁移时发生。在继续之前,请让我知道您的分片集群是如何构建的。你的分片键是什么?

    【讨论】:

    • 感谢您的回答。但是,完成对内存和日志的写入需要 2 个小时,然后实际写入磁盘需要 6 个多小时,这是否有意义。同样,即使在阅读了您提到的赎罪和文件后,我仍然感到困惑:在插入后的所有时间(6 小时)中,我的收藏并没有增长。它的大小波动很大(上下波动),略高于插入文档的数量:count() > 25,637,015。这个上下是什么意思?
    猜你喜欢
    • 2021-06-21
    • 2014-06-21
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2020-09-05
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多