mongod每天要产生大量的日志,如果不去管它,我这边一周大约有10~20G的日志出来,可见日志轮询是必须的。

mongodb本身支持日志轮询的信号,所以我的日志轮询脚本如下:

#!/bin/sh
log_dir="/var/log/mongo/"
killall -SIGUSR1 mongod
/usr/bin/find ${log_dir} -name 'mongod.log.*' -mtime +5  -exec rm -f {} ;

然后每天零点零分跑一下。

我有6台mongodb,上面的脚本跑了一两个月一直挺正常。但是最近其中一台在做日志轮询的时候可能是产生了死锁,因为我首先收到了读写锁过多的报警,日志轮询没有成功,客户端也连不进去。收到报警后就连到服务器去看,查查日志,确定问题后重启mongodb就正常了。

这个脚本造成服务中断14分钟,mongodb用的是最新的稳定版本1.8.1,mongodb的稳定性还有待提高。

发生这个问题之后,上面的脚本就不敢再用了,对脚本进行了更改:

#!/bin/sh

log_dir="/var/log/mongo/"
date=`date +%Y-%m-%d`

cat ${log_dir}/mongod.log >> ${log_dir}/mongod.log.${date}
cat /dev/null > ${log_dir}/mongod.log

/usr/bin/find ${log_dir} -name 'mongod.log.*' -mtime +5  -exec rm -f {} ;

然后让他一小时跑一次,目前看还行,就是要多占一点磁盘IO,但是稳定第一,可以确保不会出现上面的问题了。