本文将详细介绍 MongoDB 的运维操作,包括备份恢复、性能优化、高可用配置、安全管理等核心场景。这里有个注意事项,就是据说MongoDB 4.4 及以上版本将 mongodump
、mongorestore
等工具拆分为独立的 Database Tools 包,需单独下载安装或下载Linux版本
以下示例操作以linux版本为准,将下载后的linux文件解压后得到工具文件列表
为了方便全部移动到 /usr/local/bin/ 目录下
1. 数据库备份策略
MongoDB 提供多种备份方式,需根据数据量和业务需求选择:
1.1 逻辑备份(mongodump)
适用于中小规模数据,通过导出 BSON 格式实现:
# 全量备份(默认 localhost:27017)
mongodump --out /data/backup/$(date +%Y%m%d)
# 指定认证信息和数据库,这里使用上一篇已经创建好的用户
mongodump -u user1 -p 'password1' --authenticationDatabase test \
--db test --out /data/backup/mydb_$(date +%Y%m%d)
# 压缩备份(MongoDB 4.4+)
mongodump --gzip --out /data/backup/compressed
# 其它命令选项可通过 mongodump --help查看,如 --uri=mongodb://localhost:27017
恢复命令:
# 全量恢复
mongorestore /data/backup/$(date +%Y%m%d)
# 恢复指定数据库并替换现有数据
mongorestore --drop --db mydb /data/backup/mydb_$(date +%Y%m%d)
2. 高可用与故障恢复
2.1 副本集配置
MongoDB 推荐使用副本集实现高可用性:
# 配置文件示例(/etc/mongod.conf)
replication:
replSetName: "rs0"
net:
bindIp: 0.0.0.0
port: 27017
所有节点都得配置,我这里配置了三台机器,因为用的是两个ubuntu wsl 子系统,网络用的是镜像模式,所以是同一个IP地址不同端口号
# 初始化副本集
mongo --host 192.168.3.77:27017
rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "192.168.3.77:27017"},
{_id: 1, host: "192.168.3.77:27018"},
{_id: 2, host: "192.168.3.66:27017"}
]
})
2.2 故障转移流程
主节点故障时,副本集会自动选举新主节点
应用需配置连接字符串以支持自动重连:
# Springboot 示例
# application.properties
spring.data.mongodb.uri=mongodb://user:password@192.168.3.77:27017,192.168.3.77:27018,192.168.3.66:27017/mydb?replicaSet=rs0&authSource=admin
// Node.js 示例
const mongoose = require('mongoose');
mongoose.connect('mongodb://192.168.3.77:27017,192.168.3.77:27018,192.168.3.66:27017/mydb?replicaSet=rs0');
2.3 分片集群管理
适用于超大规模数据:(这里仅做记录,未验证过)
# 启动配置服务器
mongod --configsvr --replSet configReplSet --dbpath /data/configdb --port 27019
# 启动分片服务器
mongod --shardsvr --replSet shard0 --dbpath /data/shard0 --port 27018
# 启动路由服务器(mongos)
mongos --configdb configReplSet/mongocfg1:27019,mongocfg2:27019 --port 27017
# 添加分片
sh.addShard("shard0/mongoshard1:27018")
3. 性能监控与优化
3.1 内置监控工具
mongostat:实时统计
mongostat --host rs0/mongodb1:27017,mongodb2:27017
mongotop:跟踪读写操作
mongotop --host mongodb1:27017 10 # 每10秒输出一次
3.2 查询优化
使用
explain()
分析查询性能:
db.orders.find({status: "completed"}).explain("executionStats")
创建复合索引:
db.orders.createIndex({status: 1, createdAt: -1})
3.3 内存与磁盘优化
确保 WiredTiger 缓存大小合理(通常为系统内存的 50%):
# mongod.conf
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 16 # 16GB 缓存(假设总内存 32GB)
使用 SSD 存储并启用
journaling
:
storage:
journal:
enabled: true
4. 安全加固措施
4.1 启用认证
# 创建管理员用户
use admin
db.createUser({
user: "admin",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
})
# 修改配置文件
security:
authorization: enabled
4.2 TLS/SSL 加密
# mongod.conf
net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/ca.pem
4.3 网络访问控制
配置防火墙规则:
# ufw 示例
ufw allow from 192.168.1.0/24 to any port 27017
使用 VPN 或私有网络连接
5. 自动化运维实践
5.1 备份脚本示例
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/data/backup/mongodb"
LOG_FILE="$BACKUP_DIR/backup_$DATE.log"
# 执行备份
mongodump --uri "mongodb://admin:password@localhost:27017/admin" \
--gzip --out "$BACKUP_DIR/$DATE" >> "$LOG_FILE" 2>&1
# 删除7天前的备份
find "$BACKUP_DIR" -type d -mtime +7 -exec rm -rf {} \; >> "$LOG_FILE" 2>&1
5.2 集成监控系统(Prometheus + Grafana)
使用
mongodb-exporter
采集指标:
mongodb_exporter --mongodb.uri=mongodb://admin:password@localhost:27017/admin
在 Grafana 中导入 MongoDB 监控仪表盘(ID: 11270)
6. 故障排查指南
6.1 常见错误处理
无法连接数据库:检查服务状态、端口占用、认证配置
systemctl status mongod
netstat -tulpn | grep 27017
磁盘空间不足:清理日志、优化索引或扩容存储
性能突然下降:检查慢查询、索引使用情况及系统资源
6.2 慢查询日志
# mongod.conf
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
总结
MongoDB 运维需要综合考虑备份恢复策略、高可用架构、性能优化、安全管控及自动化运维。通过本文介绍的方法和工具,你可以构建一套完整的 MongoDB 运维体系,确保数据安全和业务连续性。