You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB副本集主节点宕机后Secondary无法执行写入操作问题

MongoDB副本集主节点宕机后Secondary无法写入的解决方法

场景说明

我使用包含Primary、Secondary、Arbitrator三个节点的MongoDB副本集,Golang连接配置如下:

opts = options.Client().ApplyURI("mongodb://" + ipPort + "," + secIpPort + "/?replicaSet=" + repSetName).SetConnectTimeout(5 * time.Second).SetAuth(serverAuth).SetWriteConcern(writeconcern.New(writeconcern.WMajority()))

其中节点地址:

  • ipPort= 192.168.1.237(原Primary节点)
  • secIpPort= 192.168.1.239(Secondary节点)

已通过以下命令设置默认读写关注:

db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : "majority", "j":true, "wtimeout" : 5000 }, writeConcern: { "w" : "majority", "j":true, "wtimeout" : 5000 }, })

问题:原Primary节点服务关闭后,Secondary节点能正常读,但无法执行写操作,需要让该节点在主节点宕机后支持读写。


核心原因

主节点宕机后,Secondary未被选举为新Primary,因此仅能提供读服务。三节点副本集(1主+1从+1仲裁)的majority投票阈值为2,理论上Secondary+Arbitrator的2票足够完成选举,未触发选举通常是集群感知不完整或配置问题导致。


解决步骤

1. 检查副本集选举状态

登录Secondary节点的MongoDB Shell,执行命令查看集群状态:

rs.status()

重点确认:

  • members数组中,原Primary的stateStr是否为DOWN,当前Secondary的stateStr是否为SECONDARY(而非PRIMARY)
  • electionCandidateMetrics字段是否有选举尝试记录,是否存在错误信息

2. 补全连接字符串中的所有节点地址

当前连接字符串仅包含主、从节点,缺少仲裁节点地址,导致客户端无法完整感知集群,影响选举流程。修改连接字符串,加入仲裁节点的IP:Port:

// 假设仲裁节点地址为arbIpPort,例如192.168.1.xxx:27017
opts = options.Client().ApplyURI("mongodb://" + ipPort + "," + secIpPort + "," + arbIpPort + "/?replicaSet=" + repSetName).SetConnectTimeout(5 * time.Second).SetAuth(serverAuth).SetWriteConcern(writeconcern.New(writeconcern.WMajority()))

3. 确认副本集投票与优先级配置

登录任意可用节点的MongoDB Shell,查看副本集配置:

rs.conf()

检查:

  • 所有节点的votes字段:确保Arbitrator和Secondary的votes均为1(默认配置)
  • Secondary节点的priority字段:确保值≥1(默认是1,具备选举资格)

若优先级被修改,可通过以下命令调整:

var cfg = rs.conf()
// 假设Secondary是members数组的第2个元素(索引从0开始)
cfg.members[1].priority = 1
rs.reconfig(cfg)

4. 验证选举结果

主节点宕机后等待约30秒(默认选举超时时间),再次执行rs.status(),确认Secondary的stateStr变为PRIMARY,此时该节点即可支持读写操作。

5. 调整写入关注(可选)

若选举成功但写入仍失败,可临时调整写入关注为w:1(仅需新主节点确认写入)测试:

opts = opts.SetWriteConcern(writeconcern.New(writeconcern.W(1), writeconcern.J(true), writeconcern.WTimeout(5000)))

生产环境建议保持w:"majority",确保数据一致性,前提是集群选举正常完成。


内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:06:03