以下是引用同事分享经验
MongoDB经验教训:一次批量删除历史数据引发的悲剧
缘起:mongodb数据量过大,准备删除mongodb无用历史数据
=> 我们分了32张表,实施过程中逐表删除
经过:
4:00左右: 开始跑脚本删除数据,偶有报警,不影响服务;
9:00左右: 流量上行,数据库请求排队,MongoDB逐步扛不住了;
DBA尝试重启MongoDB数据库,结束已经在排队的请求,未果;
9:40左右: 业务流量激增,雪崩,MongoDB扛不住;
业务限流,让MongoDB预热,只为50%用户提供服 务;
DBA反馈有慢查询,MongoDB继续预热;
业务层升级,将导致慢查询的非核心业务下线;
升级业务模块,MongoDB预热完成 + DBA数据压缩完成,全流量放开,恢复服务;
核心提示:
(1)删除操作, MongoDB是异步处理的,在处理的过程中会分片Yield出全局锁 => 批量删除需要谨慎;
(2)我们对数据库进行了分表,逐表清理数据,还是导致内存热数据大量换出,磁盘IO激增 => 务必控制删除粒度;
其他启示:
(3)数据库恢复服务需要一定预热期,期间可逐步放开流量,否则可能导致持续雪崩;
(4)DBA期间进行了数据压缩操作,数据压缩可以大大减小索引大小,降低内存使用量;
(5)恢复服务过程中,导致慢查询的非核心服务,可以升级下线;
希望本次血的教训 对其他人起到启示作用,今后避免出现类似问题。