前因:
mongo出了点小问题,但是日志级别不够所以没记录到问题。然后我在配置文件中设置了日志级别
#日志级别设置,verbose表示debug v表示级别共五级,v越多日志越详细。
#verbose=true
#vvv=true
后果:
没过多久我就收到数据库重启的报警邮件。检查之后发现磁盘已经爆满,mongo的日志文件把磁盘占满了。
原来因为日志级别的提高,打印的日志非常详细。日志文件以每分钟5M的速度增加,导致磁盘不够用。
解决:我要设置一个定时轮转日志的脚本,当日志增加到一定大小时轮转日志。然后把轮转的日志保存到aws的S3
开始我的想法是 cp 一份原日志文件,命名为log1,并上传log1到s3,完成后echo清空原日志文件删除log1,减小日志的空间占用。
问题:在上传的时候我发现一个有趣的问题,原日志在被echo清空后du查看大小只有1 M多一点,cp这个只有1M的原日志为log2,上传到s3,发现log2的大小为log1+log2,日志呈现的是是增量增长。
原因:mongodb的日志文件正在运行,不断地被写入。这时候echo可以清空日志的内容,但是不会释放block。所以日志大小一直呈现增量增长。
修改:检查原日志大小,超过制定大小则发送信号 kill -SIGUSR1 $pid,这时log目录中就会多一个以时间命名的日志文件,这个文件就是轮转下来的文件。它是静态的,上传这个文件,上传完成后删除。
下面是脚本:
#! /bin/bash
#
pid=`ps -ef | grep mongod| grep -v grep | awk '{print$2}'`
path=/data/mongodb/log/
path1=/data/mongodb/log/mongodb.log
num=`du $path1|awk '{print $1}'`
if [ $num -gt 100 ];
then
kill -SIGUSR1 $pid
#cp $path1 $path/`date +%Y-%m-%dT%H:%M`
#echo > $path1
aws s3 cp $path/mongodb.log.2018* s3://myS3/mongo.`date +%Y-%m-%dT%H:%M:%SZ`.log
rm -rf $path/mongodb.log.2018*
#echo `date +%Y-%m-%dT%H:%M:%SZ`'上传完成' >>/data/uplogtoS3.log
疑虑: 这时我在网上查询到的一个命令 kill -SIGUSR1 $pid ,虽然它确实可以轮转日志,但我并不清除这个命令可能造成的坏的结果。
如果这个命令有隐患,请在下面 mark 一下