hidden: true和priority: 0必须同时设置,否则节点仍可能被选为primary;报表服务须直连并启用directconnection=true;多hidden节点需差异化slavedelay以避免同步风暴。

hidden: true 和 priority: 0 必须同时设置
只设 hidden: true 不足以让节点真正“隐身”——它仍可能被选为 primary,因为选举逻辑只看 priority 值。MongoDB 允许 hidden 节点参选,只要其 priority > 0。一旦它意外升主,报表查询就可能触发写操作,破坏只读语义。
必须同步设置:
-
hidden: true:让该节点从客户端自动发现中彻底消失(比如mongosh连接副本集时不会包含它) -
priority: 0:确保它永远无法成为 primary,哪怕其他所有节点宕机
常见错误是只改 hidden、忘了重置 priority;或误用 votes: 0 却漏掉 priority: 0——votes 控制投票权,priority 才决定能否当选主节点。
报表服务必须用 directConnection=true 直连
即使节点已配置为 hidden,如果客户端使用副本集连接串(如 mongodb://host1:27017,host2:27017/?replicaSet=rs0),驱动仍可能通过心跳探测到该节点,并尝试路由读请求——尤其在旧版驱动中,hidden 并不完全阻断读路由逻辑。
正确做法是强制直连,禁用自动发现:
- ✅ 正确:
mongodb://report-node:27017/?directConnection=true - ❌ 错误:
mongodb://report-node:27017/?replicaSet=rs0(触发自动发现) - ❌ 错误:
mongodb://host1:27017,host2:27017,report-node:27017/?replicaSet=rs0(暴露 hidden 节点给 driver)
多个 Hidden 节点要错开 slaveDelay
如果你部署了多个 Hidden 节点(例如一个用于小时级报表,一个用于天级备份),它们的 slaveDelay 值不能相同。否则所有节点会在同一时刻拉取 oplog,造成主节点 CPU 和网络抖动,拖慢线上写入延迟。
建议按用途差异化配置:
- 最小间隔不少于 300 秒(5 分钟)
- 例如:
slaveDelay: 3600(1 小时)和slaveDelay: 9000(2.5 小时) - 避免使用相同值,如两个都设为
3600
reconfig 操作会强制主节点下台
执行 rs.reconfig() 时,当前 primary 会被强制降级,触发新一轮选举。期间所有客户端连接中断,通常持续 10–20 秒。
务必注意:
- 仅在计划维护窗口操作
- 不要在混合 MongoDB 版本的副本集中执行——不同版本对配置字段的校验规则不同,可能导致 reconfig 失败
- 更新配置时用数组索引(如
cfg.members[0]),别和_id字段混淆
最易被忽略的是版本一致性:生产环境中,所有节点应运行相同主版本(如全部 7.0.x),否则 rs.reconfig() 可能因字段校验失败而拒绝生效。











