使用文件系统快照备份分片群集

在本页面

在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,该过程可以与MMAPv1WiredTiger存储引擎一起使用。在 MongoDB 的早期版本中,该过程仅适用于MMAPv1

Overview

本文档介绍了备份sharded cluster的所有组件的过程。此过程使用文件系统快照来捕获mongod实例的副本。当文件系统快照不可用时,另一个过程使用mongodump创建二进制数据库转储。有关替代过程,请参见使用数据库转储备份分片群集

Important

要从分片群集中捕获时间点备份,您必须**停止全部写入群集。在运行的生产系统上,您只能捕获时间点快照的“近似值”。

有关 MongoDB 中的备份(尤其是分片群集的备份)的更多信息,请参阅MongoDB 备份方法备份和还原分片群集

Considerations

Balancer

在捕获备份之前,您必须停止balancer,这是“必不可少的”。

如果在捕获备份时平衡器处于活动状态,则备份工件可能不完整和/或具有重复数据,因为chunks可能会在记录备份时迁移。

Precision

在此过程中,您将停止集群平衡器并备份config database,然后使用文件系统快照工具对集群中的每个分片进行备份。如果需要准确的系统即时快照,则需要先停止所有应用程序写操作,然后再获取文件系统快照。否则,快照将仅近似时间。

对于近似的时间点快照,可以通过从每个副本集碎片的辅助成员中进行备份来最大程度地减少对群集的影响。

Consistency

如果日志文件和数据文件在同一逻辑卷上,则可以使用单个时间点快照来捕获数据文件的一致副本。

如果日志文件和数据文件位于不同的文件系统上,则必须使用db.fsyncLock()db.fsyncUnlock()来确保数据文件不变,从而为创建备份提供了一致性。

RAID 10 配置中的 Amazon EBS 快照

如果您的部署依赖于实例中配置了 RAID 的 Amazon 弹性块存储(EBS),则无法使用平台的快照工具在所有磁盘上获得一致的状态。或者,您可以执行以下任一操作:

如果选择此选项,请参见备份具有单独卷上的日记文件或没有日记的实例

如果选择此选项,请执行创建快照中描述的 LVM 备份操作。

Procedure

禁用平衡器。

mongo Shell 连接到群集mongos实例。使用sh.stopBalancer()方法停止平衡器。如果正在进行平衡,则操作将在停止平衡器之前 await 平衡完成。

use config
sh.stopBalancer()

有关更多信息,请参见禁用平衡器过程。

如有必要,请锁定每个副本集的一个辅助成员。

如果您的辅助服务器未启用日记功能,或者其日志文件和数据文件位于不同的卷上,则必须在捕获备份之前锁定辅助服务器的mongod实例。

如果辅助节点启用了日记功能,并且其日记文件和数据文件位于同一卷上,则可以跳过此步骤。

Important

如果部署需要此步骤,则必须在每个分片的一个辅助节点和配置服务器副本集(CSRS)的一个辅助节点上执行此步骤。

确保oplog具有足够的容量,以允许这些备用副本在完成备份过程后赶上原始副本的状态。有关更多信息,请参见Oplog Size

锁定分片副本集为次要。

对于分片群集中的每个分片副本集,请确认成员已复制数据直到某个控制点。为了进行验证,首先将mongo shell 连接到分片主数据库,并对控件集合执行带有"majority"写关注的写操作:

use config
db.BackupControl.findAndModify(
   {
     query: { _id: 'BackupControlDocument' },
     update: { $inc: { counter : 1 } },
     new: true,
     upsert: true,
     writeConcern: { w: 'majority', wtimeout: 15000 }
   }
);

该操作应返回修改后的(或插入的)控制文档:

{ "_id" : "BackupControlDocument", "counter" : 1 }

在分片辅助成员中查询返回的控制文档。将mongoShell 连接到辅助分区以进行锁定,然后使用db.collection.find()查询控制文档:

db.getMongo().setReadPref('secondary');

use config;

db.BackupControl.find(
   { "_id" : "BackupControlDocument", "counter" : 1 }
).readConcern('majority');

如果辅助成员包含最新的控制文档,则可以安全地锁定该成员。否则,请 await 该成员包含该文档,或选择另一个包含最新控制文档的辅助成员。

要锁定辅助成员,请对该成员运行db.fsyncLock()

db.fsyncLock()

将配置服务器副本锁定为辅助设置。

如果锁定 CSRS 的辅助服务器,请确认成员已复制数据到某个控制点。为了进行验证,首先将mongoShell 连接到 CSRS 主服务器,然后对控件集合执行"majority"写关注的写操作:

use config
db.BackupControl.findAndModify(
   {
     query: { _id: 'BackupControlDocument' },
     update: { $inc: { counter : 1 } },
     new: true,
     upsert: true,
     writeConcern: { w: 'majority', wtimeout: 15000 }
   }
);

该操作应返回修改后的(或插入的)控制文档:

{ "_id" : "BackupControlDocument", "counter" : 1 }

在 CSRS 次要成员中查询返回的控制文档。将mongoShell 连接到 CSRS 辅助服务器以进行锁定,并使用db.collection.find()查询控制文档:

db.getMongo().setReadPref('secondary');
use config;

db.BackupControl.find(
   { "_id" : "BackupControlDocument", "counter" : 1 }
).readConcern('majority');

如果辅助成员包含最新的控制文档,则可以安全地锁定该成员。否则,请 await 该成员包含该文档,或选择另一个包含最新控制文档的辅助成员。

要锁定辅助成员,请对该成员运行db.fsyncLock()

db.fsyncLock()

备份其中一台配置服务器。

Note

备份config server会备份分片群集的元数据。您只需要备份一台配置服务器,因为它们都保存相同的数据。对锁定的 CSRS 次要成员执行此步骤。

要创建配置服务器的文件系统快照,请遵循创建快照中的过程。

备份每个分片的副本集成员。

如果您锁定了副本集分片的成员,请对锁定的辅助数据库执行此步骤。

您可以并行备份分片。对于每个分片,使用使用文件系统快照备份和还原中的过程创建快照。

解锁所有锁定的副本集成员。

如果您锁定了任何mongod个实例来捕获备份,请解锁它们。

要解锁副本集成员,请在mongo shell 中使用db.fsyncUnlock()方法。

db.fsyncUnlock()

启用平衡器。

要重新启用 balancer,请将mongo shell 连接到mongos实例并运行sh.setBalancerState()

sh.setBalancerState(true)
首页