2

我有 700M 行/1.3TB MongoDB 实例,版本 1.6.3。我尝试使用copyDatabase命令将其复制到新的 2.0 实例。

“只是复制”完成了 2 个小时。但在那之后,新的 MongoDB 集合被锁定并db.currentOp()返回以下结果。

{
    "opid" : 5,
    "active" : true,
    "lockType" : "write",
    "waitingForLock" : false,
    "secs_running" : 22138,
    "op" : "query",
    "ns" : "nerv",
    "query" : {
        "copydb" : 1,
        "fromhost" : "<some host>",
        "fromdb" : "<some db>",
        "todb" : "<some db>"
    },
    "client" : "127.0.0.1:50689",
    "desc" : "conn",
    "threadId" : "0x7f5094005700",
    "connectionId" : 1,
    "msg" : "index: (2/3) btree bottom up 214887968/715742197 30%",
    "progress" : {
        "done" : 214887968,
        "total" : 715742197
    },
    "numYields" : 5591738
},

我等了大约 5 个小时,看来这不会在 24 小时内结束。我必须等待这个还是有其他选择?(就像在后台运行索引创建一样ensureIndex


补充)谢谢你的回答,Adam C。然后我想问你更多:)

  1. 在做什么index: (2/3) btree bottom up,为什么这么慢?
  2. 我还没有收到index: (3/3)消息。(3/3)慢是一样的吗(2/3)
4

1 回答 1

2

除了辅助节点的问题,索引构建可以在后台完成,但我认为不是该副本的一部分:

http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation

您可以只 fsync 并锁定(或暂时关闭)1.6.3 数据库,然后复制数据文件。文件格式在 1.6.3 和 2.0.6 之间没有改变,所以如果你启动 2.0.6 实例并将它指向复制文件的适当路径,你应该很好。

就后续作品而言,这有点超出我目前的知识范围,但我会尝试找出答案。我可以说相关代码在这里:

https://github.com/mongodb/mongo/blob/master/src/mongo/db/index_update.cpp#L219

看起来您正处于创建实际索引数据结构的 btree 构建阶段(在读取/插入之后)阶段,最后一部分与提交有关。在这里很难衡量确切的时间,但如果你已经跑了一段时间,很可能值得让它完成。

如果这是我的选择,我将有一个计划 B 并并行运行数据文件的副本,假设这是可能的。如果索引构建首先完成,则终止文件传输。

更新:我在研究另一个问题时意识到,当被索引的集合远大于 RAM 时,在 2.0.6 之前的版本中存在一个错误。它表现为前台索引的第 2 阶段(您正在做的事情)需要很长时间,并且页面错误率大幅增加。

该错误已在 2.0.7 中修复(在撰写此答案时,可作为候选发布版)。因此,如果其他人遇到此问题,或者原始问题所有者遇到此问题,请确保您尝试使用 2.0.7+

于 2012-07-25T13:05:36.067 回答