Skip to content

MongoDB 故障分类

硬件故障

服务器硬件故障

  1. CPU 故障

    • 症状:服务器无响应、频繁重启、系统日志中出现 CPU 错误
    • 影响:MongoDB 服务中断、数据写入失败
    • 处理方法:
      bash
      # 检查 CPU 状态
      top
      # 查看系统日志
      dmesg | grep -i cpu
  2. 内存故障

    • 症状:服务器频繁重启、内存报错、MongoDB OOM 崩溃
    • 影响:数据丢失风险、服务中断
    • 处理方法:
      bash
      # 运行内存检测
      memtest86+
      # 查看内存使用情况
      free -h
  3. 硬盘故障

    • 症状:I/O 错误、文件系统损坏、硬盘指示灯异常
    • 影响:数据损坏、服务无法启动
    • 处理方法:
      bash
      # 检查硬盘状态
      smartctl -a /dev/sda
      # 检查文件系统
      fsck -y /dev/sda1
  4. 电源故障

    • 症状:服务器突然关机、UPS 报警
    • 影响:数据未刷新到磁盘、服务中断
    • 处理方法:
      bash
      # 检查系统启动日志
      journalctl -b
      # 验证数据完整性
      mongod --repair

存储设备故障

  1. RAID 故障

    • 症状:RAID 控制器报警、磁盘掉线、阵列降级
    • 影响:性能下降、数据冗余丢失
    • 处理方法:
      bash
      # 查看 RAID 状态(不同厂商命令不同)
      megacli -LDInfo -Lall -aAll
      # 重建 RAID
      megacli -PDRbld -Start -PhysDrv [1:0] -a0
  2. SAN/NAS 故障

    • 症状:存储设备无法访问、I/O 延迟高、连接中断
    • 影响:MongoDB 服务中断、数据访问失败
    • 处理方法:
      bash
      # 检查存储连接
      ping san-storage
      # 检查挂载状态
      df -h

软件故障

MongoDB 进程故障

  1. MongoDB 崩溃

    • 症状:mongod 进程消失、日志中出现致命错误
    • 影响:服务中断、连接失败
    • 处理方法:
      bash
      # 查看 MongoDB 日志
      tail -n 100 /var/log/mongodb/mongod.log
      # 重启 MongoDB 服务
      systemctl restart mongod
  2. MongoDB 无响应

    • 症状:客户端连接超时、命令执行缓慢或无响应
    • 影响:应用程序无法访问数据库
    • 处理方法:
      bash
      # 检查 MongoDB 进程状态
      ps aux | grep mongod
      # 检查连接数
      netstat -tuln | grep 27017

数据库级故障

  1. 集合损坏

    • 症状:查询失败、错误代码 136(数据文件损坏)
    • 影响:部分数据无法访问
    • 处理方法:
      javascript
      // 检查集合状态
      db.collection.validate()
      // 修复集合
      db.collection.validate({ full: true })
  2. 索引损坏

    • 症状:查询报错、索引无法使用、性能下降
    • 影响:查询性能严重下降
    • 处理方法:
      javascript
      // 重建索引
      db.collection.reIndex()
      // 或删除后重新创建
      db.collection.dropIndex("index_name")
      db.collection.createIndex({ field: 1 })
  3. oplog 损坏

    • 症状:复制延迟增加、从节点无法同步
    • 影响:复制集数据不一致
    • 处理方法:
      javascript
      // 重新初始化从节点
      rs.reSync()
      // 或手动同步
      // 1. 停止从节点
      // 2. 复制主节点数据文件
      // 3. 启动从节点

操作系统故障

  1. 操作系统崩溃

    • 症状:服务器蓝屏、系统无法启动
    • 影响:MongoDB 服务完全中断
    • 处理方法:
      bash
      # 启动到救援模式
      # 检查文件系统
      fsck -y /dev/sda1
      # 重启系统
      reboot
  2. 系统资源耗尽

    • 症状:CPU 使用率 100%、内存不足、磁盘空间满
    • 影响:MongoDB 性能下降、服务崩溃
    • 处理方法:
      bash
      # 检查 CPU 和内存使用
      top
      # 检查磁盘空间
      df -h
      # 清理日志或临时文件
      rm -rf /var/log/mongodb/*.log.old

网络故障

局域网故障

  1. 交换机故障

    • 症状:网络连接中断、交换机指示灯异常
    • 影响:复制集成员无法通信、选举失败
    • 处理方法:
      bash
      # 检查网络连接
      ping -c 4 mongodb-primary
      # 检查交换机状态
      # 通过交换机管理界面查看
  2. 网络线缆故障

    • 症状:网络连接时断时续、网卡指示灯不亮
    • 影响:复制延迟、连接不稳定
    • 处理方法:
      bash
      # 检查网卡状态
      ethtool eth0
      # 检查网络连接
      mii-tool eth0

广域网故障

  1. 跨区域网络中断

    • 症状:跨区域复制集成员无法通信、延迟极高
    • 影响:跨区域数据不一致、故障转移失败
    • 处理方法:
      bash
      # 检查网络延迟
      ping -c 4 us-east-1-mongodb
      # 检查路由
      traceroute us-east-1-mongodb
  2. 防火墙配置错误

    • 症状:连接被拒绝、端口无法访问
    • 影响:客户端无法连接、复制集成员无法通信
    • 处理方法:
      bash
      # 检查防火墙规则
      iptables -L -n
      # 测试端口可达性
      telnet mongodb-primary 27017

DNS 故障

  1. DNS 解析失败

    • 症状:无法通过主机名连接、DNS 超时
    • 影响:客户端连接失败、复制集配置错误
    • 处理方法:
      bash
      # 测试 DNS 解析
      nslookup mongodb-primary
      # 使用 IP 直接连接测试
      mongo --host 192.168.1.100
  2. DNS 缓存过期

    • 症状:连接到错误的 IP 地址、服务不可用
    • 影响:客户端连接到错误的服务器
    • 处理方法:
      bash
      # 刷新 DNS 缓存
      systemctl restart systemd-resolved
      # 或手动刷新
      resolvectl flush-caches

复制集故障

选举相关故障

  1. 选举失败

    • 症状:复制集没有主节点、状态显示 RECOVERING
    • 影响:无法写入数据、服务降级
    • 处理方法:
      javascript
      // 查看复制集状态
      rs.status()
      // 检查节点优先级配置
      rs.conf()
  2. 频繁选举

    • 症状:主节点频繁切换、日志中选举信息频繁
    • 影响:写入性能下降、连接断开
    • 处理方法:
      javascript
      // 查看选举日志
      db.adminCommand({ getLog: "rs" })
      // 调整选举超时
      rs.reconfig({ electionTimeoutMillis: 20000 })

复制延迟故障

  1. 复制延迟过高
    • 症状:从节点 oplog 落后主节点过多、rs.printSlaveReplicationInfo() 显示延迟大
    • 影响:数据不一致、故障转移风险
    • 处理方法:
      javascript
      // 查看复制延迟
      rs.printSlaveReplicationInfo()
      // 检查 oplog 大小
      use local

db.oplog.rs.stats().maxSize ```

  1. 从节点无法同步
    • 症状:从节点状态显示 RECOVERING、复制错误
    • 影响:数据冗余丢失、高可用性降低
    • 处理方法:
      javascript
      // 重新同步从节点
      rs.reSync()
      // 或手动同步
      db.adminCommand({ resync: 1 })

分片集群故障

分片键设计问题

  1. 分片键 cardinality 低

    • 症状:数据分布不均、单个分片负载过高
    • 影响:性能瓶颈、集群扩展性差
    • 处理方法:
      javascript
      // 查看分片分布
      sh.status()
      // 检查集合分片状态
      db.collection.getShardDistribution()
  2. 热点分片

    • 症状:单个分片 CPU/IO 使用率过高、其他分片空闲
    • 影响:性能下降、资源浪费
    • 处理方法:
      javascript
      // 查看分片服务器状态
      db.serverStatus()
      // 考虑重新设计分片键

配置服务器故障

  1. 配置服务器不可用

    • 症状:分片集群无法执行元数据操作、配置无法更新
    • 影响:无法添加分片、无法创建分片集合
    • 处理方法:
      javascript
      // 检查配置服务器状态
      sh.status()
      // 检查配置服务器连接
      mongo --host configserver1
  2. 配置数据不一致

    • 症状:分片集群行为异常、元数据冲突
    • 影响:数据丢失风险、集群管理困难
    • 处理方法:
      bash
      # 修复配置服务器
      mongod --repair --configsvr
      # 重新初始化配置服务器

mongos 路由器故障

  1. mongos 进程崩溃

    • 症状:应用程序连接失败、mongos 进程消失
    • 影响:无法访问分片集群
    • 处理方法:
      bash
      # 重启 mongos 服务
      systemctl restart mongos
      # 查看 mongos 日志
      tail -n 100 /var/log/mongodb/mongos.log
  2. mongos 连接池耗尽

    • 症状:客户端连接超时、mongos 日志中连接错误
    • 影响:应用程序无法连接、请求失败
    • 处理方法:
      javascript
      // 查看 mongos 连接数
      db.serverStatus().connections
      // 调整 mongos 连接池大小
      mongos --maxConns 20000

人为故障

操作失误

  1. 误删除数据

    • 症状:集合或数据库消失、数据查询不到
    • 影响:数据丢失、业务中断
    • 处理方法:
      javascript
      // 从备份恢复
      mongorestore --db test /backup/test
      // 从 oplog 恢复特定时间点
      mongorestore --oplogReplay --oplogLimit "123456:789" /backup
  2. 误修改配置

    • 症状:MongoDB 服务无法启动、配置错误
    • 影响:服务中断、性能异常
    • 处理方法:
      bash
      # 恢复配置文件备份
      cp /etc/mongod.conf.bak /etc/mongod.conf
      # 重启服务
      systemctl restart mongod
  3. 误执行高危命令

    • 症状:数据库锁定、性能骤降
    • 影响:服务不可用、响应缓慢
    • 处理方法:
      javascript
      // 终止长时间运行的命令
      db.currentOp().inprog.forEach(op => {
        if (op.secs_running > 60) {
          db.killOp(op.opid);
        }
      });

权限管理失误

  1. 权限配置错误

    • 症状:用户无法访问数据库、权限不足错误
    • 影响:业务无法访问数据、运维操作受限
    • 处理方法:
      javascript
      // 检查用户权限
      db.getUser("username")
      // 修复用户权限
      db.grantRolesToUser("username", [{ role: "readWrite", db: "test" }])
  2. 密码泄露

    • 症状:未授权访问、异常登录记录
    • 影响:数据泄露、安全风险
    • 处理方法:
      javascript
      // 修改用户密码
      db.changeUserPassword("username", "newpassword")
      // 检查登录日志
      db.adminCommand({ getLog: "security" })

安全故障

认证授权故障

  1. 认证失败

    • 症状:客户端连接认证失败、日志中认证错误
    • 影响:无法访问数据库、业务中断
    • 处理方法:
      javascript
      // 检查用户状态
      db.getUser("username")
      // 验证认证配置
      db.adminCommand({ getCmdLineOpts: 1 })
  2. 授权失败

    • 症状:操作权限不足、错误代码 13
    • 影响:无法执行特定操作、业务功能受限
    • 处理方法:
      javascript
      // 检查用户角色
      db.getUser("username", { showPrivileges: true })
      // 授予必要权限
      db.grantRolesToUser("username", [{ role: "dbAdmin", db: "test" }])

数据泄露

  1. 未授权访问

    • 症状:异常登录、数据被导出
    • 影响:数据泄露、安全合规问题
    • 处理方法:
      javascript
      // 检查连接日志
      db.adminCommand({ getLog: "connection" })
      // 启用审计日志
      db.adminCommand({ setParameter: 1, auditAuthorizationSuccess: true })
  2. 数据加密问题

    • 症状:加密密钥丢失、数据无法解密
    • 影响:数据永久丢失、业务中断
    • 处理方法:
      bash
      # 恢复加密密钥备份
      cp /backup/keyfile /etc/mongodb/keyfile
      # 验证密钥完整性
      openssl dgst -sha256 /etc/mongodb/keyfile

性能故障

查询性能故障

  1. 慢查询过多

    • 症状:查询执行时间长、日志中慢查询记录多
    • 影响:CPU 使用率高、响应缓慢
    • 处理方法:
      javascript
      // 查看慢查询日志
      db.adminCommand({ getLog: "slowop" })
      // 分析查询执行计划
      db.collection.find({}).explain()
  2. 索引缺失

    • 症状:全表扫描、查询性能差
    • 影响:CPU 和 I/O 使用率高、响应缓慢
    • 处理方法:
      javascript
      // 查看查询执行计划
      db.collection.find({ field: "value" }).explain()
      // 创建缺失的索引
      db.collection.createIndex({ field: 1 })

写入性能故障

  1. 写入延迟高

    • 症状:写入操作响应时间长、主从延迟增加
    • 影响:应用程序响应缓慢、数据不一致
    • 处理方法:
      javascript
      // 查看写入锁状态
      db.serverStatus().globalLock
      // 检查磁盘 I/O
      iostat -x 1
  2. 并发写入冲突

    • 症状:写入冲突错误、乐观锁失败
    • 影响:写入失败、重试成本高
    • 处理方法:
      javascript
      // 查看写入冲突日志
      db.adminCommand({ getLog: "write" })
      // 优化写入模式
      db.collection.updateOne({ _id: 1, version: 1 }, { $set: { field: "value" }, $inc: { version: 1 } })

常见问题(FAQ)

Q1: 如何快速定位 MongoDB 故障类型?

A1: 快速定位故障类型的步骤:

  1. 检查 MongoDB 日志:tail -n 100 /var/log/mongodb/mongod.log
  2. 检查进程状态:ps aux | grep mongod
  3. 检查硬件状态:smartctl -a /dev/sda, free -h
  4. 检查网络连接:ping mongodb-primary, telnet mongodb-primary 27017
  5. 检查数据库状态:mongo --eval "db.serverStatus()"

Q2: 硬件故障和软件故障的主要区别是什么?

A2: 硬件故障是指物理设备损坏,如服务器、硬盘、内存等;软件故障是指软件层面的问题,如 MongoDB 进程崩溃、配置错误、代码 bug 等。硬件故障通常需要更换硬件,而软件故障可以通过重启服务、修复配置或代码来解决。

Q3: 如何预防人为故障?

A3: 预防人为故障的措施:

  1. 建立严格的操作流程和审批机制
  2. 实施权限最小化原则,限制高危操作权限
  3. 定期备份数据,确保备份可用
  4. 使用自动化工具执行重复性操作,减少人工干预
  5. 定期进行运维培训,提高操作技能
  6. 实施变更管理,记录所有操作

Q4: 复制集故障和分片集群故障的处理有什么不同?

A4: 复制集故障主要涉及主从切换、复制延迟和选举问题,处理相对简单;分片集群故障涉及分片分布、配置服务器和 mongos 路由器,处理更为复杂,需要考虑整个集群的一致性和可用性。

Q5: 如何处理 MongoDB 性能故障?

A5: 处理 MongoDB 性能故障的步骤:

  1. 分析慢查询日志,优化查询和索引
  2. 检查系统资源使用情况(CPU、内存、磁盘 I/O)
  3. 调整 MongoDB 配置参数
  4. 考虑垂直扩展(增加硬件资源)或水平扩展(分片)
  5. 优化数据模型和访问模式

Q6: 网络故障对 MongoDB 复制集有什么影响?

A6: 网络故障会导致复制集成员无法通信,可能引发以下问题:

  1. 主节点无法收到从节点的确认,写入操作延迟增加
  2. 从节点无法复制 oplog,导致复制延迟
  3. 触发不必要的选举,导致主节点频繁切换
  4. 严重情况下,复制集分裂,出现脑裂

Q7: 如何区分硬件故障和软件故障?

A7: 区分硬件故障和软件故障的方法:

  1. 硬件故障通常伴随硬件指示灯异常、系统日志中的硬件错误
  2. 软件故障通常在 MongoDB 日志中可以找到具体的错误信息
  3. 硬件故障可能导致整个服务器无法启动,而软件故障可能只影响 MongoDB 服务
  4. 可以通过替换硬件或重新安装软件来验证故障类型

Q8: 人为故障的主要类型有哪些?

A8: 人为故障的主要类型包括:

  1. 误删除数据或数据库
  2. 误修改配置文件或参数
  3. 误执行高危命令(如 db.dropDatabase())
  4. 权限配置错误导致未授权访问
  5. 密码泄露或弱密码导致安全问题

Q9: 如何建立 MongoDB 故障响应机制?

A9: 建立故障响应机制的步骤:

  1. 制定详细的故障分类和处理流程
  2. 建立 24/7 监控和告警系统
  3. 组建专业的故障响应团队
  4. 定期进行故障演练和培训
  5. 建立故障报告和复盘机制
  6. 持续优化故障处理流程

Q10: 如何预防 MongoDB 故障?

A10: 预防 MongoDB 故障的措施:

  1. 选择可靠的硬件和存储设备
  2. 实施高可用架构(复制集、分片集群)
  3. 定期备份数据,测试恢复流程
  4. 配置监控和告警系统
  5. 实施严格的权限管理
  6. 定期进行性能优化和健康检查
  7. 保持 MongoDB 版本更新,修复已知 bug
  8. 建立完善的运维流程和文档