参考 > 管理 > MongoDB备份方法 > 备份和还原分片群集 > 使用文件系统快照备份分片群集
本文档介绍了对分片群集的所有组件进行备份的过程。此过程使用文件系统快照来捕获mongod
实例的副本。
重要
要从分片群集中捕获时间点备份,必须停止对群集的所有写操作。在运行的生产系统上,您只能捕获时间点快照的近似值。
有关MongoDB中的备份(尤其是分片群集的备份)的更多信息,请参阅MongoDB备份方法和 备份与还原分片群集。
对于使用加密模式的加密存储引擎AES256-GCM
,AES256-GCM
要求每个进程都使用唯一的计数器块值和密钥。
对于
配置了密码的加密存储引擎AES256-GCM
:
从4.2开始,如果您从通过“热”备份(即mongod
正在运行)获取的文件中还原,则MongoDB可以在启动时检测到“脏”密钥并自动翻转数据库密钥以避免IV(初始化向量)重用。
但是,如果您从通过“冷”备份获取的文件中恢复(即mongod
未运行),则MongoDB无法在启动时检测到“脏”密钥,并且IV的重用会使机密性和完整性保证无效。
从4.2开始,为避免从冷文件系统快照还原后重新使用密钥,MongoDB添加了一个新的命令行选项--eseDatabaseKeyRollover
。使用该--eseDatabaseKeyRollover
选项启动后
,mongod
实例将滚动使用AES256-GCM
密码配置的数据库密钥
并退出。
小费
AES256-GCM
加密模式,请不要复制数据文件或从文件系统快照(“热”或“冷”)还原。在此过程中,您将停止集群平衡器并备份config数据库,然后使用文件系统快照工具对集群中的每个分片进行备份。如果需要准确的系统即时快照,则需要先停止所有应用程序写操作,然后再获取文件系统快照。否则,快照将仅近似时间。
对于近似的时间点快照,您可以通过从每个副本集碎片的辅助成员获取备份来最大程度地减少对群集的影响。
如果日志文件和数据文件在同一逻辑卷上,则可以使用单个时间点快照来捕获数据文件的一致副本。
如果日志文件和数据文件位于不同的文件系统上,则必须使用db.fsyncLock()
并db.fsyncUnlock()
确保数据文件不会更改,从而为创建备份提供了一致性。
如果您的部署依赖于实例中配置了RAID的Amazon弹性块存储(EBS),则无法使用平台的快照工具在所有磁盘上获得一致的状态。或者,您可以执行以下任一操作:
将所有写入刷新到磁盘并创建写入锁,以确保备份过程中状态的一致性。
如果选择此选项,请参阅备份具有单独卷上的日记文件或没有日记的实例。
配置LVM以将MongoDB数据文件运行并保留在系统内RAID之上。
如果选择此选项,请执行创建快照中描述的LVM备份操作。
将mongo
外壳连接到集群
mongos
实例。使用该sh.stopBalancer()
方法停止平衡器。如果正在进行平衡,则操作将等待平衡完成,然后再停止平衡器。
从MongoDB 4.2开始,sh.stopBalancer()
还会禁用分片群集的自动拆分。
有关更多信息,请参阅 禁用平衡器过程。
如果辅助节点未启用日记功能,或者其日记文件和数据文件位于不同的卷上,则必须mongod
在捕获备份之前锁定辅助节点的实例。
如果辅助节点启用了日记功能,并且其日记文件和数据文件位于同一卷上,则可以跳过此步骤。
重要
如果部署需要此步骤,则必须在每个分片的一个辅助节点和配置服务器副本集(CSRS)的一个辅助节点上执行此步骤 。
确保操作日志具有足够的容量,以允许这些备用服务器在完成备份过程后赶上主要服务器的状态。有关更多信息,请参见Oplog大小。
对于分片群集中的每个分片副本集,确认成员已复制数据到某个控制点。为了进行验证,首先将mongo
外壳连接到分片主数据库,并"majority"
在控件集合上执行写操作时执行写操作
:
该操作应返回修改后的(或插入的)控制文档:
在分片辅助成员中查询返回的控制文档。将mongo
外壳连接到辅助分区以锁定并用于db.collection.find()
查询控制文档:
如果辅助成员包含最新的控制文档,则可以安全地锁定该成员。否则,请等待该成员包含该文档,或选择另一个包含最新控制文档的辅助成员。
要锁定次要成员,请db.fsyncLock()
在该成员上运行:
如果锁定CSRS的辅助服务器,请确认成员已复制数据到某个控制点。为了进行验证,首先将mongo
外壳连接
到CSRS主服务器,并"majority"
在控件集合上执行写操作时执行写操作:
该操作应返回修改后的(或插入的)控制文档:
在CSRS次要成员中查询返回的控制文档。将mongo
外壳连接到CSRS辅助服务器以锁定并用于db.collection.find()
查询控制文档:
如果辅助成员包含最新的控制文档,则可以安全地锁定该成员。否则,请等待该成员包含该文档,或选择另一个包含最新控制文档的辅助成员。
要锁定次要成员,请db.fsyncLock()
在该成员上运行:
要重新启用平衡器,请将mongo
外壳连接到
mongos
实例并运行
sh.startBalancer()
。
从MongoDB 4.2开始,sh.startBalancer()
还可以对分片群集进行自动拆分。