最少需要3个节点,因为副本集选举依赖多数派投票机制:2个节点时任意一个宕机,剩余节点无法获得多数票(2中需≥2票),导致选举失败、集群不可写;3个节点可容忍1个故障,剩余2个仍能达成多数(≥2/3),保障高可用。

最少需要 3 个节点。
为什么不能只用 2 个节点?
副本集选举依赖多数派(majority)投票机制。2 个节点时,任意一个宕机,剩下那个无法获得多数票(2 中需 ≥2 票才能构成 majority),选举失败,整个副本集不可写 —— 这和单点故障没区别。
- 3 个节点:允许 1 个宕机,剩余 2 个仍能达成 majority(≥2/3)
- 哪怕其中一个是
arbiter(仲裁节点),它不存数据但参与投票,也能凑够奇数票数 - 生产环境强烈建议 3 个
data-bearing节点(P-S-S),而非 P-S-A,避免单点数据丢失风险
单机模拟三节点的常见错误
在开发机上用不同端口跑多个 mongod 是可行的,但容易卡在几个地方:
-
--dbpath目录没清空或权限不对,启动直接报Unable to lock file - 三个实例用了相同
--port或重复--replSet名,导致连接混乱 -
rs.initiate()里写的host是localhost:27017,但实际 MongoDB 5.0+ 默认绑定127.0.0.1,不响应localhost解析 —— 改成"127.0.0.1:27017"更稳 - 日志里出现
Failed to connect to … No route to host,基本是某节点没起来,或防火墙/杀软拦截了非标准端口
初始化后立刻检查什么?
连上主节点执行 rs.status() 后,重点看这三项:
-
members[n].stateStr应为PRIMARY/SECONDARY/ARBITER,不能是STARTUP或UNKNOWN -
members[n].health必须是1,0表示失联 -
ok字段为1且myState是1(主)或2(从),才算真正就绪
如果 rs.status() 报 not master and slaveOk=false,说明你连的是从节点却没加 ?readPreference=secondary,或者没执行 rs.slaveOk()(仅 shell 临时生效)。
副本集名字和节点 host 必须严格一致
--replSet rs0 启动的每个实例,其 rs.initiate() 配置里的 _id 和所有 members[n].host 值,必须完全匹配 —— 多一个空格、大小写不一致、IP 与 hostname 混用,都会导致节点拒绝加入。
- 推荐全用
127.0.0.1:x,避免 DNS 解析差异 - 改配置时别直接 edit
rs.conf()返回的对象再rs.reconfig(),容易漏掉_id或版本号,用rs.reconfig(conf, {force: true})也得确认version自增 - 一旦某个节点显示
REMOVED状态,别急着删目录重来,先查日志里是否有heartbeat failed或invalid replica set config
最麻烦的不是配不起来,而是配起来了但某个节点 silently 不同步 —— 一定要等 members[n].optime.dts 跟主节点接近,且 syncSourceHost 非空,才算真正在复制。











