第十三章:运维管理

最后更新: 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()

💡 实践提示

  1. 定期监控:设置监控告警,及时发现异常
  2. 日志管理:合理配置日志级别和轮转
  3. 性能基线:建立性能基线,便于对比分析
  4. 定期维护:定期执行维护任务(压缩、重建索引)
  5. 文档记录:记录配置变更和操作日志

📚 继续学习