分片集群的备份与恢复
分片集群的备份与恢复概述
MongoDB分片集群的备份与恢复是数据库运维中的关键环节。分片集群的分布式特性使得备份和恢复过程比单机部署更复杂,需要考虑配置服务器、分片节点以及数据均衡状态等因素。
分片集群备份策略
全量备份与增量备份
全量备份通常通过mongodump工具实现,适用于小型集群或低频备份场景。对于大型生产环境,建议结合增量备份策略:
// 全量备份示例命令
mongodump --host cluster.example.com --port 27017 --out /backup/full
// 增量备份通过oplog实现
mongodump --host cluster.example.com --port 27017 --oplog --out /backup/incr
文件系统快照备份
对于使用LVM或存储卷管理的环境,文件系统快照是更高效的备份方式:
- 停止均衡器:
sh.stopBalancer()
- 锁定所有分片实例:
db.fsyncLock()
- 创建存储快照
- 解锁实例:
db.fsyncUnlock()
- 重新启用均衡器
备份配置服务器
配置服务器存储集群元数据,必须与数据备份保持一致:
mongodump --host cfg1.example.com --port 27019 --out /backup/config
分片集群恢复方法
完整集群恢复
当需要重建整个集群时,恢复流程应为:
- 按顺序恢复配置服务器
mongorestore --host cfg1.example.com --port 27019 /backup/config
- 恢复各分片数据
mongorestore --host shard1.example.com --port 27018 /backup/shard1
- 最后恢复mongos路由配置
单分片恢复
针对单个分片的恢复需要特殊处理:
// 1. 将分片移出集群
db.adminCommand({ removeShard: "shard1" });
// 2. 恢复该分片数据
// 3. 重新将分片加入集群
sh.addShard("shard1.example.com:27018");
时间点恢复
利用oplog实现精确到秒的恢复:
mongorestore --oplogReplay --oplogLimit "1654012800:1" /backup/full
备份恢复验证
数据一致性检查
恢复后应执行验证脚本:
// 比较文档数量
function compareCounts(db1, db2, collection) {
const count1 = db1[collection].countDocuments({});
const count2 = db2[collection].countDocuments({});
return count1 === count2;
}
// 抽样数据比对
function sampleCompare(db1, db2, collection, sampleSize) {
const docs1 = db1[collection].aggregate([{ $sample: { size: sampleSize } }]);
const docs2 = db2[collection].aggregate([{ $sample: { size: sampleSize } }]);
// 比较逻辑...
}
分片键分布验证
确保恢复后数据分布符合预期:
// 检查分片键分布
db.adminCommand({ getShardDistribution: "database.collection" });
// 验证块分布
db.getSiblingDB("config").chunks.find({ ns: "database.collection" });
备份恢复优化实践
并行备份技术
大型集群可采用并行备份策略:
# 并行备份多个分片
for shard in shard1 shard2 shard3; do
mongodump --host $shard --out /backup/$shard &
done
wait
增量备份自动化
结合cron实现自动化增量备份:
0 2 * * * mongodump --host cluster.example.com --oplog --out /backup/incr/$(date +\%Y\%m\%d)
备份压缩与加密
使用现代压缩算法减少存储占用:
mongodump --gzip --out /backup/compressed
openssl enc -aes-256-cbc -in backup.tar -out backup.tar.enc
特殊场景处理
备份期间集群扩容
当备份过程中添加新分片时,需要:
- 记录扩容时间点
- 对新分片单独备份
- 在恢复时先恢复原有分片,再处理新分片
跨版本备份恢复
不同MongoDB版本间的备份恢复注意事项:
- 主版本号相同的集群间可直接恢复
- 跨主版本恢复需要先升级备份工具
- 使用
--noIndexRestore
选项避免索引兼容性问题
监控与告警配置
备份状态监控
配置监控检查备份完整性:
// 检查最近备份文件
const lastBackup = fs.statSync("/backup/latest/backup.log");
if (Date.now() - lastBackup.mtime > 86400000) {
alert("Backup overdue");
}
恢复性能指标
跟踪恢复操作的关键指标:
// 记录恢复时间
const start = Date.now();
// 执行恢复操作...
const duration = (Date.now() - start)/1000;
db.metrics.insertOne({
event: "restore",
duration: duration,
sizeGB: backupSize
});
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:Oplog备份与恢复
下一篇:搜索项目历史(git grep)