Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

使用文件系统快照备份自管理的分片集群

在此页面上

  • 概述
  • 注意事项
  • 步骤

本文档介绍了对分片集群的所有组件进行备份的过程。此过程使用文件系统快照捕获 mongod实例的副本。

重要

要备份分片集群,您必须停止对集群的所有写入。

有关 MongoDB 中的备份,特别是分片集群备份的更多信息,请参阅自管理部署的备份方法备份和恢复自管理分片集群。

要使用文件系统快照进行备份,您必须首先停止负载均衡器、停止写入并停止集群上的任何模式转换操作。

MongoDB 提供的备份和恢复操作可以与负载均衡器一起运行,并通过以下服务运行事务:

  • MongoDB 阿特拉斯

  • MongoDB Cloud Manager

  • MongoDB Ops Manager

对于使用 AES256-GCM 加密模式的加密存储引擎AES256-GCM 要求每个进程使用带有密钥的唯一计数器块值。

对于使用 AES256-GCM 密码配置的加密存储引擎

  • 从热备份恢复
    从 4.2 开始,如果从通过“热”备份(即 mongod 正在运行)获取的文件进行恢复,MongoDB 可以在启动时检测到“脏”密钥,并自动滚动更新数据库密钥以避免重用 IV(初始化向量)。
  • 从冷备份恢复

    不过,如果从通过“冷”备份(即 mongod 未运行)获取的文件进行恢复,MongoDB 无法在启动时检测到“脏”密钥,重用 IV 将导致机密性和完整性保证失效。

    从 4.2 版开始,为了避免从冷文件系统快照恢复后重用密钥,MongoDB 添加了一个新的命令行选项 --eseDatabaseKeyRollover。使用 --eseDatabaseKeyRollover 选项启动时,mongod 实例会滚动使用 AES256-GCM 密码配置的数据库密钥并退出。

提示

一般来说,如果对 MongoDB Enterprise 使用基于文件系统的备份,请尽可能使用“热”备份功能。

在捕获备份之前,请务必停止负载均衡器

如果在捕获备份时负载均衡器处于活动状态,则备份项目可能不完整或有重复的数据,因为数据块在记录备份时可能会迁移。

在此过程中,您将停止集群负载均衡器并备份配置数据库,然后使用文件系统快照工具备份集群中的每个分片。如果您需要系统某一时刻的精确快照,则需要在创建文件系统快照之前停止所有写入操作;否则创建的只是近似于某一时刻的快照。

如要备份分片集群,必须使用 fsync 命令或 db.fsyncLock() 方法来停止对集群的写入。这有助于降低备份中出现不一致的可能性。

注意

只有完全按照这些步骤操作,并且开始时没有任何操作正在进行,才能生成一致的备份。

如果您的部署依赖于 Amazon 的 Elastic Block Storage (EBS),并在实例中配置了 RAID,则无法使用该平台的快照工具在所有磁盘上获得一致的状态。作为替代方案,您可执行下列操作之一:

  • 设置 fsync 锁以刷新所有写入操作,锁定集群以防止新的写入,以帮助降低备份过程中出现不一致状态的可能性。

    如果选择此选项,请参阅备份日志文件在单独卷上或不包含日志的实例

  • 配置 LVM,以便在您系统内的 RAID 上运行并保存您的 MongoDB 数据文件。

    如果选择此选项,请执行创建快照中所述的逻辑卷管理器备份操作。

此过程需要支持 mongos 的 fsync 锁定 MongoDB 版本。

从 MongoDB 5.0.22开始, fsyncfsyncUnlock命令可以在mongos上运行,以锁定和解锁分片集群。

要对分片集群进行自我管理备份,请完成以下步骤:

1

数据块迁移、重新分片和模式迁移操作会导致备份不一致。要找到执行备份的最佳时机,请监视应用程序和数据库的使用情况,并确定这些操作不太可能发生的时间。

有关更多信息,请参阅为自管理分片集群安排备份窗口。

2

为了防止数据块迁移破坏备份,请使用 sh.stopBalancer() 方法停止平衡器:

sh.stopBalancer()

如果当前正在进行均衡轮次,则操作会等待均衡完成后再继续执行。

要验证负载均衡器是否已停止,请使用 sh.getBalancerState() 方法:

use config
while( sh.isBalancerRunning().mode != "off" ) {
print("waiting...");
sleep(1000);
}
3

写入数据库可能会导致备份不一致。锁定分片集群以防止数据库被写入。

若要锁定分片集群,请使用 db.fsyncLock() 方法:

db.getSiblingDB("admin").fsyncLock()

在配置服务器的 mongos 和主 mongod 上运行以下聚合管道。要确认锁定,请确保 fysncLocked 字段返回 truefsyncUnlocked 字段返回 false

db.getSiblingDB("admin").aggregate( [
{ $currentOp: { } },
{ $facet: {
"locked": [
{ $match: { $and: [
{ fsyncLock: { $exists: true } }
] } }],
"unlocked": [
{ $match: { fsyncLock: { $exists: false } } }
]
} },
{ $project: {
"fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
"fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
} }
] )
[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
4

注意

备份配置服务器会备份分片集群的元数据。您只需备份一个配置服务器,因为它们都保存相同的数据。针对 CSRS 主节点执行此步骤。

要创建配置服务器的文件系统快照,请按照创建快照中的步骤操作

6

备份完成后,您必须解锁群集以允许恢复写入。

要解锁集群,请使用 db.fsyncUnlock() 方法:

db.getSibling("admin").fsyncUnlock()

在配置服务器的 mongos 和主 mongod 上运行以下聚合管道。要确认解锁,请确保 fysncLocked 字段返回 falsefsyncUnlocked 字段返回 true

db.getSiblingDB("admin").aggregate( [
{ $currentOp: { } },
{ $facet: {
"locked": [
{ $match: { $and: [
{ fsyncLock: { $exists: true } }
] } }],
"unlocked": [
{ $match: { fsyncLock: { $exists: false } } }
]
} },
{ $project: {
"fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
"fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
} }
] )
[ { fsyncLocked: false }, { fsyncUnlocked: true } ]
7

要重新启动负载均衡器,请使用 sh.startBalancer() 方法:

sh.startBalancer()

要确认负载均衡器正在运行,请使用 sh.getBalancerState() 方法:

sh.getBalancerState()
true

当负载均衡器运行时,该命令返回 true

后退

恢复分片集群