1. 首页 > MongoDB教程 > 正文

MongoDB教程FG001-MongoDB官方架构与文档数据库特性解析

本文档风哥主要介绍MongoDB官方架构与文档数据库特性,包括MongoDB数据库基本概念、文档数据模型、架构概览、硬件要求、操作系统环境、部署选项、安装前准备、基础配置、验证测试、架构实战案例、文档设计实战、性能测试实战等内容,风哥教程参考MongoDB官方文档Basic Concepts和Architecture内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 MongoDB数据库基本概念

MongoDB是一个基于文档的NoSQL数据库,使用BSON(Binary JSON)格式存储数据。与传统的关系型数据库相比,MongoDB具有更高的灵活性和可扩展性,适合处理大量非结构化数据。更多视频教程www.fgedu.net.cn

MongoDB核心概念:

  • 文档(Document):MongoDB的基本数据单元,类似于关系型数据库中的行
  • 集合(Collection):文档的分组,类似于关系型数据库中的表
  • 数据库(Database):集合的容器,类似于关系型数据库中的数据库
  • BSON:Binary JSON,MongoDB使用的二进制数据格式
  • 索引:提高查询性能的重要机制

1.2 MongoDB文档数据模型

MongoDB采用文档数据模型,每个文档是一个键值对的集合,使用BSON格式存储。文档数据模型具有以下特点:

// 示例文档结构
{
“_id”: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e6”),
“name”: “fgedu”,
“age”: 30,
“email”: “fgedu@fgedu.net.cn”,
“address”: {
“city”: “Beijing”,
“street”: “Main Street”,
“zip”: “100000”
},
“tags”: [“MongoDB”, “NoSQL”, “Database”]
}

文档数据模型的优势:

  • 灵活性:文档可以包含不同结构的数据
  • 嵌套结构:支持复杂的嵌套数据结构
  • 动态模式:不需要预定义模式
  • 易于扩展:可以轻松添加新字段

1.3 MongoDB架构概览

MongoDB的架构主要包括以下组件:

# MongoDB架构组件
– **mongod:** MongoDB服务器进程,负责处理客户端请求
– **mongos:** 查询路由器,用于分片集群
– **config server:** 存储分片集群的元数据
– **副本集:** 提供高可用性和数据冗余
– **分片:** 水平扩展数据存储
– **WiredTiger:** 默认存储引擎
– **MMAPv1:** 传统存储引擎
风哥提示:MongoDB的架构设计注重高可用性和可扩展性,通过副本集和分片机制,可以构建大规模的分布式数据库系统。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 MongoDB数据库硬件要求

生产环境中,MongoDB的硬件要求取决于数据量、并发访问量和性能需求。以下是推荐的硬件配置:

# 硬件配置建议

## 内存
– 小型部署:8GB+ RAM
– 中型部署:16GB-32GB RAM
– 大型部署:64GB+ RAM

## CPU
– 小型部署:4核+ CPU
– 中型部署:8核+ CPU
– 大型部署:16核+ CPU

## 存储
– SSD存储(推荐):提供更好的IO性能
– 磁盘空间:数据大小的2-3倍
– IOPS要求:至少1000 IOPS

## 网络
– 千兆网卡(推荐)
– 低延迟网络环境
– 足够的带宽

2.2 MongoDB数据库操作系统环境

MongoDB支持多种操作系统,以下是推荐的操作系统环境:

# 推荐操作系统
– Oracle Linux 9.3 / RHEL 9.3
– Oracle Linux 8.x / RHEL 8.x
– Oracle Linux 7.x / RHEL 7.x
– Ubuntu 20.04 LTS / 22.04 LTS
– CentOS 7 / 8
– 国产麒麟操作系统 Kylin v10 SP3
– 欧拉操作系统

# 系统参数优化
– 关闭透明大页
– 关闭NUMA
– 调整文件描述符限制
– 调整内核参数

2.3 MongoDB数据库部署选项

MongoDB提供多种部署选项,根据业务需求选择合适的部署方式:

# 部署选项

## 单节点部署
– 适用于开发和测试环境
– 简单易部署
– 无高可用性

## 副本集部署
– 适用于生产环境
– 提供高可用性
– 自动故障转移
– 推荐3节点配置

## 分片集群部署
– 适用于大规模数据
– 水平扩展能力
– 高吞吐量
– 复杂部署和管理

生产环境建议:对于生产环境,推荐使用副本集部署,至少3个节点,确保高可用性和数据安全性。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 MongoDB数据库安装前准备

3.1.1 系统环境检查

# 检查系统信息
$ cat /etc/redhat-release
Oracle Linux Server release 9.3

# 检查系统架构
$ uname -m
x86_64

# 检查内存
$ free -h
total used free shared buff/cache available
Mem: 32G 2.5G 28G 128M 1.5G 29G

# 检查磁盘空间
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 10G 90G 10% /
/dev/sdb1 500G 50G 450G 10% /mongodb

# 检查CPU
$ nproc
8

3.1.2 系统参数配置

# 关闭透明大页
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 调整文件描述符限制
$ echo “* soft nofile 65536” >> /etc/security/limits.conf
$ echo “* hard nofile 65536” >> /etc/security/limits.conf

# 调整内核参数
$ cat > /etc/sysctl.d/mongodb.conf << EOF fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_fin_timeout = 30 EOF $ sysctl -p /etc/sysctl.d/mongodb.conf

3.2 MongoDB数据库基础配置

3.2.1 创建MongoDB用户和目录

# 创建MongoDB用户
$ groupadd mongodb
$ useradd -g mongodb -s /bin/bash -m mongodb

# 创建目录结构
$ mkdir -p /mongodb/app
$ mkdir -p /mongodb/fgdata
$ mkdir -p /mongodb/log
$ mkdir -p /mongodb/conf

# 设置权限
$ chown -R mongodb:mongodb /mongodb

3.2.2 配置文件设置

# 创建配置文件
$ cat > /mongodb/conf/mongod.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /mongodb/fgdata journal: enabled: true # where to write logging data. systemLog: destination: file logAppend: true path: /mongodb/log/mongod.log # network interfaces net: port: 27017 bindIp: 0.0.0.0 # how the process runs processManagement: fork: true pidFilePath: /mongodb/app/mongod.pid # security security: authorization: enabled EOF

3.3 MongoDB数据库验证测试

3.3.1 启动MongoDB服务

# 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 12345
child process started successfully, parent exiting

# 检查服务状态
$ ps -ef | grep mongod
mongodb 12345 1 0 10:00 ? 00:00:01 /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf

# 检查端口
$ netstat -tuln | grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN

3.3.2 连接测试

# 连接MongoDB
$ /mongodb/app/bin/mongosh
Current Mongosh Log ID: 60a7b3c8d9e0f1a2b3c4d5e6
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000
Using MongoDB: 5.0.13
Using Mongosh: 1.6.2

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

fgedu.net.cn>

# 查看数据库
fgedu.net.cn> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

# 创建测试数据库
fgedu.net.cn> use fgedudb
switched to db fgedudb

# 创建测试集合
fgedu.net.cn> db.createCollection(“fgedu_collection”)
{ ok: 1 }

# 插入测试数据
fgedu.net.cn> db.fgedu_collection.insertOne({name: “fgedu”, age: 30, email: “fgedu@fgedu.net.cn”})
{
acknowledged: true,
insertedId: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e7”)
}

# 查询测试数据
fgedu.net.cn> db.fgedu_collection.find()
[ { _id: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e7”), name: ‘fgedu’, age: 30, email: ‘fgedu@fgedu.net.cn’ } ]

风哥提示:安装完成后,一定要进行验证测试,确保MongoDB服务正常运行,并且能够正常进行数据操作。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 MongoDB架构实战案例

以下是一个生产环境中的MongoDB副本集架构案例:

# 副本集架构
– 主节点(Primary):处理所有写操作
– 从节点(Secondary):复制主节点数据,处理读操作
– 仲裁节点(Arbiter):仅参与选举,不存储数据

# 部署配置
– 节点1:192.168.1.101(主节点)
– 节点2:192.168.1.102(从节点)
– 节点3:192.168.1.103(从节点)

# 副本集初始化
$ /mongodb/app/bin/mongosh
fgedu.net.cn> rs.initiate()
fgedu.net.cn> rs.add(“192.168.1.102:27017”)
fgedu.net.cn> rs.add(“192.168.1.103:27017″)

# 查看副本集状态
fgedu.net.cn> rs.status()
{
set: ‘rs0’,
date: ISODate(‘2026-04-07T02:00:00Z’),
myState: 1,
term: NumberLong(1),
syncingTo: ”,
syncSourceHost: ”,
syncSourceId: -1,
heartbeatIntervalMillis: NumberLong(2000),
majorityVoteCount: 2,
writeMajorityCount: 2,
votingMembersCount: 3,
writableVotingMembersCount: 3,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
lastCommittedWallTime: ISODate(‘2026-04-07T02:00:00Z’),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
appliedOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
durableOpTime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
lastAppliedWallTime: ISODate(‘2026-04-07T02:00:00Z’),
lastDurableWallTime: ISODate(‘2026-04-07T02:00:00Z’)
},
lastStableRecoveryTimestamp: Timestamp({ t: 1617782400, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: ‘electionTimeout’,
lastElectionDate: ISODate(‘2026-04-07T01:59:00Z’),
electionTerm: NumberLong(1),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 0, i: 0 }), t: NumberLong(-1) },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1617782340, i: 1 }), t: NumberLong(-1) },
numVotesNeeded: 2,
priorityAtElection: 1,
electionTimeoutMillis: NumberLong(10000),
newTermStartDate: ISODate(‘2026-04-07T01:59:00Z’),
wMajorityWriteAvailabilityDate: ISODate(‘2026-04-07T01:59:01Z’)
},
members: [
{
_id: 0,
name: ‘192.168.1.101:27017’,
health: 1,
state: 1,
stateStr: ‘PRIMARY’,
uptime: 3600,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
syncingTo: ”,
syncSourceHost: ”,
syncSourceId: -1,
infoMessage: ”,
electionTime: Timestamp({ t: 1617778740, i: 1 }),
electionDate: ISODate(‘2026-04-07T01:59:00Z’),
configVersion: 3,
configTerm: 1,
self: true,
lastHeartbeatMessage: ”
},
{
_id: 1,
name: ‘192.168.1.102:27017’,
health: 1,
state: 2,
stateStr: ‘SECONDARY’,
uptime: 3540,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDurable: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
optimeDurableDate: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeat: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeatRecv: ISODate(‘2026-04-07T02:00:00Z’),
pingMs: NumberLong(1),
lastHeartbeatMessage: ”,
syncingTo: ‘192.168.1.101:27017’,
syncSourceHost: ‘192.168.1.101:27017’,
syncSourceId: 0,
infoMessage: ”,
configVersion: 3,
configTerm: 1
},
{
_id: 2,
name: ‘192.168.1.103:27017’,
health: 1,
state: 2,
stateStr: ‘SECONDARY’,
uptime: 3540,
optime: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDurable: { ts: Timestamp({ t: 1617782400, i: 1 }), t: NumberLong(1) },
optimeDate: ISODate(‘2026-04-07T02:00:00Z’),
optimeDurableDate: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeat: ISODate(‘2026-04-07T02:00:00Z’),
lastHeartbeatRecv: ISODate(‘2026-04-07T02:00:00Z’),
pingMs: NumberLong(1),
lastHeartbeatMessage: ”,
syncingTo: ‘192.168.1.101:27017’,
syncSourceHost: ‘192.168.1.101:27017’,
syncSourceId: 0,
infoMessage: ”,
configVersion: 3,
configTerm: 1
}
],
ok: 1,
‘$clusterTime’: {
clusterTime: Timestamp({ t: 1617782400, i: 1 }),
signature: {
hash: Binary(Buffer.from(‘0000000000000000000000000000000000000000’, ‘hex’), 0),
keyId: NumberLong(0)
}
},
operationTime: Timestamp({ t: 1617782400, i: 1 })
}

4.2 MongoDB文档设计实战

以下是一个电商系统的MongoDB文档设计案例:

// 商品文档设计
{
“_id”: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e8”),
“product_id”: “P10001”,
“name”: “MongoDB高级实战教程”,
“description”: “MongoDB数据库高级实战教程,包括架构设计、性能优化、高可用性等内容”,
“price”: 299.99,
“stock”: 100,
“category”: “数据库”,
“tags”: [“MongoDB”, “NoSQL”, “数据库”],
“images”: [
“https://example.com/images/product1.jpg”,
“https://example.com/images/product2.jpg”
],
“attributes”: {
“author”: “风哥”,
“publisher”: “fgedu出版社”,
“publication_date”: “2026-04-07”,
“page_count”: 300
},
“created_at”: ISODate(“2026-04-07T00:00:00Z”),
“updated_at”: ISODate(“2026-04-07T00:00:00Z”)
}

// 订单文档设计
{
“_id”: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e9”),
“order_id”: “O20260407001”,
“user_id”: “U10001”,
“user_info”: {
“name”: “张三”,
“email”: “zhangsan@example.com”,
“phone”: “13800138000”,
“address”: “北京市朝阳区”
},
“items”: [
{
“product_id”: “P10001”,
“name”: “MongoDB高级实战教程”,
“quantity”: 1,
“price”: 299.99
},
{
“product_id”: “P10002”,
“name”: “Redis实战教程”,
“quantity”: 1,
“price”: 199.99
}
],
“total_amount”: 499.98,
“status”: “已支付”,
“payment_method”: “支付宝”,
“created_at”: ISODate(“2026-04-07T10:00:00Z”),
“updated_at”: ISODate(“2026-04-07T10:05:00Z”)
}

4.3 MongoDB性能测试实战

以下是MongoDB性能测试的实战案例:

# 使用mongosh进行性能测试
$ /mongodb/app/bin/mongosh

# 创建测试集合
fgedu.net.cn> use fgedudb
switched to db fgedudb
fgedu.net.cn> db.createCollection(“test_performance”)

# 插入测试数据
fgedu.net.cn> for (let i = 0; i < 100000; i++) { ... db.test_performance.insertOne({ ... id: i, ... name: "test" + i, ... value: Math.random() * 1000, ... created_at: new Date() ... }) ... } # 创建索引 fgedu.net.cn> db.test_performance.createIndex({id: 1})

# 测试查询性能
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_performance.find({id: {$gt: 50000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“查询时间: ” + (end – start) + “毫秒”)
查询时间: 15毫秒

# 测试聚合性能
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_performance.aggregate([
… { $match: { value: {$gt: 500} } },
… { $group: { _id: null, avg_value: { $avg: “$value” } } }
… ])
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“聚合时间: ” + (end – start) + “毫秒”)
聚合时间: 25毫秒

生产环境建议:在生产环境中,需要根据实际业务场景进行性能测试,找出性能瓶颈并进行优化。from MongoDB视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 MongoDB最佳实践建议

MongoDB的最佳实践建议:

# MongoDB最佳实践

## 数据模型设计
– 优先考虑嵌入式文档,减少关联查询
– 合理设计文档结构,避免过大的文档
– 为常用查询创建合适的索引
– 避免深度嵌套,一般不超过3-4层

## 索引设计
– 为常用查询字段创建索引
– 复合索引的顺序很重要,应将最常用的字段放在前面
– 定期检查索引使用情况
– 避免创建过多的索引

## 性能优化
– 使用SSD存储
– 合理设置内存大小,至少要有足够的内存容纳热数据
– 调整WiredTiger缓存大小
– 优化查询语句,避免全表扫描

## 高可用性
– 使用副本集部署
– 至少3个节点,确保高可用性
– 定期备份数据
– 监控系统状态

## 安全管理
– 启用认证和授权
– 使用TLS/SSL加密传输
– 定期更新密码
– 限制网络访问

5.2 MongoDB常见问题解决方案

MongoDB常见问题的解决方案:

# 常见问题及解决方案

## 连接数过多
– 症状:连接数达到上限,新连接被拒绝
– 解决方案:
– 增加maxIncomingConnections参数
– 使用连接池
– 检查应用程序是否正确关闭连接

## 内存使用过高
– 症状:内存使用持续增长,系统性能下降
– 解决方案:
– 调整WiredTiger缓存大小
– 限制MongoDB使用的内存
– 优化查询和索引

## 写入性能问题
– 症状:写入操作变慢
– 解决方案:
– 使用SSD存储
– 调整writeConcern参数
– 批量写入操作
– 优化文档大小

## 副本集同步延迟
– 症状:从节点与主节点数据不同步
– 解决方案:
– 检查网络连接
– 确保从节点有足够的资源
– 调整oplog大小
– 监控同步状态

5.3 MongoDB学习路径建议

MongoDB的学习路径建议:

# MongoDB学习路径

## 入门阶段
1. 安装和配置MongoDB
2. 基本CRUD操作
3. 文档数据模型
4. 基本查询语法

## 进阶阶段
1. 索引设计和优化
2. 聚合管道
3. 副本集部署和管理
4. 性能优化

## 高级阶段
1. 分片集群部署
2. 高可用性设计
3. 备份和恢复策略
4. 安全管理
5. 监控和告警

## 实战阶段
1. 业务场景设计
2. 性能调优实战
3. 故障排查
4. 生产环境部署

风哥提示:学习MongoDB需要理论与实践相结合,建议从基础开始,逐步深入,同时关注官方文档的更新,掌握最新的特性和最佳实践。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息