牛骨文教育服务平台(让学习变的简单)
博文笔记

MongoDB经验教训:一次批量删除历史数据引发的悲剧

创建时间:2013-06-29 投稿人: 浏览次数:6642

以下是引用同事分享经验

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)恢复服务过程中,导致慢查询的非核心服务,可以升级下线;


希望本次血的教训 对其他人起到启示作用,今后避免出现类似问题。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。