手动切换主节点需满足副本集结构、节点健康和权限三重前提;最稳妥方式是当前PRIMARY上执行rs.stepDown(),强制降级并触发选举,期间原主不参选且需确保SECONDARY同步延迟≤5秒。

能手动切换,但必须满足副本集结构、节点健康状态和权限三重前提;直接调用 rs.stepDown() 是最常用且风险可控的方式。
rs.stepDown() 是最稳妥的手动降级方式
它让当前 PRIMARY 主动放弃角色,触发新一轮选举,不依赖配置变更或外部干预,适用于日常演练或紧急转移。
- 执行前确认所有
SECONDARY节点optime与主节点基本一致(rs.status()中optimeDate差距建议 ≤ 5 秒),否则新选主可能丢失未同步的写入 - 默认强制降级 60 秒,期间原主不会参选;可传参缩短,例如
rs.stepDown(15),但低于 10 秒可能导致选举失败 - 命令需在当前
PRIMARY上执行,连接地址必须是该节点直连地址(非集群入口),否则报错not master - 执行后原主立即变为
SECONDARY,状态变为STARTUP2→RECOVERING→SECONDARY,约 10–20 秒内完成
通过 priority 调整实现定向切换
适合想指定某个 SECONDARY 成为新主的场景,但必须配合 rs.reconfig(),操作更重、风险更高。
- 先获取当前配置:
config = rs.conf(),注意version字段,每次reconfig都会自增,不可重复使用旧 config - 修改目标节点的
priority值(如设为10),其他节点保持 ≤ 1,确保它在下次选举中胜出;priority: 0的节点永远无法成为主 -
rs.reconfig(config, { force: true })仅在极端情况(如多数节点宕机)下才需加force,正常情况下不加,否则可能引发双主 - 配置生效后不会立刻切换,需等原主故障或主动
stepDown才触发选举;若想立刻切,仍要配合rs.stepDown()
云厂商控制台切换的隐藏约束
阿里云、百度智能云等平台提供的“主备切换”按钮本质是封装了 rs.stepDown(),但屏蔽了底层细节,容易忽略关键限制。
- 只对副本集/分片集群有效,
mongod单节点实例点击该按钮会灰显或报错Unsupported instance type - 切换过程会产生最多 30 秒连接闪断,应用若没启用自动重连(如 MongoDB Driver 的
retryWrites=true和connectTimeoutMS设置合理),会出现Connection refused或NotMasterNoSlaveOk - 切换后,若应用硬编码使用原
PRIMARY的 IP:PORT 地址,将连上新SECONDARY,导致写失败;必须改用云平台提供的「集群连接地址」或 SRV 记录 - 部分厂商(如 UCloud)允许选择切换目标节点,底层其实是先调高其
priority再触发stepDown,但不暴露 config 修改过程
切换后验证和常见失败信号
别只看控制台显示“运行中”,得进 shell 确认角色和数据一致性。
- 登录任一节点执行
rs.isMaster(),检查ismaster字段是否为true,同时核对primary字段指向是否符合预期 - 运行
rs.printSecondaryReplicationInfo(),确认所有SECONDARY的optimeDate与新主一致,差值 > 30 秒说明同步滞后 - 如果出现两个节点都显示
stateStr: "PRIMARY",大概率是网络分区导致双主,需人工介入:停掉一个节点的 mongod 进程,再用rs.reconfig()修复配置 - 切换后写入报错
InterruptedDueToReplTimeout,通常是新主选举时 oplog 截断,需检查rs.printReplicationInfo()中的oldest时间是否覆盖了故障窗口
真正麻烦的不是切换动作本身,而是切换前后应用连接逻辑、重试机制和监控告警是否同步就位;很多故障发生在切完之后 5 分钟,而不是切换那 30 秒里。

















