MongoDB 集群架构介绍(含安装部署与集群选型)
# MongoDB 集群架构介绍及启动方式
MongoDB 是一个支持分布式架构的 NoSQL 数据库,提供高可用性和可扩展性,能够通过复制集和分片集群两种架构进行部署。为了实现数据的高可用性和水平扩展,MongoDB 提供了多个组件和对应的启动方式,包括 Mongos、Shard、和 Config Server。
版本说明
本文基于 MongoDB 6.0。副本集与分片集群的核心架构自 3.2 起基本未变,2026-09 复核仍适用。新版(7.0+)已移除 mongos 命令行直接启动方式,需通过配置文件或服务方式启动。
# 1. MongoDB 集群架构概述
MongoDB 的分片集群架构主要由以下三部分组成:
Mongos(路由服务):- 用作客户端和 MongoDB 分片集群之间的查询路由器。
- 负责接收客户端请求,将其路由到合适的分片节点,并将结果返回给客户端。
- 启动文件:
mongos - 启动方式:
mongos --configdb <config_replica_set>/<config_server1>:<port>,<config_server2>:<port>,<config_server3>:<port> --bind_ip <ip_address> --port 270171
Shard(分片节点):- 分片是实际存储数据的服务器。每个分片保存了部分数据,并负责处理相关的读写操作。
- 分片节点可以是单个
mongod实例或一个复制集,以实现数据的高可用性。 - 启动文件:
mongod - 启动方式:
mongod --shardsvr --replSet <replica_set_name> --dbpath /data/db --logpath /var/log/mongodb/mongod.log --bind_ip <ip_address> --port 27018 --fork1
Config Server(配置服务器):- 配置服务器存储分片集群的元数据,记录每个分片上存储的数据范围和分片信息。
- 在 MongoDB 3.2 及之后版本中,
Config Server作为一个复制集部署,保证元数据的高可用性。 - 启动文件:
mongod - 启动方式:
mongod --configsvr --replSet <config_repl_set_name> --dbpath /data/configdb --logpath /var/log/mongodb/configsvr.log --bind_ip <ip_address> --port 27019 --fork1
# 2. MongoDB 架构的详细组成
# 2.1 Mongos 路由服务
Mongos 是 MongoDB 分片架构中的关键组件,作为查询路由器,帮助将请求分发到正确的分片。Mongos 是无状态的,允许部署多个实例以实现负载均衡和高可用。Mongos 不存储数据,它只负责路由查询。
- 部署建议:多个
Mongos实例可与负载均衡器(如 Nginx)结合使用,客户端可以通过负载均衡器将请求分发到不同的Mongos实例,避免单点故障。
# 2.2 Shard 分片节点
每个 Shard 代表分片集群中的一个数据存储节点,可以是单个 mongod 实例,也可以是一个复制集。分片的作用是将大规模数据分散到多个节点中,实现数据的水平扩展。
分片机制:MongoDB 通过
shard key将数据分布到不同的分片中,客户端查询时根据shard key定位相关分片。复制集支持:每个
Shard通常部署为一个复制集,以确保数据的高可用性和数据冗余。
# 2.3 Config Server 配置服务器
Config Server 是分片集群中不可或缺的组件,它存储集群的元数据信息,包括每个分片上存储的数据范围。MongoDB 3.2 之后,Config Server 被要求部署为复制集,以提高可用性和容错能力。
- 重要性:所有的
Mongos路由服务都会查询Config Server,以获取关于分片的元数据。因此,配置服务器的高可用性非常重要,通常配置成一个 3 节点的复制集。
# 3. MongoDB 分片集群架构图
以下是一个典型的 MongoDB 分片集群架构图,展示了 Mongos、Shard 和 Config Server 之间的关系:
+--------------------+ +--------------------+
| 客户端请求 | | 客户端请求 |
+--------------------+ +--------------------+
| |
+--------v------------------------------v---------------------+
| Mongos 路由无状态 |
+-------------------------------------------------------------+
| |
+---------v----------+ +---------v----------+
| Config Server | | Config Server |
| (复制集) | | (复制集) |
+---------------------+ +---------------------+
| |
+----------------v-------------+ +----------------v-------------+
| Shard 1 (复制集) | | Shard 2 (复制集) |
| Primary | Secondary | Arbiter| | Primary | Secondary | Arbiter|
+-------------------------------+ +-------------------------------+
| |
+---------------------+ +---------------------+
| Shard 3 (复制集) | | Shard 4 (复制集) |
| Primary | Secondary | | Primary | Secondary |
+---------------------+ +---------------------+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 4. 启动方式总结
Mongos 路由服务:
- 启动文件:
mongos - 启动命令:
mongos --configdb <config_replica_set>/<config_server1>:<port>,<config_server2>:<port>,<config_server3>:<port> --bind_ip <ip_address> --port 270171
- 启动文件:
Shard 分片节点:
- 启动文件:
mongod - 启动命令:
mongod --shardsvr --replSet <replica_set_name> --dbpath /data/db --logpath /var/log/mongodb/mongod.log --bind_ip <ip_address> --port 27018 --fork1
- 启动文件:
Config Server 配置服务器:
- 启动文件:
mongod - 启动命令:
mongod --configsvr --replSet <config_repl_set_name> --dbpath /data/configdb --logpath /var/log/mongodb/configsvr.log --bind_ip <ip_address> --port 27019 --fork1
- 启动文件:
# 5. 副本集与分片集群:怎么选
选择哪种架构取决于数据规模和业务需求:
| 场景 | 推荐架构 | 说明 |
|---|---|---|
| 数据量 < 100GB,单节点可承载 | 副本集 | 3 节点副本集提供高可用,Primary 处理写入,Secondary 处理读取 |
| 数据量 100GB - 1TB,垂直扩展受限 | 副本集 + 垂直分片 | 先扩容副本集节点,撑不住再考虑分片 |
| 数据量 > 1TB,需要水平扩展 | 分片集群 | 按 shard key 水平拆分数据,支持 T 级别以上 |
| 读写延迟敏感,读多写少 | 副本集 + 读写分离 | 读取指向 Secondary,减轻 Primary 压力 |
| 需要强一致性 | 副本集(写 Majority) | 分片集群的选举延迟比副本集高 |
副本集优先级:Primary → Secondary(可读)→ Arbiter(不存数据,只投票)
分片集群适用条件:
- 单分片数据量超过 50GB(经验值)
- 需要支持 TB 级别数据
- 写入吞吐量超过单节点能力
# 6. 关键启动参数
# 启动 mongod(Shard 节点模式)
mongod \
--shardsvr \
--replSet rs0 \
--dbpath /data/mongodb \
--logpath /var/log/mongodb/mongod.log \
--bind_ip 0.0.0.0 \
--port 27017 \
--fork \
--wiredTigerCacheSizeGB 4 \
--oplogSize 1024
# 启动 mongod(Config Server 模式,3.4+ 必须是复制集)
mongod \
--configsvr \
--replSet configReplSet \
--dbpath /data/configdb \
--logpath /var/log/mongodb/configsvr.log \
--bind_ip 0.0.0.0 \
--port 27019 \
--fork
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
常用参数说明:
| 参数 | 说明 | 建议值 |
|---|---|---|
--shardsvr | 以分片节点角色启动 | - |
--configsvr | 以配置服务器角色启动 | - |
--replSet | 副本集名称 | 如 rs0 |
--dbpath | 数据目录 | 独立磁盘 |
--logpath | 日志文件 | 独立磁盘 |
--bind_ip | 监听地址 | 0.0.0.0 |
--wiredTigerCacheSizeGB | WT 缓存大小 | 物理内存的 50%-60% |
--oplogSize | oplog 大小(MB) | 副本集会自动使用,建议 1GB-10GB |
--fork | 后台运行 | 生产环境必须加 |
# 7. 装完怎么验证
复制集验证:
// 连接 Primary 节点
mongosh --host 192.0.2.11:27017
// 查看副本集状态
rs.status()
// 看什么:
// 1. members[].stateStr 应为 "PRIMARY" 或 "SECONDARY"
// 2. members[].health 应为 1
// 3. ok 应为 1
// 查看复制延迟
rs.printSecondaryReplicationInfo()
// 测试故障转移
// 在 Primary 上执行 db.adminCommand({ replSetStepDown: 60 })
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
分片集群验证:
// 连接 mongos
mongosh --host 192.0.2.11 --port 27017
// 查看分片状态
sh.status()
// 看什么:
// 1. shards 列表:应有 2+ 分片
// 2. databases:确认分片的数据库
// 3. chunks:确认数据分布情况
// 查看分片详情
sh.getBalancerState()
sh.isBalancerRunning()
// 验证写入
use testdb
sh.enableSharding("testdb")
sh.shardCollection("testdb.mycollection", { "_id": "hashed" })
db.mycollection.insertMany([
{ name: "doc1", value: 100 },
{ name: "doc2", value: 200 }
])
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
常见验证问题:
- 副本集状态不是 PRIMARY/SECONDARY:检查防火墙、网络、时间同步
- 复制延迟过高:检查网络带宽、调整 oplog 大小
- 分片无法添加:
sh.addShard()失败通常是认证或网络问题
# 8. 快速安装
下载并解压:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-6.0.4.tgz
tar -zxvf mongodb-linux-x86_64-6.0.4.tgz
sudo mv mongodb-linux-x86_64-6.0.4 /usr/local/mongodb
sudo ln -s /usr/local/mongodb/bin/* /usr/local/bin/
2
3
4
创建数据和日志目录:
sudo mkdir -p /data/mongodb
sudo mkdir -p /var/log/mongodb
sudo chown -R mongodb:mongodb /data/mongodb /var/log/mongodb
2
3
创建配置文件 /etc/mongod.conf:
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb"
journal:
enabled: true
net:
bindIp: 0.0.0.0
port: 27017
replication:
replSetName: "rs0"
sharding:
clusterRole: shardsvr
2
3
4
5
6
7
8
9
10
11
12
13
14
15
启动 MongoDB:
mongod --config /etc/mongod.conf --fork
初始化副本集(在 Primary 节点执行):
mongosh --host 192.0.2.11
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "192.0.2.11:27017" },
{ _id: 1, host: "192.0.2.12:27017" },
{ _id: 2, host: "192.0.2.13:27017" }
]
})
rs.status()
2
3
4
5
6
7
8
9
10
# 9. 坑与边界
Config Server 从 3.4 起必须是复制集(CSRS),单机 config server(SCCC)在 3.4 已废弃、3.6 彻底移除。用老教程搭出来的单机 config server,在升级到 3.6+ 时集群直接起不来,只能先把它转成复制集再升。
分片键选定后不能改,且决定了集群的上限。分片键一旦生效就无法修改(只能导出重建整个集合),选低基数字段(如
status、布尔位)会导致 chunk 无法继续拆分——因为拆分只能沿分片键的取值边界进行,取值就那么几个就无处可拆,于是形成永久性的 jumbo chunk 和数据倾斜;选单调递增字段(时间戳、自增_id)则所有新写入都落在同一个分片上,扩容等于没扩。规则:高基数 + 写入分散,拿不准就先用hashed分片键。(MongoDB 5.0+ 提供了reshardCollection重分片,但它是全量重写数据的重操作,不是「改个配置」。)mongos无状态,但版本必须和集群对齐。mongos不存数据,挂了重拉即可;但它的版本不能高于 Config Server 与 Shard,混版本运行会出现路由行为不一致。滚动升级的顺序是:Config Server → Shard → mongos,反过来会踩兼容性问题。副本集成员数要是奇数。选举靠的是多数票,这就是为什么偶数成员在网络分区时可能双方都拿不到多数、导致没有 Primary、集群整体不可写。只有两台机器时,第三个位置用仲裁节点(arbiter)补上——但 arbiter 不存数据,不要指望它提供冗余。
WiredTiger 缓存不是设得越大越好。默认取
(物理内存 - 1GB) 的 50%,手动调过 60% 会挤压操作系统的文件缓存,反而拖慢读性能;容器里跑还要注意它读的是宿主机内存,必须显式设--wiredTigerCacheSizeGB,否则会按宿主机规格分配、直接被 OOM kill。
# 总结
MongoDB 分片集群通过 Mongos、Shard 和 Config Server 三部分组成,Mongos 提供查询路由,Shard 负责数据存储和读写操作,Config Server 保存元数据。通过合理部署这些组件,可以实现 MongoDB 的高可用性和水平扩展。
- Mongos:无状态,可以通过负载均衡和多个实例部署实现高可用。
- Shard:支持水平扩展,可以是单节点或复制集,提供高可用性和数据冗余。
- Config Server:元数据的存储节点,部署为复制集确保集群元数据的高可用性。
这种架构适合处理大规模数据和高并发请求的场景,MongoDB 提供了灵活的扩展性以满足企业需求。
# 可复用要点
- 架构选型法则:先从 3 节点副本集开始,数据量 > 1TB 或单节点写入瓶颈时再考虑分片。
- 副本集优势:部署简单、故障自动切换、读写分离,是生产环境的默认选择。
- 分片集群代价:需要 3 节点 Config Server 副本集 + 至少 2 个 Shard 副本集,运维复杂度高,不要为了「未来扩展性」提前布局。
- 生产必备检查:启动参数加
--fork、配置日志和存储目录分离、WiredTiger 缓存大小设置为物理内存的 50-60%。
# Agent 可直接解析的元数据块
{
"runbook": {
"task": "mongodb-cluster-architecture-and-setup",
"permalinks": ["/pages/123941/"],
"merged_from": ["/pages/98019d/"],
"category": "database/mongodb",
"tags": ["MongoDB", "replica-set", "sharding", "config-server"],
"mongodb_versions": ["6.0"],
"key_pitfalls": [
"Config Server 3.4+ 必须是复制集",
"分片键选定后不可修改",
"mongos 版本不得高于 Config Server 与 Shard",
"副本集成员数应为奇数",
"容器内需显式设置 wiredTigerCacheSizeGB"
],
"verified_date": "2026-09"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18