第十三章:运维管理
最后更新: 2024-01-01
作者: MongoDB Team
页面目录
第十三章:运维管理
MongoDB 日常运维与问题处理
13.1 服务管理
启动和停止
# 启动 MongoDB
sudo systemctl start mongod
# 停止 MongoDB
sudo systemctl stop mongod
# 重启 MongoDB
sudo systemctl restart mongod
# 查看状态
sudo systemctl status mongod
# 开机自启
sudo systemctl enable mongod
sudo systemctl disable mongod
启动参数
# 命令行参数启动
mongod \
--dbpath /data/db \
--logpath /var/log/mongodb/mongod.log \
--bind_ip 127.0.0.1 \
--port 27017 \
--replSet rs0 \
--auth \
--fork
# 常用启动参数
mongod \
--dbpath # 数据目录
--logpath # 日志文件
--logappend # 追加日志
--bind_ip # 绑定 IP
--port # 端口
--replSet # 副本集名称
--shardsvr # 分片节点
--configsvr # 配置节点
--auth # 启用认证
--keyFile # 内部认证密钥
--fork # 后台运行
--journal # 启用日志
--directoryperdb # 每个数据库单独目录
--storageEngine # 存储引擎
13.2 数据库管理
数据库操作
// 查看所有数据库
show dbs
db.adminCommand('listDatabases')
// 切换数据库
use mydb
// 查看当前数据库
db
// 删除数据库
db.dropDatabase()
// 查看数据库信息
db.stats()
db.adminCommand({ dbStats: 1 })
// 查看数据库大小
db.adminCommand({ dbStats: 1 }).dataSize
集合操作
// 查看集合
show collections
db.getCollectionNames()
// 创建集合
db.createCollection("mycollection")
db.createCollection("mycollection", {
capped: true,
size: 10000000, // 10MB
max: 10000
})
// 删除集合
db.mycollection.drop()
// 查看集合统计
db.mycollection.stats()
db.mycollection.dataSize() // 数据大小
db.mycollection.totalSize() // 总大小(含索引)
db.mycollection.totalIndexSize() // 索引大小
集合清理
// 删除集合中的所有文档(保留索引)
db.mycollection.deleteMany({})
// 删除集合并重建索引
db.mycollection.drop()
db.createCollection("mycollection")
// 压缩集合(释放磁盘空间)
db.runCommand({ compact: 'mycollection' })
// 验证集合
db.mycollection.validate()
13.3 用户管理
用户操作
// 创建管理员
use admin
db.createUser({
user: "siteAdmin",
pwd: "admin_password",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
})
// 创建应用用户
db.createUser({
user: "app_user",
pwd: "app_password",
mechanisms: ["SCRAM-SHA-256"],
roles: [
{ role: "readWrite", db: "app_db" }
]
})
// 查看所有用户
db.adminCommand({ listUsers: 1 })
// 查看单个用户
db.getUser("username")
// 更新用户
db.updateUser("app_user", {
roles: [
{ role: "readWrite", db: "app_db" },
{ role: "dbAdmin", db: "app_db" }
]
})
// 修改密码
db.changeUserPassword("app_user", "new_password")
// 删除用户
db.dropUser("app_user")
13.4 性能问题处理
慢查询分析
// 查看当前操作
db.currentOp()
// 查看慢查询
db.currentOp({ "millis": { "$gt": 1000 } })
// 查看活动操作
db.currentOp({ "active": true })
// 查看锁信息
db.currentOp({ "waitingForLock": true })
// 强制终止操作
db.killOp(opid)
性能分析
// 启用分析器
db.setProfilingLevel(2, { slowms: 100 })
// 级别说明
// 0 - 关闭
// 1 - 只记录慢查询
// 2 - 记录所有操作
// 查看分析结果
db.system.profile.find().sort({ millis: -1 }).limit(10)
// 查看最近 1 秒的慢查询
db.system.profile.find({
ts: { $gt: new Date(Date.now() - 1000) }
})
// 关闭分析器
db.setProfilingLevel(0)
锁问题
// 查看锁信息
db.adminCommand({ top: 1 })
// 查看当前锁
db.adminCommand({ currentOp: 1, waitingForLock: true })
// 查看锁超时配置
db.adminCommand({ getParameter: 1, transactionLifetimeLimitSeconds: 1 })
// 设置锁超时
db.adminCommand({
setParameter: 1,
transactionLifetimeLimitSeconds: 300
})
13.5 存储管理
WiredTiger 配置
# mongod.conf
storage:
dbPath: /var/lib/mongodb
engine: wiredTiger
journal:
enabled: true
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 8 # WiredTiger 缓存大小
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
磁盘空间管理
// 查看磁盘空间
db.adminCommand({ listDatabases: 1 })
// 查看集合大小
db.mycollection.stats()
// 压缩集合(回收空间)
db.runCommand({ compact: 'mycollection', force: true })
// 修复数据库(整理碎片)
db.repairDatabase()
// 查看存储统计
db.adminCommand({ fileMD5: "mycollection" })
TTL 索引
// 创建 TTL 索引自动删除过期数据
db.sessions.createIndex(
{ "created_at": 1 },
{ expireAfterSeconds: 3600 } // 1 小时后自动删除
)
// 查看 TTL 索引
db.sessions.getIndexes()
// TTL 删除间隔(默认 60 秒)
db.adminCommand({
setParameter: 1,
TTLMonitorEnabled: true
})
13.6 日志管理
日志配置
# mongod.conf
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen
verbosity: 0
component:
accessControl:
verbosity: 0
command:
verbosity: 0
storage:
verbosity: 0
journal:
verbosity: 0
query:
verbosity: 2
index:
verbosity: 1
日志分析
# 查看最近日志
tail -f /var/log/mongodb/mongod.log
# 查找错误
grep -i error /var/log/mongodb/mongod.log
# 查找慢查询
grep -i "slow" /var/log/mongodb/mongod.log
# 日志轮转
logrotate -f /etc/logrotate.d/mongodb
日志保留
# /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 mongodb mongodb
postrotate
kill -USR1 $(pgrep mongod)
endscript
}
13.7 升级迁移
版本升级步骤
# 1. 检查当前版本
mongosh --eval "db.version()"
# 2. 检查兼容性
# 参考: https://docs.mongodb.com/manual/release-notes/
# 3. 备份数据
mongodump --out=/backup/pre_upgrade
# 4. 升级二进制文件
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y mongodb-org
# RHEL/CentOS
sudo yum update mongodb-org
# 5. 重启服务
sudo systemctl restart mongod
# 6. 验证升级
mongosh --eval "db.adminCommand({ buildInfo: 1 }).version"
功能兼容性
// 检查 FCV(Feature Compatibility Version)
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
// 设置 FCV
db.adminCommand({
setFeatureCompatibilityVersion: "7.0"
})
// 检查不兼容功能
db.adminCommand({ listIncompatibleSessions: 1 })
13.8 常见问题处理
连接问题
// 检查端口
db.adminCommand({ connectionStatus: 1 })
// 检查连接数
db.adminCommand({ serverStatus: 1 }).connections
// 查看最大连接数
db.adminCommand({ getParameter: 1, maxConns: 1 })
内存问题
// 查看内存使用
db.adminCommand({ serverStatus: 1 }).mem
// 查看 WiredTiger 缓存
db.adminCommand({ serverStatus: 1 }).wiredTiger.cache
// 调整缓存大小
db.adminCommand({
setParameter: 1,
wiredTigerMaximumCacheSizeGB: 16
})
复制问题
// 检查副本集状态
rs.status()
// 重新同步从节点
db.adminCommand({ resync: "hostname:port" })
// 重新初始化副本集
rs.reconfig(cfg, { force: true })
// 修复损坏的 oplog
use local
db.repairDatabase()
💡 实践提示
- 定期监控:设置监控告警,及时发现异常
- 日志管理:合理配置日志级别和轮转
- 性能基线:建立性能基线,便于对比分析
- 定期维护:定期执行维护任务(压缩、重建索引)
- 文档记录:记录配置变更和操作日志
📚 继续学习