使用数据库转储备份自管理的分片集群
从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 开始可用)的 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
下一步
您可以使用 mongodump
备份来恢复数据库
重要
如果您要将数据库恢复到分片集群,您必须将 --nsExclude
设置为排除 config
数据库
mongorestore --nsExclude='config.*' /data/backup
有关更多信息,请参阅 使用 MongoDB 工具备份和恢复自托管部署。