问题:测试环境13.113数据库服务器mysql服务不可用
1、df -h
检查服务器磁盘占用情况,发现磁盘占满,预计是导致mysql服务不可用的原因,通过清理没用的日志文件,重新启动mysql,发现服务可以正常启动。
此时发现,空间占用还在以每小时2G的速度增加,显然是因为有某个进程在写入磁盘。下面进行空间优化及问题排查。
2、du -h --max-depth=10 /* | awk '{ if($1 ~ /M/){split($1, arr, "M")}; if(($1 ~ /G/) || ($1 ~ /M/ && arr[1]>200)) {printf "%-10s %s\n", $1, $2} }' | sort -n -r
发现,磁盘占用较大的是如下几个类型的文件,逐个清理、
3、排查过程
1)、Xxl-job下的文件
xxl-job产生的日志文件,该日志文件没什么用处,优先将其删除,保证mysql服务可以正常启动。
2)、tomcat日志文件
路径:/opt/tomcat/logs/
该文件夹下面除了业务日志外,还包含了一个catalina.out文件,该文件包含tomcat运行自己输出的日志以及应用里向console输出的日志。本示例中,该文件占用空间19G,其他业务日志总共占用1G空间,清空catalina.out,不影响tomcat运行的命令如下:
3)、maildrop下的文件
该文件夹下的文件,是在执行cron时,会将cron执行脚本中产生的信息以邮件的形式发送cron的所有者,但是由于sendmail或postfix邮件发送未正常运行,导致邮件发送不成功,堆积在了maildrop目录下面。首先将这些文件删除:
cd /var/spool/postfix/maildrop
ls | xargs rm -rf
网上提供了2种根本上解决该问题的方案:
A、修改crontab的配置文件
将其中的MAILTO=ROOT,修改为MAILTO=””
B、修改crontab
Vim查看其中一个生成的文件,可在其中找到是哪个crontab任务导致这个文件的生成,
在crontab -e该命令后,加上一行
>/dev/null 2>&1
例如:
将产生的输出到/dev/null,经过测试发现没有再出现新的文件。
如果输出内容有需要保存的话,可以输出到指定文件。
4)mysqldump下的文件
该文件夹下的文件,主要是数据库备份文件,可以考虑将其中不需要的进行删除。
5)mysql/var下的文件
该文件夹下的文件,主要是mysql的binlog日志文件,经过观察发现,该文件夹的最新binlog文件增长速度很快,接近最初排查时候发现磁盘的增长速度,所以,磁盘增长速度过快的直接原因,是mysql的binlog日志增长较快导致!
4、进行处理
1)将没有用的binlog日志删除;
2)在mysql中运行如下sql,查找哪个IP的连接导致了大量的binlog。
B、select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
3)跟进该web服务器的tomcat日志,发现其中某个接口调用频繁,是其中一个业务端在调用,另外获悉,对方的测试人员错误的将该接口配置在一个定时任务中,每分钟调用一次。对于业务端来说,每分钟调用一次不会有任何性能问题,但是每次的调用,本服务将对所有的相关数据进行一次update,由于mysql的binlog模式是row模式的,该模式下,会将该表所有字段都附加在binlog中记录,导致binlog日志异常增长,服务器磁盘打满,最终导致mysql服务不可用。
4)停掉业务端(10.100.19.110)的错误调用,binlog日志不再增长,磁盘空间稳定,问题解决。
思考:在我们的web端应该对这样的异常请求进行拦截,不允许超过限制次数调用。