MongoDB 副本集 Primary 节点变为 Secondary 通常是由主动执行降级命令、节点故障或优先级配置变更触发的。恢复主节点身份需要通过 rs.stepDown() 强制重新选举或调整副本集配置优先级,操作期间会产生秒级连接闪断。
先说结论:Primary 变 Secondary 多为预期内的选举切换或故障转移,恢复需人工干预选举或等待自动恢复。
- 先确认:使用 rs.status() 查看当前节点状态和副本集配置优先级。
- 先处理:通过 rs.stepDown() 强制当前 Primary 降级或修改 priority 提升目标节点权重。
- 再验证:再次执行 rs.status() 确认目标节点 stateStr 变为 PRIMARY 且集群可写。
命令速用版
以下命令需在 MongoDB Shell 中连接到当前 Primary 节点执行:
rs.stepDown()
rs.stepDown(60)
rs.status()若需指定特定节点成为 Primary,可结合优先级配置:
cfg = rs.conf()
cfg.members[0].priority = 2
rs.reconfig(cfg)为什么会这样
Primary 节点变为 Secondary 是副本集选举机制的正常表现,通常由降级命令、网络分区或进程重启引起。
MongoDB 副本集依赖多数派选举产生 Primary,当当前 Primary 执行 rs.stepDown() 命令时,它会主动放弃主身份并进入 Secondary 状态一段时间。此外,若 Primary 节点宕机、网络不可达或优先级被调低,副本集会自动触发选举流程,导致原 Primary 降级或新节点晋升。
分步处理
恢复或切换主节点需按顺序执行状态检查、选举干预和配置调整。
步骤 1:检查副本集状态
连接任意节点执行 rs.status(),确认当前 Primary 节点身份及所有成员健康状态(health 应为 1)。
步骤 2:执行强制降级或切换
若希望当前 Primary 主动让位,登录该节点执行 rs.stepDown(60),该命令会让 Primary 降级为 Secondary 并维持 60 秒,触发新选举。
若希望特定 Secondary 晋升,可先登录该 Secondary 执行 rs.freeze(300) 冻结其他节点,再对原 Primary 执行降级。
步骤 3:调整优先级(可选)
若需固定主节点身份,修改配置提升目标节点优先级:获取配置 cfg = rs.conf(),修改对应成员 cfg.members[index].priority = 2,最后执行 rs.reconfig(cfg) 生效。
怎么验证是否生效
验证核心是确认目标节点状态字段变为 PRIMARY 且具备写权限。
执行 rs.status() 查看输出中 myState 为 1 且 stateStr 为 "PRIMARY" 的节点是否为目标实例。尝试在该节点执行写入操作(如插入文档),若无权限报错则切换未成功。云数据库控制台切换后,实例状态约 1 分钟左右恢复正常。
常见坑
操作过程中需注意连接闪断、自动回切和优先级陷阱。
- 连接闪断:触发主从切换后,会产生 1 次 30 秒内的连接闪断,应用需具备重连机制。
- 自动回切:若原 Primary 节点优先级最高且网络恢复,执行 rs.stepDown() 后可能自动重新选举回原节点。
- 维护模式:Secondary 节点若进入 RECOVERING 或维护模式,无法参与选举,需先退出维护状态。
常见问题
Primary 节点突然变 Secondary 是故障吗?
不一定是故障,可能是主动运维操作或短暂网络波动触发的自动选举。
rs.stepDown() 命令默认降级多久?
默认让 Primary 降级为 Secondary 并维持 60 秒,期间该节点不参与选举。
如何防止特定节点成为 Primary?
将该节点的 priority 优先级设置为 0,或在其上执行 rs.freeze() 命令。
参考来源
- CSDN 博客:mongodb 副本集的常规操作_mongodb rs.stepdown
- 阿里云文档:副本集实例设置主从切换
- 阿里聚安全:MongoDB 副本集实例默认含有三个节点
- 技术社区:mongodb 副本集降级切换
- 技术社区:MongoDB 副本集主从切换方法