MongoDB副本集Primary怎么变Secondary了?怎么恢复?

文章导读
MongoDB 副本集 Primary 节点变为 Secondary 通常是由主动执行降级命令、节点故障或优先级配置变更触发的。恢复主节点身份需要通过 rs.stepDown() 强制重新选举或调整副本集配置优先级,操作期间会产生秒级连接闪断。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 降级或新节点晋升。

分步处理

恢复或切换主节点需按顺序执行状态检查、选举干预和配置调整。

MongoDB副本集Primary怎么变Secondary了?怎么恢复?

步骤 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) 生效。

MongoDB副本集Primary怎么变Secondary了?怎么恢复?

怎么验证是否生效

验证核心是确认目标节点状态字段变为 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 副本集主从切换方法