副本集、分片与备份恢复
本教程共 50 篇 · 第 50 篇 · 更新于 2026-07-30 · 约 4 分钟阅读
50. 副本集、分片与备份恢复
本节目标:理解副本集与分片分别解决什么问题,并会用 mongodump/mongorestore 做备份和恢复。
前面章节都在单机视角下讲操作。生产环境还得考虑两件事:挂了怎么办(高可用)、数据太多怎么办(扩容)。这一章给概念全貌和备份命令。
50.1 副本集:多副本保高可用
副本集(Replica Set)是一组维护相同数据的 mongod 实例。它解决「单机挂了服务就断」的问题。
- 一个 主节点(Primary) 负责所有写操作。
- 多个 从节点(Secondary) 复制主节点的数据。
- 主节点挂了,从节点会自动选举出新的主,业务几乎无感。这就是自动故障转移(Failover)。
数据同步靠 oplog(操作日志):主节点记下每个写操作,从节点追上重放。
// 进 mongosh 看副本集状态
test> rs.status()
Note副本集不仅为高可用,也支撑了第 48 章的变更流和第 49 章的事务。这两大功能都依赖 oplog,所以都得有副本集。
50.2 分片:把数据拆到多机
分片(Sharding)把数据按某个键切分,分布到多台机器上,解决「单机装不下、扛不住」的问题。它是水平扩展(Horizontal Scaling)的手段。
一个分片集群由三部分组成:
- Shard(分片):每台存一部分数据,自身也是副本集。
- Mongos(路由):查询路由器,客户端只连它,由它把请求发到对应分片。
- Config Server(配置服务器):存集群的元数据和路由信息。
# 客户端连的是 mongos,而不是某个分片
mongosh "mongodb://mongos-host:27017"
分片键(Shard Key)决定数据怎么切。选不好会造成数据倾斜、热点。MongoDB 8.3 起,对分片集群的 DDL 操作都要走 mongos 执行。
Note据 MongoDB 8.3 官方兼容说明,分片集群上的 DDL 与 applyOps 操作必须经由 mongos 执行,不能再直连分片节点。这是 8.3 的硬性变化,搭建集群时务必留意。
Warning分片是重操作,架构复杂、运维成本高。数据量没到瓶颈前别轻易分片,先用副本集扛着。
50.3 副本集 vs 分片:各管一摊
| 维度 | 副本集 | 分片 |
|---|---|---|
| 主要目标 | 高可用、容灾 | 水平扩展、突破单机容量 |
| 数据分布 | 每份数据全量复制 | 数据被切分存到不同分片 |
| 写能力 | 受单机限制 | 可随分片数线性扩展 |
| 复杂度 | 低 | 高 |
Tip简单记:怕挂用副本集,怕满用分片。很多生产环境是「副本集 + 分片」组合,既高可用又易扩展。
50.4 备份:mongodump 导出
mongodump 把数据库导出成 BSON 文件,是最常用的逻辑备份工具。
# 备份整个实例到 ./dump 目录
mongodump --uri="mongodb://127.0.0.1:27017"
# 只备份某个库或某个集合
mongodump --uri="mongodb://127.0.0.1:27017" --db=test --collection=users
导出结果是 BSON,体积小、保类型,适合做定时备份。
Note副本集环境下建议在从节点上跑
mongodump,避免占用主节点资源、影响线上读写。
50.5 恢复:mongorestore 导入
mongorestore 把 mongodump 产出的文件还原回去。
# 从 dump 目录整体恢复
mongorestore --uri="mongodb://127.0.0.1:27017" ./dump
# 恢复时先清空目标集合,避免重复
mongorestore --uri="mongodb://127.0.0.1:27017" --drop ./dump
Warning恢复会覆盖同名数据。
--drop会先删后导,生产执行前务必确认备份文件正确、目标无误。
50.6 小结
副本集用多副本和自动选举保高可用,分片用切分数据做水平扩展,两者常结合使用。备份用 mongodump 导出,恢复用 mongorestore 导入。概念清楚后,再按需深入集群搭建与调优。