【发布时间】: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