Skip to content

复制集与高可用

Replica Set 是维护同一数据集的一组 mongod。正常情况下只有一个 Primary 接受普通写入,Secondary 持续拉取并重放 Oplog;多数派可用时可以选举新的 Primary。


复制链路

Oplog 是 Capped Collection,保存可重放的数据变化。Secondary 若落后超过当前 Oplog Window,所需记录已被覆盖,就不能继续增量追赶,通常需要重新 Initial Sync。


多数派与选举

多数派以投票成员数量计算,不等于在线数据副本数量。生产部署通常采用奇数投票成员并分散到不同故障域,以便在单节点或单可用区故障后仍能形成多数派。

Arbiter 只投票、不保存业务数据。它能改变投票结构,却不增加数据副本和读取能力,还会影响多数派持久性判断;不能把它当作廉价 Secondary 普遍使用。

选举期间没有 Primary,写入会短暂中断。Driver 通过 Replica Set 连接串发现拓扑并选择新 Primary;只连接某个节点地址无法形成完整自动切换链路。


回滚与数据确认

异步复制下,旧 Primary 上尚未达到多数派提交点的写入,可能在故障切换后被 Rollback。需要避免数据回滚的关键写入应使用合适的 Majority Write Concern,并确认节点 Journal 行为。

Secondary 读取不是强一致读扩展:

  • secondary 可能读到落后数据。
  • secondaryPreferred 在无可用 Secondary 时可能回到 Primary。
  • 长查询可能与 Oplog 应用、节点维护和缓存竞争。
  • Read Preference 不会改变写入目标,事务读取必须遵守事务限制。

故障域与运维

风险设计措施
单主机故障数据成员部署到独立主机
单机房或可用区故障规划多数派在剩余故障域仍可形成
网络分区依赖多数派阻止少数派继续确认写入
Secondary 长期落后监控 Replication Lag 和 Oplog Window
误操作独立备份、延迟副本或时间点恢复方案
旧 Driver 或错误连接串使用支持当前版本的 Driver 与 Replica Set URI

复制不是备份:删除或错误更新会通过 Oplog 快速复制到所有 Secondary。高可用解决服务接管,备份解决历史恢复,两者需要同时存在。

参考资料