【问题标题】:MongoDB 2.2: why didn't replication catch up a collection following a dump/restore?MongoDB 2.2:为什么在转储/恢复后复制没有赶上集合?
【发布时间】:2014-07-02 22:04:35
【问题描述】:

我们有一个在 Ubuntu 10.04 上运行 MongoDB 2.2 的三服务器副本集,最近不得不为每个特定数据库所在的服务器升级硬盘驱动器。该数据库包含 Web 服务请求的日志信息,它们使用当前时间戳写入每小时存储桶中的集合以确定名称,例如log_yyyymmddhh.

我执行了这个过程:

  • 使用 mongodump --db log_db 备份主服务器上的数据库
  • 使辅助服务器脱机,更换磁盘
  • 以独立模式启动辅助服务器(即注释掉 replSet 条目 在 /etc/mongodb.conf 启动服务之前)
  • 使用 mongorestore --drop --db log_db 恢复辅助服务器上的数据库
  • 将辅助服务器重新添加到副本集中并使其联机, 让复制赶上更新/创建的每小时存储桶 离线时

一切似乎都按预期进行,除了备份时当前存储桶的集合没有通过复制更新。我不得不手动复制该集合以使其保持最新。请注意,备份之后创建的集合被同步得很好。

在这个过程中我遗漏了什么导致 MongoDB 无法为该集合恢复同步?我认为 oplog 出了点问题?

编辑 1:

主节点上的 oplog 显示其最早的时间戳可以追溯到几天前,因此应该有足够的空间来维持几个小时的事务(这是辅助节点离线的时间)。

编辑 2:

我们的 MongoDB 安装使用两个磁盘分区:/dev/sda1 和 /dev/sdb1。主要的 MongoDB 目录 /var/lib/mongodb/ 位于 /dev/sda1 上,并包含多个数据库,而日志数据库本身位于 /dev/sdb1 上。有一个符号链接 /var/lib/mongodb/log_db 指向 /dev/sdb1 上的目录。由于日志数据库已满,我们需要升级 /dev/sdb1 的磁盘。

【问题讨论】:

  • 是当前存储桶上的所有新操作还是超过特定时间的所有操作?
  • 实际上,我没有仔细检查。我刚刚看到文档数量少于主服务器上的数量,并假设没有复制更新的操作。也许是相反的方式!也许该集合未包含在初始转储中?
  • 我在想你的 oplog 可能太小了,因为你复制的时间太小了当该转储完成时存储桶,并且仅存储在当前存储桶之后创建的存储桶的新操作
  • 是的,我想到了这一点,并检查了主服务器的 oplog -- 请参阅我刚刚添加到问题中的编辑。
  • 你能在 oplog 中找到用于该桶集合的 OP 吗?我想这将是调试这个的第一步

标签: mongodb mongodump mongorestore


【解决方案1】:

您应该使用带有 --oplog 选项的 mongodump。在同时更新集合的副本集上使用 mongodump 运行完整数据库备份可能无法为您提供一致的备份。随着更大的数据库、更多的集合和更频繁的更新/插入/删除,这种情况会变得更糟。

来自您的 MongoDB 版本 (2.2) 的文档(与 2.6 相同,但尽可能准确):

--oplog

使用此选项可确保 mongodump 创建 包含 oplog 的数据库,用于创建 mongod 实例的状态。恢复到特定时间点 备份,将使用此选项创建的输出与 mongorestore --oplogReplay。

不带--oplog,如果dump过程中有写操作 操作时,转储不会及时反映。变化 在更新过程中对数据库进行的操作会影响输出 备份。

http://docs.mongodb.org/v2.2/reference/mongodump/

大多数 MongoDB 教程中都没有很好地涉及备份和恢复。通常,如果您可以对数据库所在的存储卷执行实时快照(假设您的存储解决方案具有与 MongoDB 兼容的实时快照功能),您会更好。如果做不到这一点,您的下一个最佳选择是使辅助脱机,然后执行数据库文件的快照或备份。由于性能问题,实时数据库上的 Mongodump 越来越不是大型数据库的最佳解决方案。

我一定会看看 MongoDB 的备份选项概述:http://docs.mongodb.org/manual/core/backups/

【讨论】:

  • 你知道,我很快就读到了 --oplog 选项,但完全没有理解它的用法。听起来这就是我错过的。在我更换磁盘之前,最好按照您的建议进行操作,并在辅助节点处于脱机状态时从它获取转储。谢谢!
  • 尽管这个答案确实说明了最佳实践,但它并没有说明如何或为什么应用了某些操作而其他操作没有,但无论如何,OP 似乎想真正了解下一次的最佳实践。 ..
【解决方案2】:

我猜这与 oplog 不够长有关,尽管您似乎检查过它并且看起来相当大。

不过,在将新成员添加到副本集时,您不应该对它们进行快照和恢复。最好简单地添加一个新成员并让复制自己发生。 This is described in the Mongo docs 是我一直遵循的流程。

【讨论】:

  • 从技术上讲,这不是一个新成员。在执行 mongorestore 时,我只将辅助服务器从副本集中取出。我已经完成了转储/恢复,因为我知道 oplog 没有回溯到足够远来包含我想要保留的所有每小时存储桶。
  • 如果你更换磁盘,它基本上是一个新的服务器,因为它没有任何数据。除了语义,如果 IMO 发生任何异常情况,最好将节点视为新成员。
  • 是的,但是这个练习是关于只为一个数据库升级磁盘,该数据库与服务器的其余数据库位于一个单独的分区 (/dev/sdb1) 上。我会在问题中添加更多细节!
  • 顺便说一句,感谢您对此的反馈。我确实检查了您引用的 Mongo 文档,并且那里的“生产说明”部分确实讨论了使用备份让成员快速上线。我仍然不确定我在这个过程中错过了什么。
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多