是什么
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 或延迟的成员都不具备接任资格,动手前先核对配置。