Overview
本文档介绍了对分片集群的所有组件进行备份的过程。 此过程使用文件系统快照来捕获 mongod
实例的副本。
重要
要备份分片集群,您必须停止对集群的所有写入。
有关MongoDB中的备份,特别是分分片的集群备份的更多信息,请参阅自管理部署的备份方法和备份和恢复自管理分片集群。
Considerations
跨分片事务
要使用文件系统快照进行备份,您必须首先停止负载均衡器、停止写入并停止集群上的任何模式转换操作。
MongoDB 提供的备份和恢复操作可以与负载均衡器一起运行,并通过以下服务运行事务:
加密存储引擎(仅限 MongoDB Enterprise)
对于使用 AES256-GCM
加密模式的加密存储引擎,AES256-GCM
要求每个进程使用带有密钥的唯一计数器块值。
对于使用 AES256-GCM
密码配置的加密存储引擎:
- 从热备份恢复
- 从 4.2 开始,如果从通过“热”备份(即
mongod
正在运行)获取的文件进行恢复,MongoDB 可以在启动时检测到“脏”密钥,并自动滚动更新数据库密钥以避免重用 IV(初始化向量)。
- 从冷备份恢复
不过,如果从通过“冷”备份(即
mongod
未运行)获取的文件进行恢复,MongoDB 无法在启动时检测到“脏”密钥,重用 IV 将导致机密性和完整性保证失效。从 4.2 版开始,为了避免从冷文件系统快照恢复后重用密钥,MongoDB 添加了一个新的命令行选项
--eseDatabaseKeyRollover
。使用--eseDatabaseKeyRollover
选项启动时,mongod
实例会滚动使用AES256-GCM
密码配置的数据库密钥并退出。
平衡器
在捕获备份之前,请务必停止负载均衡器。
如果在捕获备份时负载均衡器处于活动状态,则备份项目可能不完整或有重复的数据,因为数据块在记录备份时可能会迁移。
精度
在此过程中,您将停止集群负载均衡器并备份配置数据库,然后使用文件系统快照工具备份集群中的每个分片。如果您需要系统某一时刻的精确快照,则需要在创建文件系统快照之前停止所有写入操作;否则创建的只是近似于某一时刻的快照。
一致性(Consistency)
如要备份分片集群,必须使用 fsync
命令或 db.fsyncLock()
方法来停止对集群的写入。这有助于降低备份中出现不一致的可能性。
注意
只有完全按照这些步骤操作,并且开始时没有任何操作正在进行,才能生成一致的备份。
通过采用 RAID 10 配置的 Amazon EBS 来创建快照
如果您的部署依赖于 Amazon 的 Elastic Block Storage (EBS),并在实例中配置了 RAID,则无法使用该平台的快照工具在所有磁盘上获得一致的状态。作为替代方案,您可执行下列操作之一:
设置
fsync
锁以刷新所有写入操作,锁定集群以防止新的写入,以帮助降低备份过程中出现不一致状态的可能性。如果选择此选项,请参阅备份日志文件在单独卷上或不包含日志的实例。
配置 LVM,以便在您系统内的 RAID 上运行并保存您的 MongoDB 数据文件。
如果选择此选项,请执行创建快照中所述的逻辑卷管理器备份操作。
版本兼容性
此过程需要支持 mongos
的 fsync 锁定 MongoDB 版本。
从 MongoDB 7.1开始(也从7.0.2开始提供, 6.0.11和5.0 。22 ),则可以在fsync
上运行 和fsyncUnlock
mongos
命令以锁定和解锁分片集群。
Stale Data
备份提供数据库当前状态的快照。从备份中恢复时,恢复的数据库不包括备份后所做的任何更改,这可能会导致数据丢失。
开始之前
从MongoDB 8.0开始,您可以使用directShardOperations
角色执行需要直接对分片执行命令的分片操作。
警告
使用directShardOperations
角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations
角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations
角色。
步骤
要对分片集群进行自我管理备份,请完成以下步骤:
查找备份窗口
数据块迁移、重新分片和模式迁移操作会导致备份不一致。要找到执行备份的最佳时机,请监视应用程序和数据库的使用情况,并确定这些操作不太可能发生的时间。
有关更多信息,请参阅为自管理分片集群安排备份窗口。
停止负载均衡器
为了防止数据块迁移破坏备份,请使用 sh.stopBalancer()
方法停止平衡器:
sh.stopBalancer()
如果当前正在进行均衡轮次,则操作会等待均衡完成后再继续执行。
要验证负载均衡器是否已停止,请使用 sh.getBalancerState()
方法:
use config while( sh.isBalancerRunning().mode != "off" ) { print("waiting..."); sleep(1000); }
锁定集群
写入数据库可能会导致备份不一致。锁定分片集群以防止数据库被写入。
要锁分片集群,请在 和配置服务器的主节点 (primarydb.fsyncLock()
mongos
nodemongod
in the replica set) 上使用 方法:
db.getSiblingDB("admin").fsyncLock()
要确认锁,请在配置服务器的mongos
和主节点 (primary node inmongod
thefysncLocked
replica set) 上运行以下聚合管道。确保true
fsyncUnlocked
字段返回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 } ]
备份主节点 (primary node in the replica set)配置服务器
注意
备份配置服务器会备份分片集群的元数据。您只需备份一个配置服务器,因为它们都保存相同的数据。针对 CSRS 主节点执行此步骤。
要创建配置服务器的文件系统快照,请按照创建快照中的步骤操作。
备份主节点 (primary node in the replica set)分片
使用使用文件系统快照备份和恢复自托管Atlas 备份快照分片的过程,对每个分片的主节点 (primary node in the replica set)成员执行文件系统快照。
解锁集群
备份完成后,您必须解锁群集以允许恢复写入。
要解锁集群,请使用 db.fsyncUnlock()
方法:
db.getSibling("admin").fsyncUnlock()
在配置服务器的 mongos
和主 mongod
上运行以下聚合管道。要确认解锁,请确保 fysncLocked
字段返回 false
, fsyncUnlocked
字段返回 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 } ]
重启负载均衡器
要重新启动负载均衡器,请使用 sh.startBalancer()
方法:
sh.startBalancer()
要确认负载均衡器正在运行,请使用 sh.getBalancerState()
方法:
sh.getBalancerState()
true
当负载均衡器运行时,该命令返回 true
。