基于rs0副本集
(一主两从:27017主,27018、27019从)
部署主机:10.10.10.128
操作系统:CentOS Linux7.9.2009
MongoDB版本:4.2.25
部署日期:2026‑09‑20
一、部署概述
基于已搭建rs0副本集,做两类故障演练:
1.主节点主动降级 rs.stepDown(),观察自动选举新主节点。
2.模拟主进程宕机,kill进程,观测故障转移、角色切换,故障节点恢复后自动加入副本集作为从节点。
副本集初始状态: localhost:27017 PRIMARY priority=5 localhost:27018 SECONDARY priority=3 localhost:27019 SECONDARY priority=1
二、演练1:
主节点主动降级 stepDown
#登录当前主节点27017
mongo --port 27017
#执行主动降级,让出主节点角色
rs.stepDown(30)
#执行之后,27017会变为SECONDARY;
副本集会根据priority优先级选举新PRIMARY。
#本环境
priority:27018(priority3) >27019(priority1),27018被选举成为新主节点。
#查看副本集状态
rs.status()
#查看当前主节点
db.hello().primary
三、写入验证,新主节点可正常写数据
#连接新主节点27018
mongo --port 27018
use appdb
db.test.insertOne({"test":"stepdown_new_master"})
#登录从节点执行
rs.slaveOk(),确认数据复制同步正常。
四、演练2:模拟主节点进程崩溃(kill模拟宕机)
#假设当前主节点为27018;kill掉mongod进程模拟硬件故障
ps -ef | grep mongod
kill -9 <27018进程PID>
#等待选举超时,副本集剩余节点(27017、27019)进行投票选举新PRIMARY
#执行rs.status(),观察27018状态为not reachable,health=0
#连接存活节点查看集群状态
mongo --port 27017
rs.status()
db.hello().primary
五、故障节点恢复
#重新启动被kill的27018实例
mongod --port 27018 -dbpath /var/lib/mongo1 -logpath /var/log/mongod/mongod1.log -replSet rs0 --fork --wiredTigerCacheSizeGB 0.25
#启动完成,节点自动加入副本集,自动同步缺失oplog日志,角色变为SECONDARY,不需要手动修改配置。 rs.status()
六、关键概念说明
1.priority数值越大,越优先选为PRIMARY;0代表永远不能成为主。
2.选举需要副本集多数节点存活;3成员副本集至少2个节点在线才可以完成选举。
3.故障节点恢复依靠oplog操作日志同步丢失数据;注意oplog空间大小,长时间宕机oplog被覆盖会需要全量重同步。
七、常见问题
现象:节点无法加入副本集同步数据
排查点:防火墙、端口连通性;时间同步;oplog大小是否不足以覆盖宕机时间。
八、常用演练命令
rs.status() #副本集完整状态
rs.stepDown(sec) #主节点主动降级
db.hello().primary #快速获取当前主节点地址
rs.printReplicationInfo() #查看oplog大小、时间窗口
九、实验结论
1.MongoDB副本集在主节点故障时,集群自动完成投票选举出新主,实现故障转移高可用。
2.故障节点恢复后自动同步oplog,自动作为从节点加入集群,无需人工干预配置。
3.副本集高可用前提保证集群存活节点达到法定多数。