场景
大促数据大屏,需要查询48小时之内的一分钟粒度数据(单次8万)用于计算环比数据,由于前端访问量飙升导致mysql的读压力飙升,进而影响了集群中的其他数据库实例。
分析
db同学给出的sql语句如下:
select 'true' as QUERYID,id, name, business_type, start_time, end_time, bandwidth, qps, third_bandwidth, third_qps, play_count, push_count, created, modified, collected from cdn_band_onemin_2022_h2 WHERE start_time >= '2022-11-10 00:00'and start_time < '2022-11-12 00:00'
经过分析发现是该sql引起,db只能先kill掉该查询确保该问题扩散,对应业务发现是大促看板环比图导致,双11需要从数据库实时获取2022-11-10 至2022-11-12 共计48小时跨度的1分钟粒度数据用于计算,当页面请求量飙升时,造成mysql读压力大。
解决
1.将该实时查询并计算的数据结果缓存到redis中,这部分数据页面看板实时从redis获取,并且在后台启一个定时任务,每20s去查询db计算并更新redis中的数据,这样将数据库的读压力分散给了redis。
- 数据库实例和部门其他实例共用资源池,导致问题扩散,后续采用独立部署的方式,并将现有数据迁移到新的数据库实例
- 增加数据库实例的物理规格