MongoDB运维踩坑记录

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安装

  1. 下载安装包运行
  2. 选”Complete”安装
  3. 配置环境变量

配置文件路径:

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
vim /etc/mongod.conf
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创建文件。

检查状态:

1
getenforce

返回:Enforcing(强制)/Permissive(宽容)/Disabled(禁用)

临时关闭:

1
setenforce 0

永久禁用(需重启):

1
2
vi /etc/selinux/config
# SELINUX=enforcing 改为 SELINUX=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
# 1. 检查目录权限
ls -la /data/mongo

# 2. 检查挂载
mount | grep /data

# 3. 检查磁盘空间
df -h

# 4. 检查SELinux
getenforce

解决:

1
2
3
4
5
6
# 修复权限
chown -R mongod:mongod /data/db/mongo/
chmod 755 /data/db/mongo/

# 关闭SELinux
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

1
nvm use 14

方案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

# 保留7天
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

echo "Backup completed: $DATE.tar.gz"

监控与维护

数据库统计

1
2
3
4
// mongosh中执行
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
# 仅允许特定IP
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、权限这几个是老坑了。建议:

  1. 升级前先在测试环境验证
  2. 驱动版本要跟上
  3. SELinux搞不定的直接关了(生产环境除外)
  4. 备份脚本要定期测试

有问题的欢迎留言讨论。