灯下哥谭 灯下哥谭
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

灯下哥谭

灯还亮着
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • 高性能KV

  • TiDB

  • Elasticsearch

  • 数据管道

  • 其他数据库

    • SQL Server 2019 on Linux:功能边界、安装配置与中文环境排障
    • MongoDB 集群架构介绍(含安装部署与集群选型)
      • MongoDB 集群架构介绍及启动方式
        • 1. MongoDB 集群架构概述
        • 2. MongoDB 架构的详细组成
        • 3. MongoDB 分片集群架构图
        • 4. 启动方式总结
        • 5. 副本集与分片集群:怎么选
        • 6. 关键启动参数
        • 7. 装完怎么验证
        • 8. 快速安装
        • 9. 坑与边界
        • 总结
        • 可复用要点
      • Agent 可直接解析的元数据块
    • MongoDB 集群Config Server 复制集的工作原理
    • 当监控说没事而 DMV 说有事——N9E 与 SQL Server 指标交叉验证实战
    • 托管 SQL Server 的运维边界:哪些 DBA 手段会失效,以及用什么替代
  • 数据库
  • 其他数据库
灯下哥谭
2024-09-14
目录

MongoDB 集群架构介绍(含安装部署与集群选型)

# MongoDB 集群架构介绍及启动方式

MongoDB 是一个支持分布式架构的 NoSQL 数据库,提供高可用性和可扩展性,能够通过复制集和分片集群两种架构进行部署。为了实现数据的高可用性和水平扩展,MongoDB 提供了多个组件和对应的启动方式,包括 Mongos、Shard、和 Config Server。

版本说明

本文基于 MongoDB 6.0。副本集与分片集群的核心架构自 3.2 起基本未变,2026-09 复核仍适用。新版(7.0+)已移除 mongos 命令行直接启动方式,需通过配置文件或服务方式启动。


# 1. MongoDB 集群架构概述

MongoDB 的分片集群架构主要由以下三部分组成:

  1. Mongos(路由服务):

    • 用作客户端和 MongoDB 分片集群之间的查询路由器。
    • 负责接收客户端请求,将其路由到合适的分片节点,并将结果返回给客户端。
    • 启动文件:mongos
    • 启动方式:
      mongos --configdb <config_replica_set>/<config_server1>:<port>,<config_server2>:<port>,<config_server3>:<port> --bind_ip <ip_address> --port 27017
      
      1
  2. Shard(分片节点):

    • 分片是实际存储数据的服务器。每个分片保存了部分数据,并负责处理相关的读写操作。
    • 分片节点可以是单个 mongod 实例或一个复制集,以实现数据的高可用性。
    • 启动文件:mongod
    • 启动方式:
      mongod --shardsvr --replSet <replica_set_name> --dbpath /data/db --logpath /var/log/mongodb/mongod.log --bind_ip <ip_address> --port 27018 --fork
      
      1
  3. 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 --fork
      
      1

# 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 |
          +---------------------+         +---------------------+
1
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 27017
      
      1
  • Shard 分片节点:

    • 启动文件:mongod
    • 启动命令:
      mongod --shardsvr --replSet <replica_set_name> --dbpath /data/db --logpath /var/log/mongodb/mongod.log --bind_ip <ip_address> --port 27018 --fork
      
      1
  • 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 --fork
      
      1

# 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
1
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 })
1
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 }
])
1
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/
1
2
3
4

创建数据和日志目录:

sudo mkdir -p /data/mongodb
sudo mkdir -p /var/log/mongodb
sudo chown -R mongodb:mongodb /data/mongodb /var/log/mongodb
1
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

启动 MongoDB:

mongod --config /etc/mongod.conf --fork
1

初始化副本集(在 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()
1
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 提供了灵活的扩展性以满足企业需求。


# 可复用要点

  1. 架构选型法则:先从 3 节点副本集开始,数据量 > 1TB 或单节点写入瓶颈时再考虑分片。
  2. 副本集优势:部署简单、故障自动切换、读写分离,是生产环境的默认选择。
  3. 分片集群代价:需要 3 节点 Config Server 副本集 + 至少 2 个 Shard 副本集,运维复杂度高,不要为了「未来扩展性」提前布局。
  4. 生产必备检查:启动参数加 --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"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#架构设计#集群运维#MongoDB
上次更新: 9/11/2026

← SQL Server 2019 on Linux:功能边界、安装配置与中文环境排障 MongoDB 集群Config Server 复制集的工作原理→

最近更新
01
DeepSeek Harness 实战 06|学习笔记:插件、工具、技能不在同一个维度上 原创
09-11
02
DeepSeek Harness 实战 05|让两个编码 Agent 共用一份长期记忆 原创
09-09
03
DeepSeek Harness 实战 04|学习笔记:从「已知限制」里读出三处设计张力 原创
09-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式