mongodb清除連接和日志的正確方法分享

前言

最近在做並發,服務器卡死瞭。

感覺是pymongo未能完全close掉和mongodb創建的tcp連接,並且在mongo連接未自動釋放前進行高頻連接,導致連接數爆滿造成的。

所以對建立的連接進行清除,以此記錄並做分享。

查看MongoDB的連接信息

db.serverStatus().connections

current 當前連接數

available 可用連接數

connection.totalCreated 創建到服務器的所有傳入連接的計數。此數字包括已關閉的連接。

清除所有當前的currentOp:

var ops = db.currentOp().inprog;
for(i = 0; i < ops.length; i++){
        var opid = ops[i].opid;
        db.killOp(opid);
        print("Stopping op ... #"+opid)
};

上面的命令無法關閉current連接

關閉current的方法一:

查看所有current的tcp連接:

netstat -nat | grep ‘27017′

查看指定端口的進程號

netstat -tpna | grep :35522

然後kill掉該進程

kill -9 14335

再到db-shell中查看,已經關閉一個current瞭。

這種方式關掉的tcp連接狀態會變成TIME_WAIT,端口依舊被占用,因為ACK是由我們主動關閉發出的。

不過還好的是一般等一段時間鏈接自動會被釋放,端口也不再被占用瞭。

可以看到35522和35524都已經被釋放。

關閉current的方法二:

如果你知道是由哪個程序連接的mongodb,比如python程序

那麼可以使用命令查看程序端口占用情況

ps -aux | grep python

然後kill掉對應的python程序,run.py,也能完成current的清除

批量清除指定程序:

ps -efww|grep -w "run.py" |grep -v grep|cut -c 9-15|xargs kill -9

日志

查看日志位置

cat /etc/mongod.conf

日志文件過大,不能通過vim查看,用tail查看最後100行

tail -n 100 mongo.log

不需要重啟服務,重新開啟一個新日志文件的方法

use admin
db.runCommand({logRotate:1})

運行過程中不能刪除日志文件,清空日志文件但不刪除文件的命令(刪除後沒有生成日志)

: >run.log

也可以使用旋轉日志 logRotate :對日志進行切割

去重script

db.getCollection('集合名').aggregate([{$group:{_id:{'去重字段':'$去重字段'}, count:{$sum:1}, dups:{$addToSet: '$_id'}}},{$match:{count:{$gt:1}}}] ,{ allowDiskUse: true }).forEach(function(doc){doc.dups.shift();db.getCollection('集合名').remove({_id: {$in: doc.dups}});})

導出數據

mongoexport -h localhost:27017 -u 用戶名 -p 密碼 -d 庫名 -c 集合名 -o 導出文件路徑

總結

到此這篇關於mongodb清除連接和日志的文章就介紹到這瞭,更多相關mongodb清除連接和日志內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: