使用数据库转储备份分片群集
在本页面
在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,可以对MMAPv1和WiredTiger存储引擎使用以下过程。在 MongoDB 的早期版本中,该过程仅适用于MMAPv1。
Overview
本文档介绍了备份sharded cluster的所有组件的过程。此过程使用mongodump创建mongod实例的转储。
您也可以使用文件系统快照捕获备份数据。如果您的系统配置支持文件系统快照,则在某些情况下可能会更有效。
有关 MongoDB 中的备份(尤其是分片群集的备份)的更多信息,请参阅MongoDB 备份方法和备份和还原分片群集。
Prerequisites
Important
要从分片群集中捕获时间点备份,您必须**停止全部写入群集。在运行的生产系统上,您只能捕获时间点快照的“近似值”。
Access Control
backup角色提供了在启用了访问控制的分片群集上执行备份所需的特权。
在版本 3.2.1 中进行了更改:backup角色提供了额外的特权来备份使用database profiling运行时存在的system.profile集合。以前,用户需要对此集合具有额外的read
访问权限。
Consideration
要创建分片集群的备份,您将停止集群平衡器,对config database进行备份,然后使用mongodump对集群中的每个分片进行备份以捕获备份数据。为了捕获更准确的系统即时快照,您将需要先停止所有应用程序写操作,然后再获取文件系统快照。否则,快照将仅近似时间。
对于近似的时间点快照,可以通过从每个副本集碎片的辅助成员中进行备份来最大程度地减少对群集的影响。
Procedure
禁用平衡器进程。
要禁用balancer,请将mongo shell 连接到mongos实例,然后在config
数据库中运行sh.stopBalancer()。
use config
sh.stopBalancer()
有关更多信息,请参见禁用平衡器过程。
Warning
如果不停止平衡器,则在记录备份时,由于chunks迁移,备份中可能有重复数据或忽略了数据。
锁定每个副本集的一个辅助成员。
锁定分片群集中每个副本集的辅助成员,并锁定配置服务器副本集(CSRS)的一个辅助成员。
确保oplog具有足够的容量,以允许这些备用副本在完成备份过程后赶上原始副本的状态。有关更多信息,请参见Oplog Size。
锁定分片副本集为次要。
对于分片群集中的每个分片副本集,将mongo shell 连接到辅助成员的mongod实例并运行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()
备份一台配置服务器。
针对配置服务器mongod实例运行mongodump以备份群集的元数据。您只需要备份一台配置服务器。对锁定的配置服务器执行此步骤。
使用mongodump和--oplog选项来备份config servers之一。
mongodump --oplog
如果您的部署使用 CSRS 配置服务器,请先解锁配置服务器节点,然后再 continue 下一步。要解锁 CSRS 成员,请在mongo shell 中使用db.fsyncUnlock()方法。
db.fsyncUnlock()
备份每个分片的副本集成员。
使用mongodump和--oplog选项备份分片的锁定副本集成员。您可以并行备份分片。
mongodump --oplog
解锁每个分片的副本集成员。
要解锁副本集成员,请在mongo shell 中使用db.fsyncUnlock()方法。
db.fsyncUnlock()
允许这些成员赶上主数据库的状态。
重新启用平衡器过程。
要重新启用 balancer,请将mongo shell 连接到mongos实例并运行sh.setBalancerState()。
use config
sh.setBalancerState(true)