上线前跑缓存预热,五分钟后主库 CPU 到 98%,业务查询开始超时,脚本还在按主键全表扫,200 个并发没有停。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

for ids in chunks(all_ids, 500):
    warm(ids)
    time.sleep(0.5)

预热脚本为了快开了 200 个并发,所有查询都走主库,扫的还是千万行大表。没有限速也没有分批,和业务抢同一个连接池。这一点先确认清楚,后面就不用反复试。

「预热脚本打挂数据库」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,预热并发降到 20 并加分批休眠;读请求走从库 避免影响主库写入;先预热访问量前一万的 key 不要全量扫。

改完照着核一遍,同样预热,主库 CPU 峰值 35%,业务 P99 没有变化,前一万个热点 key 十分钟内全部就绪。

作者 9823189