一、MongoDB基础认知
1.1 什么是MongoDB
MongoDB是一个基于文档的NoSQL数据库,使用JSON格式的BSON文档存储数据。与传统关系型数据库相比,MongoDB具有以下特点:
| 特性 | MongoDB | 传统SQL数据库 |
|---|---|---|
| 数据模型 | 文档型(BSON) | 行/表结构 |
| 扩展性 | 水平扩展简单 | 通常需要分区 |
| 查询语言 | 文档查询(JSON风格) | SQL语句 |
| 性能 | 读密集型优秀 | 事务支持强 |
| 灵活性 | schema-less | 固定结构 |
1.2 MongoDB应用场景
MongoDB适用于以下场景:
## MongoDB最佳应用场景
### Web应用
- 内容管理系统(CMS)
- 用户配置文件存储
- 博客和文章系统
- 电商商品目录
### 大数据分析
- 日志收集和分析
- 物联网(IoT)数据存储
- 实时分析平台
- 时序数据处理
### 移动应用
- 用户数据存储
- 地理位置数据
- 聊天消息存储
- 社交网络数据
### 缓存层
- 会话数据存储
- 临时数据缓存
- 配置信息存储
二、CentOS上MongoDB安装
2.1 环境准备
# 查看系统版本
cat /etc/centos-release
# 更新系统
sudo yum update -y
# 安装必要工具
sudo yum install -y wget curl vim net-tools
2.2 添加MongoDB官方源
# 创建yum源文件
sudo nano /etc/yum.repos.d/mongodb.repo
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
2.3 安装MongoDB
# 安装MongoDB
sudo yum install -y mongodb-org
# 或指定版本安装
sudo yum install -y mongodb-org-7.0.4 mongodb-org-server-7.0.4 mongodb-org-mongos-7.0.4 mongodb-org-tools-7.0.4
2.4 使用二进制包手动安装(备用方案)
# 下载MongoDB二进制包
cd /opt
sudo wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel90-7.0.4.tgz
# 解压
sudo tar -zxvf mongodb-linux-x86_64-rhel90-7.0.4.tgz
# 创建软链接
sudo ln -s /opt/mongodb-linux-x86_64-rhel90-7.0.4 /opt/mongodb
# 创建数据目录
sudo mkdir -p /data/db
sudo chmod -R 777 /data
# 创建日志目录
sudo mkdir -p /var/log/mongodb
sudo chmod -R 777 /var/log/mongodb
三、MongoDB启动与停止
3.1 启动MongoDB服务
方法一:使用systemd(推荐)
# 启动MongoDB
sudo systemctl start mongod
# 设置开机启动
sudo systemctl enable mongod
# 查看服务状态
sudo systemctl status mongod
方法二:使用mongod命令直接启动
# 基本启动命令
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --fork
# 带认证启动
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log \
--bind_ip 0.0.0.0 --port 27017 \
--auth --fork
# 自定义配置启动
mongod --config /etc/mongod.conf --fork
3.2 停止MongoDB服务
# 优雅停止(推荐)
sudo systemctl stop mongod
# 或使用mongod命令
mongod --shutdown --dbpath /data/db
# 强制停止(不推荐)
sudo pkill -f mongod
3.3 重启MongoDB服务
# 重启服务
sudo systemctl restart mongod
# 重新加载配置(不需要重启)
sudo systemctl reload mongod
3.4 验证MongoDB运行状态
# 方法一:检查进程
ps aux | grep mongod
# 方法二:检查端口
netstat -tlnp | grep 27017
# 方法三:使用mongosh连接测试
mongosh --eval "db.adminCommand('ping')"
# 方法四:检查日志
tail -f /var/log/mongodb/mongod.log
四、MongoDB配置文件详解
4.1 默认配置文件结构
# 查看默认配置
sudo cat /etc/mongod.conf
# mongod.conf 示例配置
# 网络配置
net:
port: 27017
bindIp: 127.0.0.1 # 仅本地访问
# bindIp: 0.0.0.0 # 允许远程访问(需配合防火墙)
# 存储配置
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1 # 缓存大小,根据内存调整
# 系统日志配置
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
# 进程控制配置
processManagement:
timeZoneInfo: /usr/share/zoneinfo
fork: true # 后台运行
# 安全配置(可选)
security:
authorization: enabled # 启用认证
# authorization: disabled # 禁用认证(仅测试环境)
4.2 常用配置参数说明
## 核心配置参数
### network
- port: MongoDB监听端口,默认27017
- bindIp: 监听IP地址,127.0.0.1仅本地,0.0.0.0允许远程
- maxIncomingConnections: 最大连接数
- wireObjectCheck: 验证BSON对象完整性
### storage
- dbPath: 数据文件存储路径
- journal.enabled: 启用预写日志,保证数据安全
- engine: 存储引擎(wiredTiger/inMemory)
- wiredTiger.cacheSizeGB: 缓存大小
### systemLog
- destination: 日志目标(file/syslog)
- path: 日志文件路径
- logAppend: 追加模式写入日志
- logRotate: 日志轮转方式
### processManagement
- fork: 是否后台运行
- pidFilePath: PID文件路径
4.3 生产环境推荐配置
# 生产环境mongod.conf
net:
port: 27017
bindIp: 127.0.0.1
maxIncomingConnections: 1000
wireObjectCheck: true
storage:
dbPath: /data/mongo
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 建议设置为可用内存的50-60%
journalCompressor: snappy
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: rename
processManagement:
fork: true
pidFilePath: /var/run/mongodb/mongod.pid
security:
authorization: enabled
operationProfiling:
mode: slowOp # 记录慢查询
slowOpThresholdMs: 100
五、MongoDB用户权限配置
5.1 创建管理员用户
# 连接到MongoDB(无认证模式)
mongosh
# 切换到admin数据库
use admin
# 创建管理员账户
db.createUser({
user: "admin",
pwd: "YourStrongPassword123",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})
# 验证用户创建
db.getUser("admin")
# 退出
exit
5.2 创建应用用户
# 使用管理员登录
mongosh -u admin -p --authenticationDatabase admin
# 创建应用数据库
use myapp
# 为应用创建用户
db.createUser({
user: "app_user",
pwd: "AppUserPassword123",
roles: [
{ role: "readWrite", db: "myapp" },
{ role: "dbAdmin", db: "myapp" }
]
})
# 退出
exit
5.3 启用认证并重启
# 编辑配置文件,启用认证
sudo nano /etc/mongod.conf
# 添加security配置
security:
authorization: enabled
# 重启MongoDB
sudo systemctl restart mongod
# 验证认证
mongosh -u admin -p --authenticationDatabase admin
5.4 用户权限角色说明
| 角色 | 权限说明 | 适用场景 |
|---|---|---|
| read | 读取数据 | 报表用户 |
| readWrite | 读写数据 | 应用用户 |
| dbAdmin | 数据库管理 | 运维人员 |
| userAdmin | 用户管理 | DBA |
| clusterAdmin | 集群管理 | 管理员 |
| readAnyDatabase | 读取所有库 | 审计人员 |
| readWriteAnyDatabase | 读写所有库 | 数据分析师 |
六、远程访问配置
6.1 修改绑定IP
# 编辑配置文件
sudo nano /etc/mongod.conf
# 修改bindIp为0.0.0.0
net:
port: 27017
bindIp: 0.0.0.0 # 允许所有IP访问
# 重启服务
sudo systemctl restart mongod
6.2 配置防火墙
# CentOS 7/8 使用firewalld
sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
sudo firewall-cmd --reload
# 或使用iptables
sudo iptables -A INPUT -p tcp --dport 27017 -j ACCEPT
sudo iptables-save
6.3 远程连接测试
# 从远程机器连接
mongosh "mongodb://your-server-ip:27017/myapp" -u app_user -p
# 或使用连接字符串
mongosh mongodb://admin:YourPassword@your-server-ip:27017/admin?authSource=admin
七、MongoDB启动脚本优化
7.1 创建系统服务脚本
# 创建服务文件
sudo nano /etc/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=mongod
Group=mongod
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/run/mongodb
ExecStartPre=/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/bin/chmod 0755 /var/run/mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecStartPre=/bin/sh -c 'test -d /var/lib/mongo || mkdir -p /var/lib/mongo && chown mongod:mongod /var/lib/mongo'
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mongod
[Install]
WantedBy=multi-user.target
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启用服务
sudo systemctl enable mongod
# 启动服务
sudo systemctl start mongod
7.2 启动检查脚本
#!/bin/bash
# MongoDB健康检查脚本
# 文件:/opt/mongodb_health_check.sh
LOG_FILE="/var/log/mongodb_health.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# 检查进程是否存在
if pgrep -x mongod > /dev/null; then
log "MongoDB process is running"
else
log "ERROR: MongoDB process not found!"
log "Attempting to restart..."
systemctl restart mongod
sleep 5
fi
# 检查端口是否监听
if netstat -tuln | grep -q ":27017 "; then
log "MongoDB port 27017 is listening"
else
log "ERROR: MongoDB port not listening!"
fi
# 测试连接
if mongosh --quiet --eval "db.adminCommand('ping')" > /dev/null 2>&1; then
log "MongoDB connection test passed"
else
log "ERROR: MongoDB connection test failed!"
fi
# 检查磁盘空间
DISK_USAGE=$(df -h /var/lib/mongo | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 80 ]; then
log "WARNING: Disk usage is ${DISK_USAGE}%"
else
log "Disk usage is OK: ${DISK_USAGE}%"
fi
log "Health check completed"
7.3 定时健康检查
# 添加到crontab
crontab -e
# 每5分钟执行健康检查
*/5 * * * * /opt/mongodb_health_check.sh >> /var/log/mongodb_health.log 2>&1
# 每天凌晨检查并清理日志
0 3 * * * find /var/log/mongodb -name "*.log" -mtime +30 -delete
八、常见问题与解决方案
Q1:MongoDB启动失败,端口被占用怎么办?
# 检查端口占用
netstat -tlnp | grep 27017
# 如果是其他进程占用,停止它
sudo systemctl stop <other-service>
# 或者修改MongoDB端口
sudo nano /etc/mongod.conf
# 修改 net.port 为 27018
# 重启MongoDB
sudo systemctl restart mongod
Q2:MongoDB启动后立即退出怎么办?
# 查看错误日志
cat /var/log/mongodb/mongod.log | grep -A 5 "ERROR"
# 常见原因及解决方法
# 1. 数据目录权限问题
sudo chown -R mongod:mongod /var/lib/mongo
sudo chown -R mongod:mongod /var/log/mongodb
# 2. 磁盘空间不足
df -h
# 清理不必要的文件
# 3. 配置文件错误
sudo mongod --config /etc/mongod.conf --check
# 4. 内存不足
free -h
# 减少wiredTiger cacheSizeGB
Q3:如何查看MongoDB运行状态?
# 使用mongosh查看状态
mongosh -u admin -p --authenticationDatabase admin
# 查看服务器状态
db.adminCommand({ serverStatus: 1 })
# 查看当前连接数
db.adminCommand({ currentOp: 1, active: true }).inprog.length
# 查看数据库列表
show dbs
# 查看集合列表
use myapp
show collections
# 查看用户
db.adminCommand({ listUsers: 1 })
Q4:如何优化MongoDB启动性能?
# 1. 使用SSD存储数据
# 2. 合理设置cacheSizeGB(建议为可用内存的50-60%)
# 3. 启用wiredTiger引擎压缩
# 4. 定期维护索引
# 查看当前配置
db.adminCommand({ getParameter: '*' })
# 检查慢查询
db.getProfilingStatus()
# 启用慢查询日志
db.setProfilingLevel(1, { slowms: 100 })
Q5:如何设置自动启动?
# 确保MongoDB服务已创建
sudo systemctl list-unit-files | grep mongod
# 如果没有,使用以下命令创建
sudo systemctl enable mongod
# 验证开机启动
sudo systemctl is-enabled mongod
# 如果想禁用开机启动
sudo systemctl disable mongod
九、总结
本文详细介绍了CentOS上MongoDB的安装、启动、配置和管理:
- 安装方式:通过官方yum源或手动下载二进制包
- 启动方法:systemd管理或直接mongod命令
- 配置优化:根据服务器资源调整配置文件
- 安全配置:创建用户并启用认证
- 远程访问:配置防火墙和绑定IP
- 监控维护:创建健康检查脚本定期监控
快速启动命令汇总
# 一键启动MongoDB(假设已安装)
sudo systemctl start mongod
mongosh --eval "db.adminCommand('ping')"
# 一键安装并启动(测试用)
sudo yum install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
记住:生产环境一定要启用认证,定期备份数据,监控性能指标。
注:本文基于MongoDB 7.0编写,具体命令和配置可能因版本而异。