记录一次MySQL数据库CPU负载异常高的问题
1、起因
某日下午18:40开始,接收到滕讯云短信报警,显示数据库CPU使用率已超过100%,同时慢查询日志的条数有1500条左右。
正常情况下:CPU使用率为30%-40%之间,慢查询日志条数为0.
2、查询原因
因接收短信时,正好在回家的路上,无法处理,所以只能到家再处理。
在路上的时候,接收了几次恢复短信和再次异常短信。说明问题是一时有,一时恢复。
到家后,登录腾讯云数据库控制台,查询监控,发现CPU使用率确实为145%,且持续时间是20分钟。
18:40-19:00
19:20-19:40
然后,我登录腾讯云的phpMyAdmin控制台,想尝试看下有哪些查询正在发生。于是执行了show processlist命令,不巧的是,我执行命令的时候,高峰期已过,看不到任何查询。
于是,我下载了18:00-19:00之间的慢查询日志文件,想从中找到问题。下载之后,发现第一条慢查询开始的时间正是18:41分钟。且查看整个文件,发现都是同一条SQL语句,查询的是同一张表,且uid始终是同一个。
由于我对于业务不是很熟悉,于是我将这些SQL语句截图发给了开发人员。开发人员在看到SQL语句后,找到了相应的代码位置,并告诉了我,引发该SQL查询的原因是请求了某个地址,/account/...。
然后我下载了负载均衡的访问日志,只下载了18:00-19:00时间段的。我根据开发人员提供的URI,查询日志,发现真有记录。
然后,我尝试过滤该日志,以确定访问地址。我首先过滤整个日志,以统计/account/...出现的数量。发现数量为7900条。为了得知这7900条是否为18:00-19:00出现的,于是我单独过滤了日志中带"18:4"字符串的数量以及"19:5"字符串的数量。发现两者加起来的数量为7600条。说明这7900条请求确实是从18:40-19:00这个时间段开始发起的。
且很明显的是,所有请求来自同一个IP地址。原因很明显了,就是某个白痴在发起异常请求。
3、处理办法
首先在负载均衡的防火墙上限制了该IP的访问。然后开发人员也加上了CSRF。