本文档风哥主要介绍MongoDB官方架构与文档数据库特性,包括MongoDB数据库基本概念、文档数据模型、架构概览、硬件要求、操作系统环境、部署选项、安装前准备、基础配置、验证测试、架构实战案例、文档设计实战、性能测试实战等内容,风哥教程参考MongoDB官方文档Basic Concepts和Architecture内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 MongoDB数据库基本概念
MongoDB是一个基于文档的NoSQL数据库,使用BSON(Binary JSON)格式存储数据。与传统的关系型数据库相比,MongoDB具有更高的灵活性和可扩展性,适合处理大量非结构化数据。更多视频教程www.fgedu.net.cn
- 文档(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的架构主要包括以下组件:
– **mongod:** MongoDB服务器进程,负责处理客户端请求
– **mongos:** 查询路由器,用于分片集群
– **config server:** 存储分片集群的元数据
– **副本集:** 提供高可用性和数据冗余
– **分片:** 水平扩展数据存储
– **WiredTiger:** 默认存储引擎
– **MMAPv1:** 传统存储引擎
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节点配置
## 分片集群部署
– 适用于大规模数据
– 水平扩展能力
– 高吞吐量
– 复杂部署和管理
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用户和目录
$ 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服务
$ 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/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’ } ]
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性能测试的实战案例:
$ /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毫秒
Part05-风哥经验总结与分享
5.1 MongoDB最佳实践建议
MongoDB的最佳实践建议:
## 数据模型设计
– 优先考虑嵌入式文档,减少关联查询
– 合理设计文档结构,避免过大的文档
– 为常用查询创建合适的索引
– 避免深度嵌套,一般不超过3-4层
## 索引设计
– 为常用查询字段创建索引
– 复合索引的顺序很重要,应将最常用的字段放在前面
– 定期检查索引使用情况
– 避免创建过多的索引
## 性能优化
– 使用SSD存储
– 合理设置内存大小,至少要有足够的内存容纳热数据
– 调整WiredTiger缓存大小
– 优化查询语句,避免全表扫描
## 高可用性
– 使用副本集部署
– 至少3个节点,确保高可用性
– 定期备份数据
– 监控系统状态
## 安全管理
– 启用认证和授权
– 使用TLS/SSL加密传输
– 定期更新密码
– 限制网络访问
5.2 MongoDB常见问题解决方案
MongoDB常见问题的解决方案:
## 连接数过多
– 症状:连接数达到上限,新连接被拒绝
– 解决方案:
– 增加maxIncomingConnections参数
– 使用连接池
– 检查应用程序是否正确关闭连接
## 内存使用过高
– 症状:内存使用持续增长,系统性能下降
– 解决方案:
– 调整WiredTiger缓存大小
– 限制MongoDB使用的内存
– 优化查询和索引
## 写入性能问题
– 症状:写入操作变慢
– 解决方案:
– 使用SSD存储
– 调整writeConcern参数
– 批量写入操作
– 优化文档大小
## 副本集同步延迟
– 症状:从节点与主节点数据不同步
– 解决方案:
– 检查网络连接
– 确保从节点有足够的资源
– 调整oplog大小
– 监控同步状态
5.3 MongoDB学习路径建议
MongoDB的学习路径建议:
## 入门阶段
1. 安装和配置MongoDB
2. 基本CRUD操作
3. 文档数据模型
4. 基本查询语法
## 进阶阶段
1. 索引设计和优化
2. 聚合管道
3. 副本集部署和管理
4. 性能优化
## 高级阶段
1. 分片集群部署
2. 高可用性设计
3. 备份和恢复策略
4. 安全管理
5. 监控和告警
## 实战阶段
1. 业务场景设计
2. 性能调优实战
3. 故障排查
4. 生产环境部署
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
