从 MongoDB 备份恢复自管理副本集

本文介绍如何取得 MongoDB 数据,并将其恢复到新的副本集。可以用生产备份初始化测试部署,也可以用于灾难恢复。

重要:不能把同一份数据分别恢复到三个新的 mongod 实例,再创建副本集。这样做会迫使从节点执行初始同步。本文的方法才是正确且高效的恢复副本集流程。

也可以使用 mongorestore,恢复由 mongodump 创建的数据。详情参阅“使用 MongoDB 工具备份和恢复”。

注意事项

备份是数据库在某个时刻的状态快照。从备份恢复后,数据库不包含备份创建之后的变化,因此可能丢失后续数据。

将数据库恢复到单节点副本集

1. 获取 MongoDB 数据库备份文件

备份文件可以来自文件系统快照。MongoDB Cloud Manager 可以为保存的快照及时间点快照生成 MongoDB 数据库文件。MongoDB Enterprise Advanced 提供的本地部署方案 Ops Manager,也有相应的备份概览文档。

加密存储引擎注意事项

使用 AES256-GCM 加密模式时,要求每个进程对同一密钥使用唯一的计数器块值。

如果加密存储引擎使用 AES256-GCM:

  • 从热备份恢复:如果备份文件是在 mongod 运行期间生成的,MongoDB 启动时会识别“脏”密钥,并自动轮换数据库密钥,避免重复使用初始化向量 IV。
  • 从冷备份恢复:如果备份文件是在 mongod 停止期间生成的,MongoDB 启动时无法识别“脏”密钥。IV 重用会破坏机密性与完整性保证。为避免从冷文件系统快照恢复后重用密钥,MongoDB 提供 --eseDatabaseKeyRollover 命令行选项。以此选项启动 mongod,会轮换使用 AES256-GCM 的数据库密钥,然后退出。

2. 如果备份包含 local 数据库,删除它

从文件系统备份,或任何包含 local 数据库的备份恢复时,需要删除 local 数据库。

先使用备份数据文件作为数据路径,启动独立的 mongod。必须同时指定创建快照时使用的相同启动选项:

mongod --dbpath /data/db <startup options>

通过 mongosh 连接实例,删除 local 数据库:

use local
db.dropDatabase()

然后关闭这个独立实例。

3. 启动新的单节点副本集

启动 mongod,作为新的单节点副本集。用 --dbpath 指定备份数据路径,用 --replSet 指定副本集名称。配置服务器副本集(CSRS)还需要 --configsvr。根据部署情况加入其他选项。

必须保留创建快照时使用的相同启动选项。

注意:如果成员运行在不同主机,或者希望远程客户端连接实例,必须指定 net.bindIp 或 --bind_ip。

警告:绑定到可公开访问的 IP 前,必须防止未授权访问。完整建议见自管理部署安全清单;至少应考虑启用身份验证并加固网络基础设施。

mongod --dbpath /data/db --replSet <replName> <startup options>

注意:MongoDB 集合默认具有 UUID。恢复集合时会保留原有 UUID;如果被恢复集合原本没有 UUID,MongoDB 会生成一个。详情见集合文档。

4. 使用 mongosh 连接 mongod

在运行 mongod 的同一机器上启动 mongosh。本教程为 mongodb0.example.net。连接监听 localhost 默认端口 27017 的实例,只需运行:

mongosh

根据路径配置,可能需要指定 mongosh 二进制文件完整路径。如果 mongod 不在默认端口运行,给 mongosh 添加 --port。

5. 初始化新副本集

只在副本集的一个成员上执行一次 rs.initiate():

rs.initiate( {
   _id : <replName>,
   members: [ { _id : 0, host : <host:port> } ]
})

MongoDB 会创建只包含当前成员、使用默认副本集配置的新副本集。

向副本集添加成员

MongoDB 提供两种恢复从节点的方式:

  • 手动把数据库文件复制到每个数据目录。
  • 让初始同步自动分发数据。

注意:大型数据库的初始同步可能耗时很长,因此直接复制数据库文件到各主机可能更合适。

复制数据库文件并重启 mongod

通过直接复制 MongoDB 数据文件,为其他成员提供恢复数据:

  1. 关闭刚恢复的 mongod。使用 --shutdown 或 db.shutdownServer(),确保干净关闭。
  2. 将主节点数据目录复制到每个从节点。目标位置是其他成员的 dbPath。
  3. 重新启动刚恢复的 mongod。
  4. 将从节点加入副本集。在连接主节点的 mongosh 会话中,使用 rs.add() 添加从节点。部署详情见自管理副本集部署文档。

使用初始同步更新从节点

通过默认的初始同步,为其他成员提供恢复数据:

  1. 清空每个候选成员的数据目录。例如 storage.dbPath 或 --dbpath 为 /data/db,就必须确保该目录存在且为空。
  2. 启动每个副本集成员。
  3. 添加每个候选成员。通过 mongo shell 连接主节点,使用 rs.add() 添加每个从节点。成员加入后,初始同步会把主节点的数据复制到新成员。

原文:Restore a Self-Managed Replica Set from MongoDB Backups。作者/维护方:MongoDB 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容