一、环境信息:
IP地址 | 配置规格 | 主机名 | 系统版本 |
---|---|---|---|
192.168.86.39:27017 | 2核2G | mongodb01 | centos7.7 |
192.168.86.39:27018 | 2核2G | mongodb02 | centos7.7 |
192.168.86.39:27019 | 2核4G | mongodb03 | centos7.7 |
192.168.86.39:27020(延时节点) | 2核2G | mongodb04 | centos7.7 |
192.168.86.39:27021(集群恢复节点) | 2核4G | mongodb05 | centos7.7 |
集群模式:副本集
延时时间: 300秒(测试使用)
二、数据和环境准备
1、测试数据准备
mongo 192.168.86.39:27017(PRIMARY)
use duanshuaixing-mongodb-test
for(i=1; i<=10;i++){
db.user.insert( {name:'mongodb-test'+i, age:i} )
}
db.user.count()
db.user.find()
2、故障场景1:集群全部节点故障
思路:通过获取已有节点的数据目录启动一个新的集群,尽量使用主节点数据目录,避免从节点因延迟导致数据丢失
2.1 登录使用原数据库数据目录启动mongodb,认证信息和原集群一致
mongo 192.168.86.39:27021
rs0:OTHER> rs.slaveOk()
rs0:OTHER> use admin
rs0:OTHER> db.auth('root','rootPassw0rd')
2.2 在新启动数据库内修改主节点信息并删除其余从节点(节点网络互通的情况下会导致原有集群内节点被移除,请慎重操作)
1>获取副本集配置
rs0:OTHER> cfg=rs.conf()
rs0:OTHER> printjson(cfg)
2>查看配置节点
rs0:OTHER> printjson(cfg.members[0])
3>重新配置节点
rs0:OTHER> cfg.members[0].host="192.168.86.39:27021"
rs0:OTHER> rs.reconfig(cfg, {force : true})
4>查看数据库是否存在且数据正常
rs0:SECONDARY> show dbs
rs0:SECONDARY> use duanshuaixing-mongodb-test
rs0:SECONDARY> db.user.find().count(
5>强制删除其他节点还原为单节点副本集群
rs0:SECONDARY> use admin
rs0:SECONDARY> cfg = rs.conf()
rs0:SECONDARY> printjson(cfg)
#删除member为1、2、3的节点
rs0:SECONDARY> cfg.members.splice(1,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:SECONDARY> cfg.members.splice(2,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:SECONDARY> cfg.members.splice(3,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:PRIMARY> rs.status()
2.3 3节点集群到现在已经恢复成单节点副本集模式
节点为PRIMARY,可以正常读写mongo内数据,也可以通过mongodump等工具获取此节点误删除数据,亦可以添加其他节点组成新的集群
3、故障场景2:误删除databases, 延迟备份内数据完整,通过延迟备份恢复
0>模拟误操作删除数据库
rs0:PRIMARY> use duanshuaixing-mongodb-test
db.dropDatabase()
1>业务停止写入避免数据不一致,同时修改及时修改延时节点延时时间,避免被同步覆盖
cfg = rs.conf();
cfg.members[3].priority = 0;
cfg.members[3].hidden = true;
cfg.members[3].slaveDelay = 6000;
cfg.members[3].votes = 1;
rs.reconfig(cfg)
2>在延时节点通过mongodump导出备份数据
mongodump -h 192.168.86.39:27020 -u=root -p=rootPassw0rd -dduanshuaixing-mongodb-test --authenticationDatabase admin -o /tmp/duanshuaixing-mongodb-test-dump
3>通过备份数据恢复mongo数据库
mongorestore -h 192.168.86.39:27017 -u=root -p=rootPassw0rd --authenticationDatabase admin /tmp/duanshuaixing-mongodb-test-dump/
4、故障场景3:误删除collection的数据记录且延时备份没有储存备份信息
参考:https://www.cnblogs.com/easydb/p/14286810.html
1>数据不存在于延时节点内
#模拟删除操作
use duanshuaixing-mongodb-test
db.user.remove({ name: {$regex: "mongodb-test[4-6]"} })
#由于数据没有同步到延时节点在没有其他备份的情况下只能通过oplog恢复
0> 查看oplog窗口覆盖时间
rs.printReplicationInfo()
1>导出全量oplog
mkdir -p /tmp/oplog/
mongodump -h 192.168.86.39:27017 -u=root -p=rootPassw0rd --authenticationDatabase admin --oplog -o /tmp/oplog/
2>从全量oplog查看全备最后一个时间的数据
bsondump /tmp/oplog/oplog.bson >>/tmp/oplog/oplog.json
cat /tmp/oplog/oplog.json
{"t":1632307990,"i":1}}是上一次全备最后的时间戳
3>根据时间戳导出最后一次全备以后的增量数据
mkdir -p /tmp/oplog2
mongodump -h 192.168.86.39:27017 -u=root -p=rootPassw0rd --authenticationDatabase admin -d local -c oplog.rs -q '{"ts":{"$gt":"Timestamp(1632307990)"}}' -o /tmp/oplog2
4>恢复最后一次oplog全备
mongorestore -h 192.168.86.39:27017 -u=root -p=rootPassw0rd --authenticationDatabase admin --oplogReplay /tmp/oplog/
5>恢复增量数据
FAQ
1、缓解mongodump占用节点内存无法释放问题
mongodump --host localhost --port 27017 --db test --out /home/mongodump --numParallelCollections 1
--numParallelCollections 1 #指定并发数量为1,默认是4