使用数据库转储备份自管理分片集群
从 MongoDB 7.1开始(也从7.0.2开始提供, 6.0.11和5.0 。 22 ), 您可以使用 mongodump
备份分片集群上的数据。
关于此任务
mongodump
是一个实用程序,用于创建数据库内容的二进制导出。 您可以使用mongodump
实用程序对分片集群进行自我管理备份。
要使用 mongodump
备份分片集群,您必须停止负载均衡器、停止写入并停止集群上的任何架构转换操作。这有助于降低备份中出现不一致的可能性。
MongoDB 提供的备份和恢复操作可以与负载均衡器一起运行,并通过以下服务运行事务:
开始之前
此任务使用 mongodump
来备份分片集群。请确保运行的群集包含分片集合中的数据。
版本兼容性
此过程需要支持 mongos
的fsync锁定的MongoDB版本。
从 MongoDB 7.0.2 开始(也可以从 6.0.11 和 5.0.22 开始使用),fsync
和 fsyncUnlock
命令可以在 mongos
上运行,以锁定和解锁分片集群。
管理员权限
要使用此操作步骤,MongoDB 用户必须拥有 fsync
授权,可通过自定义角色或使用内置的 hostManager
角色来获得此授权。
通过此授权,您可以运行 fsync
和 fsyncUnlock
命令。
步骤
要对分片集群进行自我管理备份,请完成以下步骤:
查找备份窗口
要找到执行备份的好时机,请监控应用程序和数据库的使用情况,以找到不太可能发生数据块迁移、重分片和模式转换操作的时间。
注意
只有完全按照这些步骤操作,并且开始时没有任何操作正在进行,才能生成一致的备份。
有关更多信息,请参阅为自管理分片集群安排备份窗口。
停止负载均衡器
为防止数据块迁移干扰备份,请连接到 mongos
并使用 sh.stopBalancer()
方法停止负载均衡器:
sh.stopBalancer()
如果正在进行均衡轮次,则操作会等待均衡完成后再继续执行。
要验证负载均衡器是否已停止,请使用 sh.getBalancerState()
方法:
use config while( sh.isBalancerRunning().mode != "off" ) { print( "Waiting for Balancer to stop..." ); sleep( 1000 ); }
锁定集群
在备份过程中,分片集群必须保持锁定状态,以保护数据库不会被写入,因为写入可能会导致备份不一致。
要锁定分片集群,请连接到 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 } ]
进行备份
要备份分片集群,请使用 mongodump
连接到 mongos
并执行备份:
mongodump \ --host mongos.example.net \ --port 27017 \ --username user \ --password "passwd" \ --out /opt/backups/example-cluster-1
解锁集群
备份完成后,您可以解锁集群以允许恢复写入。
要解锁集群,请使用 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 } ]
重启负载均衡器
要重新启动负载均衡器,请使用 sh.startBalancer()
方法:
sh.startBalancer()
要确认负载均衡器正在运行,请使用 sh.getBalancerState()
方法:
sh.getBalancerState()
true
当负载均衡器运行时,该命令返回 true
。
后续步骤
您可以使用 mongorestore
从 mongodump
备份还原数据库。
重要
如果要将数据库恢复到分分片集群,则必须设立 --nsExclude
以排除config
数据库:
mongorestore --nsExclude='config.*' /data/backup
有关更多信息,请参阅使用MongoDB工具备份和恢复自管理部署。