Mongodb日志切割

Mongodb日志切割linux

      依据客户端查询来设计集合的片键及索引,最近几天忽然须要查询历史数据进行分析,咱们的有些集合count达到亿条以上,每一个文档几百个字段。突如其来的查询分析,数据库很是的卡,尤为这几天刚刚加入一个新的分片。前天上午来看,发现主分片居然奔溃了,至于为何查询量大,数据库会奔溃,须要后续进行分析。mongodb

         遇到问题第一反应是看日志文件,拿到notepad以后因为文件太大没法打开,只能采用重启,而后开始查询mongodb日志管理的文档。Mongodb官网提出能够对日志进行切换。这种切换方式为:对当前的mongod或者mongos的当前日志文件进行重命名,加入当前时间,而后打开一个新的log文件,告诉全部的log写入到新的文件中。(注意千万不要本身在没有中止mongod的时候,直接mv而后再从新生成一个新的文件)。在mongodb中切换日志文件能够采用几种方式:shell

1.logRotate
        默认状况下,Mongodb是开启--logRotaterename选项的,在rename的状况下,能够在log文件中添加UTC时间戳的后缀。在admin数据库中,执行命令db.runCommand({logRotate:1})告诉数据库进行日志切换。会生成:log_rout.log.2017-02-22T02-10-09 相似的日志文件。这里有8个小时的时区问题。数据库

2.syslog
         利用syslog选项,使用系统的logrotate,这种状况下再也不须要开启logpath选项,尚未进行深刻的了解。数组

3.SIGUSR1
         在linux下,可使用kill –SIGUSR1(pid of mongod),对mongos及mongod都适用。测试

 

         若是但愿定时生成日志文件,而不是人工的天天执行命令。由于咱们的当前的集群方式为:mongos+mongod(配置副本集)+mongod(分片),因此若是能够ps –aux|grep mongod能够获得数组,而后直接使用kill –SiGUSR1命令就能够了。编写完sh命令以后,没法识别-SIGUSR1。ui

         选择第一种方式进入mongodb中,编写js脚本,而后sh命令调用这个js命令,指定一个linux的任务。Linux的任务分为当前用户任务,系统用户。最好选择crontab –e直接进行编辑,00 59 * * * /bin/sh mongo_log_mgr.sh,制定了一个定时的10点30分钟执行的sh脚本,可是没有执行。.net

是的,任务是已经启动,有执行的。单独执行该shell命令,没有问题。测试一个hello.sh命令好了,是的,加上绝对路径就ok了:任务改成:设计

0 59  ** * /bin/sh /root/shell_script/mongodb/mongo_log_mgr.sh日志

在sh中,mongo中有一个选项能够直接运行js文件,sh中命令以下:

/usr/local/bin/mongo  -u XXX -p XXX--authenticationDatabase admin ip:27017/admin --quiet /root/ shell_script/mongodb/mongo_log.js  

若是但愿将日志文件分为若干个文件夹,以便于查找某一天的日志,先睡眠,由于日志的移动可能须要时间,而后根据当天的日期建立文件夹.

sleep 30m

CURRENT_MONTH=$(date +%Y-%m)  
CURRENT_DAY=$(date +%d)  
LAST_DATE=$(date -d last-day +%Y-%m-%d)  
#若是是第一天则建立一个新的文件夹  
if [ $CURRENT_DAY = 01 ]   
then  
    mkdir /mongodb/log/$CURRENT_MONTH  
    LAST_MONTH=$(date -d last-month +%Y-%m)  
    mkdir /mongodb/log/$LAST_MONTH/$LAST_DATE  
    mv *.log.* /mongodb/log/$LAST_MONTH/$LAST_DATE  
else  
   mkdir /mongodb/log/$CURRENT_MONTH/$LAST_DATE  
   mv *.log.* /mongodb/log/$CURRENT_MONTH/$LAST_DATE  
fi  


一、   在js中使用while进行循环,运行sh命令执行js文件。当kill -2时,程序没有被杀死,直接使用kill -9 ,进程进入了僵尸状态,该进程就没法再接收任何的信号。这种状况下必须 ps –ef 获得ppid而后先杀掉父进程,做为子进程将会随后死亡

二、   在mongodb查询过程当中可使用maxTimsMS来限制查询的时间,避免长时间的查询形成数据库的死亡。或者使用KillOperator来杀掉某个正在进行的操做。可是必须很是的注意,这个操做的命令必须只是客户端的,不能是系统的命令,好比shard正在迁移之类的命令。 ---------------------  做者:jerry-89  来源:CSDN  原文:https://blog.csdn.net/eagle89/article/details/80019820  版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索