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  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索