部署模式对比
MongoDB 支持三种部署模式,适用于不同规模和可用性要求的场景。
概述
| 模式 | 节点数 | 高可用 | 水平扩展 | 适用场景 |
|---|---|---|---|---|
| 单节点 | 1 | ❌ | ❌ | 本地开发、测试 |
| 副本集 | ≥ 3 | ✅ | ❌ | 生产环境、读扩展 |
| 分片集群 | ≥ 9 | ✅ | ✅ | 大规模生产、海量数据 |
单节点(Standalone)
┌──────────┐
│ mongod │
│ 27017 │
└──────────┘优点:
- 部署最简单,一条命令启动
- 资源占用最少,适合本地开发和 CI
- 管理零成本
缺点:
- 无高可用,宕机即不可用
- 无读扩展,所有读写集中一个节点
- 数据丢失风险,无冗余备份
适用:本地开发、单元测试、CI 流水线。
副本集(Replica Set)
┌──────────┐ 异步复制 ┌──────────┐
│ Primary │───────────▶│Secondary │
│ (写+读) │ │ (读) │
└──────────┘ └──────────┘
│ │
└───────────┬───────────┘
▼
┌──────────┐
│Secondary │
│ (读) │
└──────────┘优点:
- 自动故障转移,Primary 宕机后 10 秒内选举新 Primary
- 数据冗余,每个节点持有完整数据副本
- 读写分离,Secondary 可分担读请求
- oplog 支持数据恢复和时间点回溯
缺点:
- 至少 3 节点,资源成本是单节点的 3 倍
- 写操作仍集中在 Primary,无法水平扩展写入
- 异步复制存在数据延迟窗口(默认由 writeConcern 控制)
- 数据全量复制,无分片能力,单 Shard 存储有上限
适用:绝大多数生产场景,中小规模应用,要求高可用但不需水平扩展。
分片集群(Sharded Cluster)
┌──────────┐
│ mongos │ 路由
└──────────┘
│
┌────────┼────────┐
│ │ │
┌──────┐ ┌──────┐ ┌──────┐
│Shard1│ │Shard2│ │Shard3│ 数据分片(各为副本集)
│ RS │ │ RS │ │ RS │
└──────┘ └──────┘ └──────┘
│ │ │
└────────┼────────┘
│
┌────────┼────────┐
│ Config Server │ 元数据(副本集)
│ RS │
└───────────────┘优点:
- 水平写扩展,写入可分散到多个 Shard
- 海量数据存储,突破单机磁盘限制
- 数据分片后查询可并行执行(Scatter-Gather)
- 可按地域分区(Zone Sharding),数据就近存储
- 每个 Shard 本身是副本集,兼具高可用
缺点:
- 架构复杂,最少 9 个 mongod 进程(3 Config + 2×3 Shard) + mongos
- 运维成本高,需要监控 Config Server、mongos、各 Shard
- 分片键选择不可逆,选错会导致数据倾斜和热点
- 跨 Shard 查询性能差,尽量让查询命中单个 Shard
- 某些操作受限(如
$lookup跨 Shard 不支持)
适用:大规模应用,TB/PB 级数据,高写入吞吐需求,全球部署。
选型决策
是否需要高可用?
├── 否 → 单节点
└── 是
└── 数据量/写入量是否会超单机能力?
├── 否 → 副本集
└── 是 → 分片集群| 条件 | 推荐模式 |
|---|---|
| 本地开发、测试 | 单节点 |
| 生产环境,数据量 < 1TB | 副本集 |
| 生产环境,数据量 > 1TB 或写 QPS > 单机 | 分片集群 |
| 需要跨地域部署 | 分片集群 + Zone Sharding |