首页/数据/NoSQL 速查/rs.stepDown 主动主从切换
MongoDB99 条

rs.stepDown 主动主从切换

让主节点主动退位触发选举,便于滚动维护;stepDown(60) 表示 60 秒内不参与竞选,为新主节点让路。

NoSQL 速查数据更新于 2026-10-13

是什么

rs.stepDown() 让当前主节点主动退位并触发一次选举,把写权限交给其他合格成员。它是滚动维护的标准开场动作:要让某台机器停机、升级或做危险操作,先把它从主节点位置上请下来,避免维护过程中业务写入被中断。退位后该节点在指定秒数内不再参与竞选。

基本信息

语法rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)
默认行为不传参数时该节点在约 60 秒内不参与竞选
执行位置只能在当前主节点上执行,且存在已追平的可选举从节点
配套命令rs.freeze(seconds) 冻结某节点一段时间内不参与竞选
核对方式db.hello().isWritablePrimary、rs.status().members[].stateStr

典型使用场景

  • 滚动维护:把主节点切走后再停机或升级,业务写入由其他成员承接
  • 调整优先级:想让某台机器当主节点,先 stepDown 让位,再靠优先级接管
  • 验证高可用:演练式地触发一次切换,检验驱动重试与监控告警是否按预期工作
  • 性能定位:怀疑主节点所在主机存在硬件问题时,把主切换到另一台机器做对照观察
  • 变更分片或配置前的准备:让维护动作落在从节点角色上,降低影响面

切换与核对

切换与核对
rs.status().members.map(m => m.name + " " + m.stateStr + " priority=" + m.priority)  # 先确认有可当选的从节点
rs.stepDown(60)                       # 退位,60 秒内不再竞选
rs.status().myState                   # 当前节点应变为 2(SECONDARY)
db.hello().isWritablePrimary          # 应为 false,说明写权限已交接
rs.freeze(120)                        # 之后想再切回来时可先用 freeze 控制竞选时机
rs.printSecondaryReplicationInfo()    # 切换后确认新主与从节点的同步状况

相关命令读法

命令或字段含义异常表现
rs.stepDown主动退位并触发选举报无可用候选节点错误
rs.freeze指定秒数内不参与竞选过大值会拖长维护窗口
myState本节点角色:1 主、2 从长时间既不主也不从
isWritablePrimary当前是否可接受写入切换后仍为 true,说明切换未生效
stateStr成员状态文本大量 RECOVERING 说明跟不上
切换窗口内会出现短暂的写入失败与连接重定向:客户端驱动对可重试写会自动重试一次,但非幂等的自定义逻辑仍需应用侧处理。切换前要确认应用没有把「写失败」当成业务失败直接落库。
单节点复制集无法完成切换,没有可当选的成员时 stepDown 会直接失败;被设为 priority 0、hidden 或延迟的成员都不具备接任资格,动手前先核对配置。

易错点

  • 没有可选举从节点时执行 stepDown:命令报错,切换没有发生,若此时恰好同时在做维护,会造成长时间不可写
  • 把 stepDown 当成「无感切换」:实际存在秒级不可写窗口,必须依赖驱动的重试机制并提前验证
  • 切换后立刻在新主上做大动作(重建索引、大范围更新),此时新主还在承接切换流量,容易出现连锁超时
  • 忘了配合 rs.freeze,在其他成员维护期间被意外选为主,导致维护中的机器承担写入

数据来源与参考

  • MongoDB Manual: rs.stepDown()
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌