使用MongoDB的Java驱动程序我试图在MongoDB集群中插入25,637,015个文档。这些文档是从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程序完成插入后,MongoDB在六个小时内做了什么?为什么伯爵这么高?
谢谢
答案 0 :(得分:1)
对于大多数驱动程序,mongodb使用内存来提高写入性能。您的插入首先进入内存和日志,然后立即返回。到那时你的数据还没有在磁盘上。有关更多信息,请查看MongoDB手册的Write Concern部分。这就是为什么你的收藏不断增长的原因。
至于计数的回报超过了准确的数字问题,实际上有一个关于它的JIRA issue。看看它是否回答了你的问题。不幸的是,它还没有修复。
编辑:
关于花费的时间,很难确定。取决于您的硬件,尤其是您的磁盘。运行mongostat和mongotop并查看正在进行的操作会很有帮助。一旦您知道插入是否仍在运行,您就会知道计数结果是否有意义。在这里,我在分片群集中找到了另一个相关的JIRA Issue解释计数操作。这可能会导致你的情况。但是,它仅在服务器迁移时发生。在继续之前,请告诉我您的分片群集是如何构建的。什么是你的分片键?