MongoDB运维踩坑记录
用MongoDB好几年了,从4.x到6.0,踩了不少坑。记录一下常见的安装配置问题和解决方案。
版本选择
| 版本 |
特点 |
适用场景 |
| MongoDB 4.4 |
稳定成熟 |
生产环境求稳 |
| MongoDB 5.0 |
新特性 |
功能需求 |
| MongoDB 6.0 |
最新版 |
新项目 |
注意:MongoDB 6.0开始mongo命令废弃了,换成mongosh。驱动也要跟着升级,不然会报错。
驱动兼容性坑
Java连接MongoDB 6.0时报错:
1 2
| com.mongodb.MongoQueryException: Query failed with error code 352 'Unsupported OP_QUERY command'
|
解决:升级驱动版本
1 2 3 4 5
| <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-legacy</artifactId> <version>4.4.0</version> </dependency>
|
Linux安装
配置YUM仓库
1
| vim /etc/yum.repos.d/mongodb-org-6.0.repo
|
添加:
1 2 3 4 5 6
| [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://pgp.mongodb.com/server-6.0.asc
|
安装
1
| yum install -y mongodb-org
|
Windows安装
- 下载安装包运行
- 选”Complete”安装
- 配置环境变量
配置文件路径:
1
| C:\Program Files\MongoDB\Server\6.0\bin\mongod.cfg
|
数据目录配置
建议数据放独立磁盘,方便管理和备份。
1 2 3 4 5
| mkdir -p /data/db/mongo mkdir -p /data/log/mongodb
chown -R mongod:mongod /data/db/mongo/ chown -R mongod:mongod /data/log/mongodb/
|
修改配置:
1 2 3 4 5 6 7 8
| storage: dbPath: /data/db/mongo journal: enabled: true
systemLog: destination: file path: /data/log/mongodb/mongod.log
|
数据迁移
1 2 3 4 5 6 7 8
| systemctl stop mongod
rsync -av /var/lib/mongo /data/db/mongo/
systemctl start mongod
|
SELinux坑
SELinux经常阻止MongoDB创建文件。
检查状态:
返回:Enforcing(强制)/Permissive(宽容)/Disabled(禁用)
临时关闭:
永久禁用(需重启):
服务管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| systemctl start mongod
systemctl stop mongod
systemctl restart mongod
systemctl status mongod
systemctl enable mongod
|
查看日志
1 2 3 4 5
| tail -f /var/log/mongodb/mongod.log
tail -n 100 /var/log/mongodb/mongod.log
|
常见错误
错误1:Attempted to create a lock file on a read-only directory
症状:MongoDB无法启动,提示无法创建锁文件
排查:
1 2 3 4 5 6 7 8 9 10 11
| ls -la /data/mongo
mount | grep /data
df -h
getenforce
|
解决:
1 2 3 4 5 6
| chown -R mongod:mongod /data/db/mongo/ chmod 755 /data/db/mongo/
setenforce 0
|
错误2:Node.js连接失败 ECONNREFUSED 127.0.0.1:27017
症状:Node.js连不上MongoDB
原因:Node.js 16+默认用IPv6解析localhost,指向:::1而不是127.0.0.1
解决:
方案1:降级Node.js到14.x
方案2:用IP地址连接
1
| const uri = 'mongodb://127.0.0.1:27017/mydb';
|
方案3:强制IPv4
1
| const uri = 'mongodb://127.0.0.1:27017/mydb?family=4';
|
错误3:Unsupported OP_QUERY command
症状:Java驱动连接MongoDB 6.0报错
原因:驱动版本太老,不支持新协议
解决:升级驱动
1 2 3 4 5
| <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.7.0</version> </dependency>
|
性能优化
内存配置
MongoDB会尽可能用内存缓存数据。
| 数据量 |
推荐内存 |
| < 10GB |
8GB |
| 10-50GB |
16GB |
| 50-200GB |
32GB |
| > 200GB |
64GB+ |
WiredTiger缓存
1 2 3 4
| storage: wiredTiger: engineConfig: cacheSizeGB: 4
|
建议设置为可用内存的50%-60%。
连接数优化
1 2
| net: maxIncomingConnections: 1000
|
备份与恢复
mongodump备份
1 2 3 4 5 6 7 8
| mongodump --out /backup/$(date +%Y%m%d)
mongodump --db mydb --out /backup/$(date +%Y%m%d)
mongodump --host mongodb.example.com --port 27017 --out /backup/
|
mongorestore恢复
1 2 3 4 5
| mongorestore /backup/20240101/
mongorestore --db mydb /backup/20240101/mydb/
|
定时备份脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash
BACKUP_DIR="/backup/mongodb" DATE=$(date +%Y%m%d_%H%M%S)
mongodump --out $BACKUP_DIR/$DATE
cd $BACKUP_DIR tar -czf $DATE.tar.gz $DATE rm -rf $DATE
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE.tar.gz"
|
监控与维护
数据库统计
1 2 3 4
| db.stats() db.collection.stats() db.serverStatus()
|
查看连接
1 2
| db.currentOp() db.serverStatus().connections
|
慢查询分析
1 2 3 4 5
| db.setProfilingLevel(1, {slowms: 100})
show profile
|
安全配置
启用认证
创建管理员用户:
1 2 3 4 5 6 7 8
| mongosh
use admin db.createUser({ user: "admin", pwd: "strongpassword", roles: [{role: "userAdminAnyDatabase", db: "admin"}] })
|
配置文件启用:
1 2
| security: authorization: enabled
|
防火墙配置
1 2 3 4
| firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept'
firewall-cmd --reload
|
MongoDB整体来说挺好用的,但版本升级和驱动兼容性要注意。SELinux、IPv6、权限这几个是老坑了。建议:
- 升级前先在测试环境验证
- 驱动版本要跟上
- SELinux搞不定的直接关了(生产环境除外)
- 备份脚本要定期测试
有问题的欢迎留言讨论。