MongoDB双节点副本集从节点宕机后主节点无法写入如何解决
问题根因
MongoDB副本集的选举规则要求可投票成员的在线数量必须达到总投票数的多数(>50%),才能维持主节点的正常工作状态。
你当前配置的副本集共2个成员,默认都拥有1票投票权,总票数为2,多数阈值为2。当你关闭从节点后,仅剩1个在线成员,无法满足多数要求,原主节点会自动降级为从节点,自然无法接收写入请求,就会返回你遇到的NotWritablePrimary错误。
解决方案
要实现主节点可正常写入、从节点仅作为备份的架构,可选择以下任意一种方案:
方案1:新增仲裁节点(兼顾高可用,推荐)
仲裁节点不存储业务数据、不对外提供读写服务,仅参与选举投票,资源占用极低。添加仲裁节点后总投票数变为3,多数阈值为2,只要有2个投票节点在线即可维持主节点正常工作:
- 双节点正常运行时,集群工作状态不受影响
- 从节点离线时,主节点+仲裁节点共2票,满足多数要求,主节点可正常接收写入
- 主节点离线时,从节点+仲裁节点共2票,可自动选举从节点为新主节点(如果不需要自动切主可调整从节点配置)
操作步骤:
- 启动新的mongod实例作为仲裁节点,配置文件指定副本集名称为
replKK,使用独立端口(例如27033) - 登录当前主节点执行如下命令添加仲裁节点:
rs.addArb("localhost:27033")
如果需要完全禁止从节点升主,仅保留备份功能,可额外执行如下配置修改:
var conf = rs.conf() conf.members[1].priority = 0 conf.members[1].votes = 0 rs.reconfig(conf)
方案2:调整从节点投票权(无需新增节点,适合仅需备份的场景)
直接取消从节点的投票权,整个副本集的总投票数仅为1(全部来自主节点),只要主节点在线即可满足多数要求,从节点的上下线完全不影响主节点的写入能力。
操作步骤:
登录当前主节点执行如下命令:
var conf = rs.conf() conf.members[1].votes = 0 rs.reconfig(conf)
注意该方案的弊端是主节点故障后集群无法自动选举新主,需要手动介入恢复,仅适合不需要高可用、仅需从节点做数据备份的场景。
内容的提问来源于stack exchange,提问作者kk2449
相关产品推荐
相关产品推荐

