复制集、分片与事务
副本集(Replica Set)
副本集是一组保存相同数据的 mongod 实例,包含:
- 1 个主节点(Primary):接收所有写操作。
- 多个从节点(Secondary):异步复制 oplog,可承担读请求。
- 可选仲裁节点(Arbiter):只参与投票,不存数据。
选举与故障切换
- 主节点故障时,其余节点在
electionTimeoutMillis(默认 10s)后发起选举。 - 多数派(majority)通过即成为新主,保证同一时刻只有一个主。
- 成员数应为奇数,或添加仲裁者,避免脑裂与投票僵局。
读写关注(Write/Read Concern)
写关注决定「写操作需要被多少个节点确认」:
读关注决定读操作能看到的一致性级别:
读偏好(readPreference) 决定从哪个节点读:primary、primaryPreferred、secondary、secondaryPreferred、nearest。
Tip
关键写入统一使用 { w: "majority", j: true },否则主节点故障切换时可能丢失已返回成功的写入。对一致性敏感的读取使用 readConcern: "majority" + readPreference: "primary",避免读到尚未确认或将被回滚的数据。
分片集群(Sharding)
当单机容量或写入达到瓶颈,用分片水平扩展。分片集群由三类角色组成:
- mongos:查询路由,客户端只连它。
- shard:实际存储分片数据(每个分片是高可用副本集)。
- config server:保存集群元数据与分片键。
分片键选择
分片键一旦选定不可更改,且需满足:高基数、写入分散、查询常带该键(否则广播到所有分片)。
多文档事务
MongoDB 4.0+ 支持副本集上的多文档事务,4.2+ 支持分片集群事务:
Warning
MongoDB 事务有时间与开销限制(默认 60 秒),且性能低于单文档操作。能用单文档原子操作($inc、$set)或合理嵌入解决时,不要轻易上多文档事务。
小结
- 副本集提供高可用与读写分离,写关注
majority是防丢数据的关键。 - 分片突破单机容量,分片键选择决定集群的扩展性与查询效率。
- 多文档事务可用但有代价,优先用单文档原子操作与合理建模替代。
- 成员数取奇数、关键写入走多数派,是稳定集群的基本要求。