外观
MongoDB 故障分类
硬件故障
服务器硬件故障
CPU 故障
- 症状:服务器无响应、频繁重启、系统日志中出现 CPU 错误
- 影响:MongoDB 服务中断、数据写入失败
- 处理方法:bash
# 检查 CPU 状态 top # 查看系统日志 dmesg | grep -i cpu
内存故障
- 症状:服务器频繁重启、内存报错、MongoDB OOM 崩溃
- 影响:数据丢失风险、服务中断
- 处理方法:bash
# 运行内存检测 memtest86+ # 查看内存使用情况 free -h
硬盘故障
- 症状:I/O 错误、文件系统损坏、硬盘指示灯异常
- 影响:数据损坏、服务无法启动
- 处理方法:bash
# 检查硬盘状态 smartctl -a /dev/sda # 检查文件系统 fsck -y /dev/sda1
电源故障
- 症状:服务器突然关机、UPS 报警
- 影响:数据未刷新到磁盘、服务中断
- 处理方法:bash
# 检查系统启动日志 journalctl -b # 验证数据完整性 mongod --repair
存储设备故障
RAID 故障
- 症状:RAID 控制器报警、磁盘掉线、阵列降级
- 影响:性能下降、数据冗余丢失
- 处理方法:bash
# 查看 RAID 状态(不同厂商命令不同) megacli -LDInfo -Lall -aAll # 重建 RAID megacli -PDRbld -Start -PhysDrv [1:0] -a0
SAN/NAS 故障
- 症状:存储设备无法访问、I/O 延迟高、连接中断
- 影响:MongoDB 服务中断、数据访问失败
- 处理方法:bash
# 检查存储连接 ping san-storage # 检查挂载状态 df -h
软件故障
MongoDB 进程故障
MongoDB 崩溃
- 症状:mongod 进程消失、日志中出现致命错误
- 影响:服务中断、连接失败
- 处理方法:bash
# 查看 MongoDB 日志 tail -n 100 /var/log/mongodb/mongod.log # 重启 MongoDB 服务 systemctl restart mongod
MongoDB 无响应
- 症状:客户端连接超时、命令执行缓慢或无响应
- 影响:应用程序无法访问数据库
- 处理方法:bash
# 检查 MongoDB 进程状态 ps aux | grep mongod # 检查连接数 netstat -tuln | grep 27017
数据库级故障
集合损坏
- 症状:查询失败、错误代码 136(数据文件损坏)
- 影响:部分数据无法访问
- 处理方法:javascript
// 检查集合状态 db.collection.validate() // 修复集合 db.collection.validate({ full: true })
索引损坏
- 症状:查询报错、索引无法使用、性能下降
- 影响:查询性能严重下降
- 处理方法:javascript
// 重建索引 db.collection.reIndex() // 或删除后重新创建 db.collection.dropIndex("index_name") db.collection.createIndex({ field: 1 })
oplog 损坏
- 症状:复制延迟增加、从节点无法同步
- 影响:复制集数据不一致
- 处理方法:javascript
// 重新初始化从节点 rs.reSync() // 或手动同步 // 1. 停止从节点 // 2. 复制主节点数据文件 // 3. 启动从节点
操作系统故障
操作系统崩溃
- 症状:服务器蓝屏、系统无法启动
- 影响:MongoDB 服务完全中断
- 处理方法:bash
# 启动到救援模式 # 检查文件系统 fsck -y /dev/sda1 # 重启系统 reboot
系统资源耗尽
- 症状:CPU 使用率 100%、内存不足、磁盘空间满
- 影响:MongoDB 性能下降、服务崩溃
- 处理方法:bash
# 检查 CPU 和内存使用 top # 检查磁盘空间 df -h # 清理日志或临时文件 rm -rf /var/log/mongodb/*.log.old
网络故障
局域网故障
交换机故障
- 症状:网络连接中断、交换机指示灯异常
- 影响:复制集成员无法通信、选举失败
- 处理方法:bash
# 检查网络连接 ping -c 4 mongodb-primary # 检查交换机状态 # 通过交换机管理界面查看
网络线缆故障
- 症状:网络连接时断时续、网卡指示灯不亮
- 影响:复制延迟、连接不稳定
- 处理方法:bash
# 检查网卡状态 ethtool eth0 # 检查网络连接 mii-tool eth0
广域网故障
跨区域网络中断
- 症状:跨区域复制集成员无法通信、延迟极高
- 影响:跨区域数据不一致、故障转移失败
- 处理方法:bash
# 检查网络延迟 ping -c 4 us-east-1-mongodb # 检查路由 traceroute us-east-1-mongodb
防火墙配置错误
- 症状:连接被拒绝、端口无法访问
- 影响:客户端无法连接、复制集成员无法通信
- 处理方法:bash
# 检查防火墙规则 iptables -L -n # 测试端口可达性 telnet mongodb-primary 27017
DNS 故障
DNS 解析失败
- 症状:无法通过主机名连接、DNS 超时
- 影响:客户端连接失败、复制集配置错误
- 处理方法:bash
# 测试 DNS 解析 nslookup mongodb-primary # 使用 IP 直接连接测试 mongo --host 192.168.1.100
DNS 缓存过期
- 症状:连接到错误的 IP 地址、服务不可用
- 影响:客户端连接到错误的服务器
- 处理方法:bash
# 刷新 DNS 缓存 systemctl restart systemd-resolved # 或手动刷新 resolvectl flush-caches
复制集故障
选举相关故障
选举失败
- 症状:复制集没有主节点、状态显示 RECOVERING
- 影响:无法写入数据、服务降级
- 处理方法:javascript
// 查看复制集状态 rs.status() // 检查节点优先级配置 rs.conf()
频繁选举
- 症状:主节点频繁切换、日志中选举信息频繁
- 影响:写入性能下降、连接断开
- 处理方法:javascript
// 查看选举日志 db.adminCommand({ getLog: "rs" }) // 调整选举超时 rs.reconfig({ electionTimeoutMillis: 20000 })
复制延迟故障
- 复制延迟过高
- 症状:从节点 oplog 落后主节点过多、rs.printSlaveReplicationInfo() 显示延迟大
- 影响:数据不一致、故障转移风险
- 处理方法:javascript
// 查看复制延迟 rs.printSlaveReplicationInfo() // 检查 oplog 大小 use local
db.oplog.rs.stats().maxSize ```
- 从节点无法同步
- 症状:从节点状态显示 RECOVERING、复制错误
- 影响:数据冗余丢失、高可用性降低
- 处理方法:javascript
// 重新同步从节点 rs.reSync() // 或手动同步 db.adminCommand({ resync: 1 })
分片集群故障
分片键设计问题
分片键 cardinality 低
- 症状:数据分布不均、单个分片负载过高
- 影响:性能瓶颈、集群扩展性差
- 处理方法:javascript
// 查看分片分布 sh.status() // 检查集合分片状态 db.collection.getShardDistribution()
热点分片
- 症状:单个分片 CPU/IO 使用率过高、其他分片空闲
- 影响:性能下降、资源浪费
- 处理方法:javascript
// 查看分片服务器状态 db.serverStatus() // 考虑重新设计分片键
配置服务器故障
配置服务器不可用
- 症状:分片集群无法执行元数据操作、配置无法更新
- 影响:无法添加分片、无法创建分片集合
- 处理方法:javascript
// 检查配置服务器状态 sh.status() // 检查配置服务器连接 mongo --host configserver1
配置数据不一致
- 症状:分片集群行为异常、元数据冲突
- 影响:数据丢失风险、集群管理困难
- 处理方法:bash
# 修复配置服务器 mongod --repair --configsvr # 重新初始化配置服务器
mongos 路由器故障
mongos 进程崩溃
- 症状:应用程序连接失败、mongos 进程消失
- 影响:无法访问分片集群
- 处理方法:bash
# 重启 mongos 服务 systemctl restart mongos # 查看 mongos 日志 tail -n 100 /var/log/mongodb/mongos.log
mongos 连接池耗尽
- 症状:客户端连接超时、mongos 日志中连接错误
- 影响:应用程序无法连接、请求失败
- 处理方法:javascript
// 查看 mongos 连接数 db.serverStatus().connections // 调整 mongos 连接池大小 mongos --maxConns 20000
人为故障
操作失误
误删除数据
- 症状:集合或数据库消失、数据查询不到
- 影响:数据丢失、业务中断
- 处理方法:javascript
// 从备份恢复 mongorestore --db test /backup/test // 从 oplog 恢复特定时间点 mongorestore --oplogReplay --oplogLimit "123456:789" /backup
误修改配置
- 症状:MongoDB 服务无法启动、配置错误
- 影响:服务中断、性能异常
- 处理方法:bash
# 恢复配置文件备份 cp /etc/mongod.conf.bak /etc/mongod.conf # 重启服务 systemctl restart mongod
误执行高危命令
- 症状:数据库锁定、性能骤降
- 影响:服务不可用、响应缓慢
- 处理方法:javascript
// 终止长时间运行的命令 db.currentOp().inprog.forEach(op => { if (op.secs_running > 60) { db.killOp(op.opid); } });
权限管理失误
权限配置错误
- 症状:用户无法访问数据库、权限不足错误
- 影响:业务无法访问数据、运维操作受限
- 处理方法:javascript
// 检查用户权限 db.getUser("username") // 修复用户权限 db.grantRolesToUser("username", [{ role: "readWrite", db: "test" }])
密码泄露
- 症状:未授权访问、异常登录记录
- 影响:数据泄露、安全风险
- 处理方法:javascript
// 修改用户密码 db.changeUserPassword("username", "newpassword") // 检查登录日志 db.adminCommand({ getLog: "security" })
安全故障
认证授权故障
认证失败
- 症状:客户端连接认证失败、日志中认证错误
- 影响:无法访问数据库、业务中断
- 处理方法:javascript
// 检查用户状态 db.getUser("username") // 验证认证配置 db.adminCommand({ getCmdLineOpts: 1 })
授权失败
- 症状:操作权限不足、错误代码 13
- 影响:无法执行特定操作、业务功能受限
- 处理方法:javascript
// 检查用户角色 db.getUser("username", { showPrivileges: true }) // 授予必要权限 db.grantRolesToUser("username", [{ role: "dbAdmin", db: "test" }])
数据泄露
未授权访问
- 症状:异常登录、数据被导出
- 影响:数据泄露、安全合规问题
- 处理方法:javascript
// 检查连接日志 db.adminCommand({ getLog: "connection" }) // 启用审计日志 db.adminCommand({ setParameter: 1, auditAuthorizationSuccess: true })
数据加密问题
- 症状:加密密钥丢失、数据无法解密
- 影响:数据永久丢失、业务中断
- 处理方法:bash
# 恢复加密密钥备份 cp /backup/keyfile /etc/mongodb/keyfile # 验证密钥完整性 openssl dgst -sha256 /etc/mongodb/keyfile
性能故障
查询性能故障
慢查询过多
- 症状:查询执行时间长、日志中慢查询记录多
- 影响:CPU 使用率高、响应缓慢
- 处理方法:javascript
// 查看慢查询日志 db.adminCommand({ getLog: "slowop" }) // 分析查询执行计划 db.collection.find({}).explain()
索引缺失
- 症状:全表扫描、查询性能差
- 影响:CPU 和 I/O 使用率高、响应缓慢
- 处理方法:javascript
// 查看查询执行计划 db.collection.find({ field: "value" }).explain() // 创建缺失的索引 db.collection.createIndex({ field: 1 })
写入性能故障
写入延迟高
- 症状:写入操作响应时间长、主从延迟增加
- 影响:应用程序响应缓慢、数据不一致
- 处理方法:javascript
// 查看写入锁状态 db.serverStatus().globalLock // 检查磁盘 I/O iostat -x 1
并发写入冲突
- 症状:写入冲突错误、乐观锁失败
- 影响:写入失败、重试成本高
- 处理方法:javascript
// 查看写入冲突日志 db.adminCommand({ getLog: "write" }) // 优化写入模式 db.collection.updateOne({ _id: 1, version: 1 }, { $set: { field: "value" }, $inc: { version: 1 } })
常见问题(FAQ)
Q1: 如何快速定位 MongoDB 故障类型?
A1: 快速定位故障类型的步骤:
- 检查 MongoDB 日志:
tail -n 100 /var/log/mongodb/mongod.log - 检查进程状态:
ps aux | grep mongod - 检查硬件状态:
smartctl -a /dev/sda,free -h - 检查网络连接:
ping mongodb-primary,telnet mongodb-primary 27017 - 检查数据库状态:
mongo --eval "db.serverStatus()"
Q2: 硬件故障和软件故障的主要区别是什么?
A2: 硬件故障是指物理设备损坏,如服务器、硬盘、内存等;软件故障是指软件层面的问题,如 MongoDB 进程崩溃、配置错误、代码 bug 等。硬件故障通常需要更换硬件,而软件故障可以通过重启服务、修复配置或代码来解决。
Q3: 如何预防人为故障?
A3: 预防人为故障的措施:
- 建立严格的操作流程和审批机制
- 实施权限最小化原则,限制高危操作权限
- 定期备份数据,确保备份可用
- 使用自动化工具执行重复性操作,减少人工干预
- 定期进行运维培训,提高操作技能
- 实施变更管理,记录所有操作
Q4: 复制集故障和分片集群故障的处理有什么不同?
A4: 复制集故障主要涉及主从切换、复制延迟和选举问题,处理相对简单;分片集群故障涉及分片分布、配置服务器和 mongos 路由器,处理更为复杂,需要考虑整个集群的一致性和可用性。
Q5: 如何处理 MongoDB 性能故障?
A5: 处理 MongoDB 性能故障的步骤:
- 分析慢查询日志,优化查询和索引
- 检查系统资源使用情况(CPU、内存、磁盘 I/O)
- 调整 MongoDB 配置参数
- 考虑垂直扩展(增加硬件资源)或水平扩展(分片)
- 优化数据模型和访问模式
Q6: 网络故障对 MongoDB 复制集有什么影响?
A6: 网络故障会导致复制集成员无法通信,可能引发以下问题:
- 主节点无法收到从节点的确认,写入操作延迟增加
- 从节点无法复制 oplog,导致复制延迟
- 触发不必要的选举,导致主节点频繁切换
- 严重情况下,复制集分裂,出现脑裂
Q7: 如何区分硬件故障和软件故障?
A7: 区分硬件故障和软件故障的方法:
- 硬件故障通常伴随硬件指示灯异常、系统日志中的硬件错误
- 软件故障通常在 MongoDB 日志中可以找到具体的错误信息
- 硬件故障可能导致整个服务器无法启动,而软件故障可能只影响 MongoDB 服务
- 可以通过替换硬件或重新安装软件来验证故障类型
Q8: 人为故障的主要类型有哪些?
A8: 人为故障的主要类型包括:
- 误删除数据或数据库
- 误修改配置文件或参数
- 误执行高危命令(如 db.dropDatabase())
- 权限配置错误导致未授权访问
- 密码泄露或弱密码导致安全问题
Q9: 如何建立 MongoDB 故障响应机制?
A9: 建立故障响应机制的步骤:
- 制定详细的故障分类和处理流程
- 建立 24/7 监控和告警系统
- 组建专业的故障响应团队
- 定期进行故障演练和培训
- 建立故障报告和复盘机制
- 持续优化故障处理流程
Q10: 如何预防 MongoDB 故障?
A10: 预防 MongoDB 故障的措施:
- 选择可靠的硬件和存储设备
- 实施高可用架构(复制集、分片集群)
- 定期备份数据,测试恢复流程
- 配置监控和告警系统
- 实施严格的权限管理
- 定期进行性能优化和健康检查
- 保持 MongoDB 版本更新,修复已知 bug
- 建立完善的运维流程和文档
