summary
2013 年,Foursquare 的 MongoDB 因内存耗尽(OOM)崩溃,查询模式局部性差,导致服务跨两日累计约 17 小时不可用。
timeline
负载与查询模式使工作集超出内存;MongoDB 进程 OOM 被杀,重启后再次被打满;团队通过扩容内存、优化查询与增加缓存逐步恢复。
root_cause
数据工作集大于可用内存,且查询访问局部性差,迫使大量磁盘随机 IO,MongoDB 在内存压力下被 OOM killer 终止。
amplifiers
缺乏容量余量与查询缓存层,故障期间重试风暴进一步压垮数据库;恢复依赖手动调优。
mitigation
扩容内存、引入缓存、优化热点查询、增加副本;建立容量预警。
lessons
有状态存储需预留内存余量并监控工作集;为突发查询加缓存与限流。
checklist
内存与工作集监控;OOM 预警;查询缓存;容量水位告警。