一、集群信息
主机名称 | IP地址 | 系统版本 | 集群模式 | 集群角色 |
---|---|---|---|---|
mongodb01 | 192.168.86.11 | CentOS Linux release 7.7.1908 | replication | PRIMARY |
mongodb02 | 192.168.86.12 | CentOS Linux release 7.7.1908 | replication | SECONDARY |
mongodb04 | 192.168.86.14 | CentOS Linux release 7.7.1908 | replication | SECONDARY |
二、数据准备
1、基础数据准备
mongo 192.168.86.11:27017
use duanshuaixing-mongodb-test
for(i=1; i<=500000;i++){ db.user.insert( {name:'mytest'+i, age:i} ) }
查询数据条数 db.user.count()
2、基础数据准备完成后停掉192.168.86.14节点并删除数据目录
ssh 192.168.86.14
systemctl stop mongod.service
rm -rf /var/lib/mongo
三、节点恢复场景验证,测试1
1、查看集群状态并再次插入数据
mongo 192.168.86.11:27017
use admin
rs.status()
"_id" : 3,
"name" : "192.168.86.14:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
use duanshuaixing-mongodb-test1
for(i=1; i<=500000;i++){ db.user.insert( {name:'mytest1'+i, age:i} ) }
查询数据条数 db.user.count()
2、拷贝192.168.86.12的数据目录到192.168.86.14,拷贝完成启动mongo服务
ssh 192.168.86.12
scp -r /var/lib/mongo 192.168.86.14:/var/lib/
ssh 192.168.86.14
cd /var/lib/
chown -R mongod:mongod mongo
systemctl start mongod.service
测试1拷贝数据后未修改数据目录属组和属主导致mongo启动失败报错截图
3、恢复节点启动后,在正在插入数据场景下查看集群状态
测试1结果截图
结论:
1>由截图可知在数据插入场景下使用SECONDARY节点数据恢复另外一个SECONDARY节点可以正常恢复
2>被恢复的节点会同步另外一个SECONDARY数据,进行数据同步,也可能是同步PRIMARY
四、节点恢复场景验证,测试2
1、停掉192.168.86.14节点并删除数据目录
ssh 192.168.86.14
systemctl stop mongod.service
rm -rf /var/lib/mongo
2、停掉192.168.86.12节点
ssh 192.168.86.12
systemctl stop mongod.service
3、停掉2个节点后查看集群状态
mongo 192.168.86.11:27017
use admin
rs.slaveOk()
rs.status()
4、拷贝192.168.86.12的数据目录到192.168.86.14,拷贝完成启动2个 SECONDARY节点mongo服务
ssh 192.168.86.12
scp -rp /var/lib/mongo 192.168.86.14:/var/lib/
systemctl start mongod.service
ssh 192.168.86.14
cd /var/lib/
chown -R mongod:mongod mongo
systemctl start mongod.service
5、测试结论
1>mongo在在只有mongo PRIMARY节点存活状态下数据库读写功能,集群PRIMARY节点变为SECONDARY,无法写入
2>mongo 3节点挂掉2个SECONDARY再恢复集群状态,恢复1个SECONDARY后,原PRIMARY节点恢复,集群读写恢复正常,通过数据恢复的节点状态也恢复正常