cxl
Published on 2025-05-14 / 12 Visits
0
0

MongoDB之运维

本文将详细介绍 MongoDB 的运维操作,包括备份恢复、性能优化、高可用配置、安全管理等核心场景。这里有个注意事项,就是据说MongoDB 4.4 及以上版本将 mongodumpmongorestore 等工具拆分为独立的 ‌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 运维体系,确保数据安全和业务连续性。


Comment