慢 SQL的排查与防范
1,观察MySQL 的 CPU 利用率图,从监控图上看,故障时段 MySQL 的 CPU 利用率是否很高。这种情况下,MySQL 基本上处于一个不可用的状态,执行所有的 SQL 都会超时。
2,MySQL 这种 CPU 利用率高的现象,绝大多数情况都是由慢 SQL 导致的,所以优先排查慢 SQL。MySQL 和各大云厂商提供的 RDS 都能提供慢 SQL 日志,分析慢 SQL 日志,是查找类似问题原因最有效的方法。一般来说,慢 SQL 的日志中,会有这样一些信息:SQL、执行次数、执行时长。
3,当数据库非常忙的时候,它执行任何一个 SQL 都很慢。所以,并不是说,慢 SQL 日志中记录的这些慢 SQL 都是有问题的 SQL。大部分情况下,导致问题的 SQL 只是其中的一条或者几条。不能简单地依据执行次数和执行时长进行判断,但是,单次执行时间特别长的 SQL,仍然是应该重点排查的对象。
4,查询高频的数据一般会做缓存,如果由于缓存刷新慢,也会很多请求无法命中缓存,请求直接穿透缓存打到了数据库上面,给服务器造成压力。
5,建议:上线一个定时监控和杀掉慢 SQL 的脚本。这个脚本每分钟执行一次,检测上一分钟内,有没有执行时间超过一分钟(这个阈值可以根据实际情况调整)的慢 SQL,如果发现,直接杀掉这个会话。这样可以有效地避免一个慢 SQL 拖垮整个数据库的悲剧。
6,建议:做一个简单的静态页面的首页作为降级方案,只要包含商品搜索栏、大的品类和其他顶级功能模块入口的链接就可以了。在 Nginx 上做一个策略,如果请求首页数据超时的时候,直接返回这个静态的首页作为替代。这样后续即使首页再出现任何的故障,也可以暂时降级,用静态首页替代。至少不会影响到用户使用其他功能。
网友评论