Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

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

在此页面上

  • 关于此任务
  • 开始之前
  • 步骤
  • 后续步骤

从 MongoDB 7.1开始(也从7.0.2开始提供, 6.0.11和5.0 。 22 ), 您可以使用 mongodump备份分片集群上的数据。

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

要使用 mongodump 备份分片集群,您必须停止负载均衡器、停止写入并停止集群上的任何架构转换操作。这有助于降低备份中出现不一致的可能性。

MongoDB 提供的备份和恢复操作可以与负载均衡器一起运行,并通过以下服务运行事务:

此任务使用 mongodump 来备份分片集群。请确保运行的群集包含分片集合中的数据。

此过程需要支持 mongos的fsync锁定的MongoDB版本。

从 MongoDB 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

您可以使用 mongorestoremongodump 备份还原数据库。

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

  • 要迁移到副本集或独立服务器,请针对 mongod 执行mongorestore

重要

如果要将数据库恢复到分分片集群,则必须设立 --nsExclude以排除config 数据库:

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

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

后退

使用Atlas 备份快照