复制集与高可用
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。高可用解决服务接管,备份解决历史恢复,两者需要同时存在。