本文档风哥主要介绍MongoDB单节点部署与生产优化,包括MongoDB单节点部署概念、单节点架构、单节点部署限制、单节点部署规划、单节点硬件要求、单节点优化建议、单节点安装、单节点配置、单节点优化步骤、单节点部署实战案例、单节点优化实战、单节点维护实战等内容,风哥教程参考MongoDB官方文档Deployment内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 MongoDB单节点部署概念
MongoDB单节点部署是指在单个服务器上运行一个MongoDB实例,不包含副本集或分片功能。这种部署方式适用于开发、测试环境,以及一些对高可用性要求不高的生产环境。更多视频教程www.fgedu.net.cn
- 简单易部署:配置和管理相对简单
- 资源占用少:不需要额外的服务器资源
- 成本低:只需要一台服务器
- 无高可用性:单点故障风险
- 无自动故障转移:需要手动恢复
1.2 MongoDB单节点架构
MongoDB单节点架构相对简单,主要包含以下组件:
## 核心组件
– **mongod进程:** MongoDB服务器进程,负责处理客户端请求
– **数据文件:** 存储在dbPath指定的目录中
– **日志文件:** 记录MongoDB的运行日志
– **配置文件:** 存储MongoDB的配置参数
## 数据存储
– **WiredTiger存储引擎:** 默认存储引擎,提供高性能和压缩
– **MMAPv1存储引擎:** 传统存储引擎,已逐渐被WiredTiger取代
## 网络通信
– **监听端口:** 默认27017
– **连接管理:** 处理客户端连接
– **协议:** MongoDB Wire Protocol
1.3 MongoDB单节点部署限制
MongoDB单节点部署存在以下限制:
## 高可用性限制
– 无数据冗余
– 单点故障风险
– 服务中断时需要手动恢复
## 扩展性限制
– 无法水平扩展
– 受单个服务器资源限制
– 大数据量场景性能下降
## 功能限制
– 无法使用副本集特性(如自动故障转移)
– 无法使用分片功能
– 读操作只能从单个节点获取
## 适用场景
– 开发环境
– 测试环境
– 小型应用
– 对高可用性要求不高的场景
Part02-生产环境规划与建议
2.1 MongoDB单节点部署规划
在进行MongoDB单节点部署规划时,需要考虑以下因素:
## 服务器规划
– 服务器选型:根据数据量和并发需求选择合适的服务器
– 操作系统:推荐使用Linux发行版(如Oracle Linux、RHEL、Ubuntu)
– 网络配置:确保网络连接稳定
## 存储规划
– 存储类型:推荐使用SSD,提高I/O性能
– 存储容量:根据数据量和增长趋势规划
– 存储路径:建议使用独立的磁盘分区
## 目录规划
– 数据目录:/mongodb/fgdata
– 日志目录:/mongodb/log
– 配置目录:/mongodb/conf
– 安装目录:/mongodb/app
## 网络规划
– 端口配置:默认27017
– 防火墙规则:允许MongoDB端口访问
– 网络安全:限制访问IP
2.2 MongoDB单节点硬件要求
MongoDB单节点的硬件要求取决于数据量和并发访问量:
## 内存
– 小型部署:4GB+ RAM
– 中型部署:8GB-16GB RAM
– 大型部署:16GB+ RAM
## CPU
– 小型部署:2核+ CPU
– 中型部署:4核+ CPU
– 大型部署:8核+ CPU
## 存储
– 小型部署:50GB+ SSD
– 中型部署:200GB+ SSD
– 大型部署:500GB+ SSD
## 网络
– 小型部署:千兆网卡
– 中型部署:千兆网卡
– 大型部署:万兆网卡
2.3 MongoDB单节点优化建议
MongoDB单节点的优化建议:
## 系统优化
– 关闭透明大页
– 关闭NUMA
– 调整文件描述符限制
– 优化内核参数
## 存储优化
– 使用SSD存储
– 启用WiredTiger压缩
– 调整WiredTiger缓存大小
– 定期整理碎片
## 内存优化
– 确保有足够的内存容纳热数据
– 避免内存交换
– 监控内存使用情况
## 网络优化
– 调整TCP参数
– 限制连接数
– 监控网络流量
## 查询优化
– 创建适当的索引
– 优化查询语句
– 避免全表扫描
– 使用覆盖索引
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: 16G 2.5G 12G 128M 1.5G 13G
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 10G 90G 10% /
/dev/sdb1 500G 50G 450G 10% /mongodb
$ nproc
8
3.1.2 安装MongoDB
$ cat > /etc/yum.repos.d/mongodb-org-5.0.repo << EOF [mongodb-org-5.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/5.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc EOF # 安装MongoDB $ sudo yum install -y mongodb-org # 验证安装 $ mongod --version db version v5.0.13 Build Info: Version: 5.0.13 Git Version: 296987339731707f37e20b20c52a048929b3904e OpenSSL version: OpenSSL 1.1.1k FIPS 25 Mar 2021 modules: build environment: distmod: rhel80 distarch: x86_64 target_arch: x86_64 # 创建目录结构 $ sudo mkdir -p /mongodb/fgdata $ sudo mkdir -p /mongodb/log $ sudo mkdir -p /mongodb/conf # 创建MongoDB用户和组 $ sudo groupadd mongodb $ sudo useradd -g mongodb -s /bin/bash -m mongodb # 设置权限 $ sudo chown -R mongodb:mongodb /mongodb
3.2 MongoDB单节点配置
3.2.1 创建配置文件
$ cat > /mongodb/conf/mongod.conf << EOF # mongod.conf # 存储配置 storage: dbPath: /mongodb/fgdata journal: enabled: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 8 directoryForIndexes: true collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: true # 日志配置 systemLog: destination: file logAppend: true path: /mongodb/log/mongod.log logRotate: reopen verbosity: 0 # 网络配置 net: port: 27017 bindIp: 0.0.0.0 maxIncomingConnections: 65536 # 进程管理 processManagement: fork: true pidFilePath: /mongodb/app/mongod.pid # 安全配置 security: authorization: enabled EOF
3.2.2 启动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
# 创建管理员用户
$ /mongodb/app/bin/mongosh
fgedu.net.cn> use admin
fgedu.net.cn> db.createUser({
… user: “fgedu”,
… pwd: “fgedu123”,
… roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
… })
3.3 MongoDB单节点优化步骤
3.3.1 系统优化
## 关闭透明大页
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 调整文件描述符限制
$ cat > /etc/security/limits.d/mongodb.conf << EOF
mongodb soft nofile 65536
mongodb hard nofile 65536
EOF
# 调整内核参数
$ 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.3.2 MongoDB优化
## 调整WiredTiger缓存大小
# 在配置文件中设置
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
## 启用压缩
storage:
wiredTiger:
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
## 调整日志配置
systemLog:
logRotate: reopen
verbosity: 0
## 调整网络配置
net:
maxIncomingConnections: 65536
## 调整操作配置
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
Part04-生产案例与实战讲解
4.1 MongoDB单节点部署实战案例
以下是一个生产环境中的MongoDB单节点部署实战案例:
## 环境信息
– 操作系统:Oracle Linux 9.3
– 服务器:192.168.1.101
– MongoDB版本:5.0.13
– 内存:16GB
– 存储:SSD 500GB
## 部署步骤
### 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: 16G 2.5G 12G 128M 1.5G 13G
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 10G 90G 10% /
/dev/sdb1 500G 50G 450G 10% /mongodb
### 2. 安装MongoDB
$ cat > /etc/yum.repos.d/mongodb-org-5.0.repo << EOF
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
EOF
$ sudo yum install -y mongodb-org
### 3. 配置MongoDB
$ sudo mkdir -p /mongodb/fgdata /mongodb/log /mongodb/conf
$ sudo groupadd mongodb
$ sudo useradd -g mongodb -s /bin/bash -m mongodb
$ sudo chown -R mongodb:mongodb /mongodb
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 8
directoryForIndexes: true
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
systemLog:
destination: file
logAppend: true
path: /mongodb/log/mongod.log
logRotate: reopen
verbosity: 0
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
processManagement:
fork: true
pidFilePath: /mongodb/app/mongod.pid
security:
authorization: enabled
EOF
### 4. 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
### 5. 创建管理员用户
$ /mongodb/app/bin/mongosh
fgedu.net.cn> use admin
fgedu.net.cn> db.createUser({
… user: “fgedu”,
… pwd: “fgedu123”,
… roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
… })
### 6. 验证部署
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.createCollection(“fgedu_collection”)
fgedu.net.cn> db.fgedu_collection.insertOne({name: “fgedu”, age: 30, email: “fgedu@fgedu.net.cn”})
fgedu.net.cn> db.fgedu_collection.find()
[ { _id: ObjectId(“60a7b3c8d9e0f1a2b3c4d5e7”), name: ‘fgedu’, age: 30, email: ‘fgedu@fgedu.net.cn’ } ]
4.2 MongoDB单节点优化实战
以下是MongoDB单节点优化的实战案例:
## 1. 系统优化
### 关闭透明大页
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
### 调整文件描述符限制
$ cat > /etc/security/limits.d/mongodb.conf << EOF
mongodb soft nofile 65536
mongodb hard nofile 65536
EOF
### 调整内核参数
$ 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
## 2. MongoDB配置优化
### 调整配置文件
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 8
directoryForIndexes: true
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
systemLog:
destination: file
logAppend: true
path: /mongodb/log/mongod.log
logRotate: reopen
verbosity: 0
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
processManagement:
fork: true
pidFilePath: /mongodb/app/mongod.pid
security:
authorization: enabled
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
EOF
### 重启MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
## 3. 性能测试
### 插入测试
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 --authenticationDatabase admin
fgedu.net.cn> use fgedudb
fgedu.net.cn> var start = new Date()
fgedu.net.cn> for (let i = 0; i < 100000; i++) {
... db.test_collection.insertOne({id: i, name: "test" + i, value: Math.random() * 1000})
... }
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“插入时间: ” + (end – start) + “毫秒”)
插入时间: 5000毫秒
### 查询测试
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_collection.find({id: {$gt: 50000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“查询时间: ” + (end – start) + “毫秒”)
查询时间: 20毫秒
### 索引优化
fgedu.net.cn> db.test_collection.createIndex({id: 1})
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_collection.find({id: {$gt: 50000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“索引后查询时间: ” + (end – start) + “毫秒”)
索引后查询时间: 5毫秒
4.3 MongoDB单节点维护实战
以下是MongoDB单节点维护的实战案例:
## 1. 备份与恢复
### 逻辑备份
$ /mongodb/app/bin/mongodump -u fgedu -p fgedu123 –authenticationDatabase admin –db fgedudb –out /backup/mongodb
### 逻辑恢复
$ /mongodb/app/bin/mongorestore -u fgedu -p fgedu123 –authenticationDatabase admin –db fgedudb /backup/mongodb/fgedudb
### 物理备份
$ sudo cp -r /mongodb/fgdata /backup/mongodb/fgdata
## 2. 日志管理
### 查看日志
$ tail -n 100 /mongodb/log/mongod.log
### 日志轮转
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf –logRotate reopen
## 3. 性能监控
### 查看服务器状态
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.serverStatus()
### 查看慢查询
fgedu.net.cn> db.system.profile.find({millis: {$gt: 100}}).sort({ts: -1})
### 查看连接数
fgedu.net.cn> db.serverStatus().connections
## 4. 日常维护
### 整理碎片
fgedu.net.cn> db.runCommand({ compact: “fgedu_collection” })
### 重建索引
fgedu.net.cn> db.fgedu_collection.reIndex()
### 检查数据库
fgedu.net.cn> db.runCommand({ dbStats: 1 })
### 检查集合
fgedu.net.cn> db.fgedu_collection.stats()
Part05-风哥经验总结与分享
5.1 MongoDB单节点最佳实践
MongoDB单节点的最佳实践建议:
## 部署建议
– 使用SSD存储
– 确保足够的内存
– 合理规划目录结构
– 启用认证和授权
## 配置建议
– 调整WiredTiger缓存大小
– 启用压缩
– 配置适当的日志级别
– 限制连接数
## 监控建议
– 监控系统资源使用情况
– 监控MongoDB性能指标
– 监控慢查询
– 监控日志文件
## 备份建议
– 定期进行逻辑备份
– 定期进行物理备份
– 备份到异地存储
– 测试备份恢复
## 安全建议
– 启用认证和授权
– 限制网络访问
– 定期更新密码
– 监控异常访问
5.2 MongoDB单节点故障排查
MongoDB单节点故障排查的建议:
## 启动失败
– 检查配置文件语法
– 检查数据目录权限
– 检查端口是否被占用
– 查看日志文件
## 性能下降
– 检查系统资源使用情况
– 检查慢查询
– 检查索引使用情况
– 检查网络连接
## 连接问题
– 检查网络连接
– 检查防火墙规则
– 检查最大连接数设置
– 检查认证配置
## 数据损坏
– 检查数据目录
– 使用mongod –repair修复
– 从备份恢复
– 检查硬件故障
## 日志异常
– 查看日志文件
– 分析错误信息
– 检查系统状态
– 采取相应措施
5.3 MongoDB单节点升级实战
MongoDB单节点升级的实战步骤:
## 升级前准备
– 备份数据库
– 检查当前版本
– 下载目标版本
– 阅读升级文档
## 升级步骤
### 1. 停止MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf –shutdown
### 2. 备份数据
$ sudo cp -r /mongodb/fgdata /backup/mongodb/fgdata-$(date +%Y%m%d)
### 3. 安装新版本
$ sudo yum update -y mongodb-org
### 4. 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf
### 5. 验证升级
$ /mongodb/app/bin/mongod –version
### 6. 运行升级检查
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
fgedu.net.cn> db.adminCommand({ setFeatureCompatibilityVersion: “5.0” })
### 7. 测试功能
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.fgedu_collection.find()
fgedu.net.cn> db.fgedu_collection.insertOne({name: “test”, age: 20})
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
