Docs 主页 → 开发应用程序 → MongoDB Manual
使用文件系统快照备份分片集群
概述
本文档介绍了对分片集群的所有组件进行备份的过程。 此过程使用文件系统快照捕获 mongod
实例的副本。
重要
要备份分片集群,您必须停止对集群的所有写入。
有关 MongoDB 中的备份,特别是分片集群备份的更多信息,请参阅MongoDB 备份方法和备份和恢复分片集群。
考虑因素
跨分片事务
要使用文件系统快照进行备份,必须首先停止负载均衡器,停止写入,并停止集群上的任何模式转换操作。
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
密码配置的数据库密钥并退出。
提示
一般来说,如果对 MongoDB Enterprise 4.2+ 使用基于文件系统的备份,请尽可能使用“热”备份功能。
对于 MongoDB Enterprise 版本 4.0 及更早版本,如果您使用
AES256-GCM
加密模式,请勿复制数据文件或从文件系统快照(“热”快照或“冷”快照)进行恢复。
平衡器
在捕获备份之前,请务必停止负载均衡器。
如果在您捕获备份时负载均衡器处于活动状态,则备份项目可能不完整或包含重复数据,因为在记录备份时数据段可能会迁移。
精密
在此过程中,您将停止集群负载均衡器并备份配置数据库,然后使用文件系统快照工具备份集群中的每个分片。如果需要系统的精确快照,则需要在拍摄文件系统快照之前停止所有写入;否则,快照将只是一个近似的时间点。
一致性(Consistency)
要备份分片集群,必须使用fsync
命令或db.fsyncLock()
方法来停止对集群的写入。这可确保数据文件在备份期间不会更改。
通过采用 RAID 10 配置的 Amazon EBS 来创建快照
如果您的部署依赖于 Amazon 的 Elastic Block Storage (EBS),并在实例中配置了 RAID,则无法使用该平台的快照工具在所有磁盘上获得一致的状态。作为替代方案,您可执行下列操作之一:
将所有写入刷新到磁盘,并创建一个写入锁,以确保备份过程中的状态一致性。
如果您选择此选项,请参阅备份日志文件在单独卷上或不包含日志的实例。
配置 LVM,以便在您系统内的 RAID 上运行并保存您的 MongoDB 数据文件。
如果选择此选项,请执行创建快照中描述的逻辑卷管理器备份操作。
版本兼容性
此过程需要支持mongos
的 fsync 锁定的 MongoDB 版本。
从 MongoDB7 开始。1 (也可从7 .0 .2 、6 .0 .11 和5 .0 .22 开始)中的fsync
fsyncUnlock
和可以在 上运行mongos
命令来锁定和解锁分片集群。
步骤
要对分片集群进行自我管理备份,请完成以下步骤:
查找备份窗口
数据段迁移、重新分片和模式迁移操作可能会导致备份不一致。要找到执行备份的最佳时间,请监控应用程序和数据库的使用情况,并找到不太可能发生这些操作的时间。
有关更多信息,请参阅为分片集群安排备份窗口。
停止负载均衡器
为防止数据段迁移中断备份,请使用sh.stopBalancer()
方法停止负载均衡器:
sh.stopBalancer()
如果当前正在进行负载均衡轮次,则该操作会等待负载均衡完成。
要确认负载均衡器已停止,请使用sh.getBalancerState()
方法:
sh.getBalancerState()
false
当负载均衡器停止时,该命令会返回false
。
锁定集群
写入数据库可能会导致备份不一致。锁定分片集群以保护数据库免遭写入。
要锁定分片集群,请使用db.fsyncLock()
方法:
db.getSiblingDB("admin").fsyncLock()
在配置服务器的mongos
和主mongod
上运行以下聚合管道。要确认锁定,请确保fysncLocked
字段返回true
且fsyncUnlocked
字段返回false
。
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } }, { fsyncLock: true } ] } }], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] )
[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
备份主配置服务器
注意
备份配置服务器会备份分片集群的元数据。您只需备份一个配置服务器,因为它们都保存相同的数据。对 CSRS 主节点执行此步骤。
要创建配置服务器的文件系统快照,请按照创建快照中的步骤进行操作。
备份主分片
使用使用文件系统快照进行备份和恢复中的过程,对每个分片的主成员执行文件系统快照。
解锁集群
备份完成后,您可以解锁集群以允许恢复写入。
要解锁集群,请使用db.fsyncUnlock()
方法:
db.getSibling("admin").fsyncUnlock()
在配置服务器的mongos
和主mongod
上运行以下聚合管道。要确认解锁,请确保fysncLocked
字段返回false
且fsyncUnlocked
字段返回true
。
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } }, { fsyncLock: 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
。