文档菜单
文档首页
/
MongoDB 手册
/ / / /

使用数据库转储备份自管理的分片集群

本页内容

  • 关于此任务
  • 开始之前
  • 步骤
  • 下一步

从MongoDB 7.1开始(也适用于7.0.2、6.0.11和5.0.22),您可以使用mongodump.

mongodump 是一个实用工具,可以创建数据库内容的二进制导出。您可以使用 mongodump 工具对分片集群进行自管理备份。

要使用 mongodump 备份分片集群,您必须停止均衡器、停止写入并停止集群上的任何模式转换操作。这有助于减少备份中的不一致性。

MongoDB 提供了以下服务,这些服务可以在均衡器和运行事务的情况下运行备份和恢复操作

此任务使用 mongodump 备份分片集群。请确保您有一个运行中的集群,其中包含分片集合中的数据。

此过程需要支持从 mongos 执行 fsync 锁定的 MongoDB 版本mongos.

从 MongoDB 7.1 开始(也自 7.0.2、6.0.11 和 5.0.22 开始可用)fsyncfsyncUnlock 命令可以在 mongos 上运行以锁定和解锁分片集群。

要使用此过程,您的 MongoDB 用户必须具有 fsync 授权,这可以通过自定义角色或使用内置的 hostManager 角色来获得。

有了此授权,您可以运行 fsyncfsyncUnlock 命令。

要为分片集群进行自管理备份,请完成以下步骤

1

为了找到执行备份的好时机,监控您的应用程序和数据库使用情况,以找到不太可能发生块迁移、重新分片和模式转换操作的时间。

注意

只有严格按照这些步骤执行且在开始时没有操作正在进行,才能生成一致的备份。

有关更多信息,请参阅为自托管分片集群安排备份窗口。

2

为防止块迁移干扰备份,连接到 mongos 并使用 sh.stopBalancer() 方法停止均衡器

sh.stopBalancer()

如果正在进行均衡操作,则该操作将等待均衡完成。

要验证均衡器已停止,请使用 sh.getBalancerState() 方法

use config
while( sh.isBalancerRunning().mode != "off" ) {
print( "Waiting for Balancer to stop..." );
sleep( 1000 );
}
3

在备份过程中,必须锁定分片集群,以保护数据库免受写入,这可能会导致备份不一致。

要锁定分片集群,连接到 mongos 并使用 db.fsyncLock() 方法

db.getSiblingDB("admin").fsyncLock()

为了确认锁定,在 mongos 和配置服务器的主 mongod 上运行以下聚合管道,并确保所有分片都已锁定

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 } ]
4

要备份分片集群,请使用 mongodump 连接到 mongos 并执行备份

mongodump \
--host mongos.example.net \
--port 27017 \
--username user \
--password "passwd" \
--out /opt/backups/example-cluster-1
5

备份完成后,您可以解锁集群以恢复写入操作。

要解锁集群,请使用 db.fsyncUnlock() 方法

db.getSibling("admin").fsyncUnlock()

为了确认解锁,在 mongos 和配置服务器的主 mongod 上运行以下聚合管道,并确保所有分片都已解锁

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 } ]
6

要重启负载均衡器,请使用 sh.startBalancer() 方法

sh.startBalancer()

要确认负载均衡器正在运行,请使用 sh.getBalancerState() 方法

sh.getBalancerState()
true

当负载均衡器正在运行时,命令返回 true

您可以使用 mongodump 备份来恢复数据库

  • 要恢复分片集群,请在 mongos 上执行 mongorestore

  • 要将数据迁移到副本集或独立服务器,请在 mongod 上执行 mongorestore

重要

如果您要将数据库恢复到分片集群,您必须将 --nsExclude 设置为排除 config 数据库

mongorestore --nsExclude='config.*' /data/backup

有关更多信息,请参阅 使用 MongoDB 工具备份和恢复自托管部署。

返回

使用快照