HyperAIHyperAI

Command Palette

Search for a command to run...

SaaS公司如何在48小时内将MongoDB费用降低79%并大幅提升性能

一家Saas公司在2021年经历了意外的MongoDB费用激增,从每月15284美元飙升至3210美元,减少了79%。这一事件发生在深夜,当时他们的MongoDB Atlas实例突然从M20自动升级到了M60,导致云成本增加了20%。财务团队在几小时内发现,这种增加的成本几乎消耗了公司的九个月现金流。于是,工程师开始了一项紧急优化任务,目标是在48小时内减少70%的成本,同时不中断服务并保持数据完整。 在凌晨2点17分,工程师接到通知后立即检查了数据库性能分析器,发现了三个主要问题:N+1查询海啸、未加限制的查询窗口和巨型文档造成的成本陷阱。 首先,N+1查询问题源于每次查询订单时,API还会再次查询其对应的订单行项目。对于1000个订单,这导致了1001次网络交互和索引访问。通过使用MongoDB的aggregate方法结合$lookup阶段,工程师将所有的查询操作合并为一次,极大地减少了数据库访问次数。 其次,API中的某些查询没有设置时间和字段过滤,导致返回大量不必要的数据。通过设置时间窗口及仅选择需要的字段,工程师成功地减少了内存使用,提升了API的速度四倍。 最后,存储大量发票的集合中包含了完整的PDF文件和长达1200行的历史记录,每个文档的大小超过了数MB,这严重拖累了缓存的效率。工程师将经常访问的元数据保存在MongoDB中,而将不常用的大文件存储在S3或GridFS中,从而使SSD的开销大幅下降,缓存命中率上升了22个百分点。 除了这些主要改进之外,工程师还识别并解决了其他几个常见的优化问题,包括低选择性的索引键位置错误、使用$regex进行非索引字段搜索、将findOneAndUpdate作为消息队列使用以及分页查询的偏移量陷阱。通过对这些问题进行调整,进一步降低了成本,提高了性能。 在优化过程中,该公司使用了Prometheus和Grafana实时监控数据库性能,确保所有改变都朝着预期的方向发展。经过48小时的努力,最终实现了显著的效果:每月花费从1643美元降至559美元,减少了66%,同时p95延迟也从1.9秒降到了140毫秒。 在优化完成后,公司的COO评价道:“这次经历让我们意识到,及时优化数据结构和查询效率的重要性远超单纯的硬件升级。它不仅节省了大量成本,还提升了系统的整体性能。” Hayk Ghukasyan是Hexact的工程总监,拥有超过20年的大型系统架构、实时数据库和优化工程技术经验。他领导了这次紧急优化任务,并分享了他的经验和见解。他认为,数据库性能优化的核心在于优化数据结构(即shape-first)而非仅依赖于索引或硬件升级。这种方法不仅适用于 MongoDB,也能广泛应用于其他数据库系统。在日常开发中养成良好的数据设计习惯,可以长远地避免类似的费用问题和技术债务积累。

相关链接