
事故概述最近我们团队经历了一起严重的 MongoDB 生产事故系统响应急剧下降部分服务不可用最终导致线上业务受损。事故发生后我们迅速组织团队进行问题排查和系统恢复并针对问题进行了深入复盘。本文将详细介绍事故的起因、发展、排查过程和解决方案希望能为使用 MongoDB 分片集群的团队提供借鉴。事故主要表现为部分分片节点响应缓慢查询超时增加最终导致分片雪崩系统整体不可用。经排查问题由索引错误引起导致 Oplog 堆积进而触发分片雪崩。问题根源分析2.1 分片雪崩机制MongoDB 分片集群由配置服务器、分片节点和路由(mongos)组成。正常情况下查询请求由 mongos 路由到相应分片处理。但在特定条件下单个分片问题可能引发连锁反应导致整个集群雪崩。在我们的场景中一个分片节点因索引错误导致查询性能急剧下降大量请求超时。这些超时请求不断重试消耗更多系统资源进一步加剧问题最终形成恶性循环。// 错误的索引创建方式导致索引效率低下 db.collection.createIndex({field: 1}, {background: false}); // 阻塞式创建索引影响生产正确的索引创建方式应该是// 推荐的索引创建方式不影响生产 db.collection.createIndex({field: 1}, {background: true}); // 后台创建索引2.2 Oplog 堆积影响MongoDB 使用 Oplog (操作日志) 来记录所有数据修改操作用于复制和故障恢复。正常情况下Oplog 应该能够及时处理并复制到从节点。在我们的案例中由于分片节点性能问题Oplog 写入速度远慢于生成速度导致 Oplog 堆积。堆积的 Oplog 不仅占用大量存储空间还会影响从节点的同步效率和主节点的写入性能。我们可以通过以下命令检查 Oplog 状态// 检查 Oplog 状态 db.oplog.rs.find().sort({$natural: -1}).limit(1);2.3 索引错误连锁反应索引是 MongoDB 查询性能的关键。不当的索引设计和使用会严重影响查询性能形成连锁反应。在我们的案例中一个低效的复合索引设计导致特定查询模式性能极差进而引发一系列问题。以下是问题索引的特征// 问题索引示例 db.collection.createIndex({ field1: 1, field2: 1, field3: 1 }, { name: problematic_index, partialFilterExpression: {status: active} });这个索引在设计时没有充分考虑实际查询模式导致索引选择性差查询效率低。解决方案3.1 快速恢复服务为快速恢复服务我们采取了以下措施识别问题分片节点将其从集群中临时下线重启分片节点清除可能的内存问题调整资源分配增加分片节点 CPU 和内存暂停非关键查询优先保证核心业务3.2 索引优化针对索引问题我们进行了以下优化分析实际查询模式重新设计索引结构删除低效索引减少索引维护开销添加合适的复合索引覆盖常见查询模式示例优化后的索引// 优化后的索引设计 db.collection.createIndex({ status: 1, field1: 1, field2: 1 }, { name: optimized_index, partialFilterExpression: {status: active} });3.3 Oplog 管理与监控为防止 Oplog 堆积问题我们实施了以下措施增加分片节点 Oplog 大小设置合理的 Oplog 监控告警及时发现堆积趋势定期分析 Oplog 使用情况提前发现潜在问题防范措施4.1 分片集群监控建立完善的分片集群监控机制包括节点资源使用率监控查询性能监控Oplog 使用情况监控网络延迟监控4.2 索引管理规范制定索引管理规范新索引创建必须使用后台模式重要索引变更前必须进行测试验证定期分析索引使用情况删除冗余索引使用 explain() 分析查询执行计划实战示例与注意事项5.1 最小示例以下是一个简单的分片集群问题排查示例// 连接到 MongoDB 分片集群 use admin; // 检查分片状态 sh.status(); // 检查 Oplog 大小和使用情况 db.oplog.rs.stats(); // 查看慢查询 db.setProfilingLevel(1); db.system.profile.find().sort({millis: -1}).limit(10);5.2 注意事项索引创建应避免业务高峰期使用后台模式重要索引变更前应在测试环境充分验证定期检查和优化索引避免无效索引建立完善的监控和告警机制制定合理的容量规划避免资源瓶颈定期进行应急演练确保团队熟练掌握故障处理流程发现问题检查分片状态识别问题分片临时下线问题分片重启分片节点分析查询性能检查索引使用情况优化低效索引监控Oplog状态调整资源分配重新上线分片验证系统恢复指标事故前事故中解决后改善幅度查询平均响应时间(ms)12035009520.8% ↓分片CPU使用率(%)45984059.2% ↓Oplog堆积量(GB)10120820% ↓查询超时率(%)0.5350.294.3% ↓系统可用性(%)99.997599.9933.3% ↑