使用文件系统快照备份自管理的分片集群
概述
本文档描述了备份分片集群所有组件的流程。分片集群。此流程使用文件系统快照来捕获mongod
实例的副本。
重要
要备份分片集群,您必须停止对集群的所有写入。
有关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
密码的数据库密钥并退出。
均衡器
在捕获备份之前,您必须停止 均衡器。
如果在您捕获备份时均衡器处于活动状态,备份文件可能不完整或存在重复数据,因为 数据块 可能会在记录备份期间迁移。
精度
在此过程中,您将停止集群均衡器并备份 配置数据库,然后使用文件系统快照工具对集群中的每个分片进行备份。如果您需要系统精确时间点的快照,您必须在捕获文件系统快照之前停止所有写入;否则,快照将仅近似一个时间点。
一致性
要备份分片集群,您必须使用 fsync
命令或 db.fsyncLock()
方法来停止集群的写入。这有助于降低备份中的不一致性。
注意
只有严格按照这些步骤进行,且在开始时没有进行任何操作,才能产生一致的备份。
使用RAID 10配置的Amazon EBS快照
如果您的部署依赖于配置在实例内部的RAID的Amazon弹性块存储(EBS),则使用平台的快照工具无法在整个磁盘上获得一致的状态。作为替代方案,您可以执行以下操作之一
设置一个
fsync
锁来刷新所有写入并锁定集群以防止新的写入,从而帮助减少在备份过程中出现不一致状态的几率。如果您选择此选项,请参阅在单独的卷上备份具有日志文件的实例或无日志记录的备份。
配置LVM在系统内部的RAID上运行并保留MongoDB数据文件。
如果您选择此选项,请执行创建快照中描述的LVM备份操作。
版本兼容性
此过程需要MongoDB的版本支持从mongos
的fsync锁定。
从MongoDB 7.1开始(从7.0.2、6.0.11和5.0.22开始可用)fsync
和fsyncUnlock
命令可以在mongos
上运行以锁定和解锁分片集群。
开始之前
从 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); }
锁定集群
数据库的写操作可能导致备份不一致。锁定分片集群以保护数据库免受写入。
要锁定分片集群,请使用 db.fsyncLock()
方法
db.getSiblingDB("admin").fsyncLock()
在 mongos
和配置服务器的 primary mongod
上运行以下聚合管道。要确认已锁定,请确保 fysncLocked
字段返回 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 } ]
备份主分片
使用在使用文件系统快照备份和恢复自托管部署中找到的步骤,对每个分片的主成员执行文件系统快照。
解锁集群
备份完成后,您必须解锁集群以允许继续写入。
要解锁集群,请使用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