【问题标题】:Nodejs code crashing Mongodb serverNodejs代码使Mongodb服务器崩溃
【发布时间】:2017-04-19 12:03:14
【问题描述】:

我在 mongodb 中的一个集合中有大约 300k 文档,这些都位于 AWS 中。当我查询这个特定的路线(thing2)时,mongo 处理起来似乎太多了,所以 mongod 服务崩溃了。我已经为我的代码添加了一个限制,但它仍然无法正常工作。理想情况下,我希望能够搜索特定关键字,但该部分目前已被注释掉。

var express = require('express')
var app = express()

app.get('/', function (req, res) {
    res.send('Hello World!')
});

app.get('/thing2', function(req, res) {

    var username = req.query.username
    var keyword = req.query.keyword

    var MongoClient = require('mongodb').MongoClient,
        assert = require('assert');
    var url = 'mongodb://localhost:27017/my_db';

    MongoClient.connect(url, function(err, db) {
        if (err) throw err;

        var collection = db.collection('my_collection');
        / * collection.find({ $and: [ 
          * {"text" : {$regex : ".*"+keyword+".*"}}, 
          *  {"username" : username}
          *  ] }).limit(5).toArray(function(err, docs) {
          */

        collection.find({"user.screen_name" : username}).limit(1).toArray(function(err, docs) {
            console.log("\n" + new Date().toLocaleString() + " " + username);

            if (!err) {
                console.log(docs.length)
            } else {
                console.log(err)
            }

            res.send(docs)
        });
    });
});

app.listen(80, function () {
    console.log('Listening on port 80!')
});

我在控制台中看到的错误是:

{ [MongoError: connection 0 to localhost:27017 closed]
  name: 'MongoError',
  message: 'connection 0 to localhost:27017 closed' }

编辑:mongo 日志

2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] 
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] 
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-04-19T03:59:03.458+0000 I CONTROL  [initandlisten] 
2017-04-19T03:59:03.471+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/var/lib/mongodb/diagnostic.data'
2017-04-19T03:59:03.471+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
2017-04-19T03:59:03.471+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2017-04-19T03:59:04.003+0000 I FTDC     [ftdc] Unclean full-time diagnostic data capture shutdown detected, found interim file, some metrics may have been lost. OK
2017-04-19T03:59:23.504+0000 I COMMAND  [ftdc] serverStatus was very slow: { after basic: 40, after asserts: 110, after connections: 130, after extra_info: 160, after globalLock: 310, after locks: 540, after network: 630, after opcounters: 760, after opcountersRepl: 870, after storageEngine: 1120, after tcmalloc: 1540, after wiredTiger: 2690, at end: 3370 }

【问题讨论】:

  • 你不需要(不应该)在你有请求的时候一直连接。您可以在开始时连接一次,然后在整个应用程序中继续使用此连接。
  • @israel.zinc 那么我该如何解决这个问题呢?
  • 服务崩溃时 mongo 日志说什么?你在纳米实例上吗? Mongo 通常很稳定
  • @Matt 我如何找到 mongo 日志?我在 t2.micro(免费层)
  • sudo less /var/log/mongodb/mongod.log

标签: node.js mongodb amazon-web-services


【解决方案1】:

问题是您连接得太频繁了。我会用猫鼬重做代码:

var express = require('express')
var app = express()
var mongoose   = require('mongoose');
mongoose.connect('mongodb://localhost/my_db')
var collection = require('user');

app.get('/', function (req, res) {
    res.send('Hello World!')
});

app.get('/thing2', function(req, res) {

    var username = req.query.username
    var keyword = req.query.keyword

    collection.find({"user.screen_name" : username}).limit(1).toArray(function(err, docs) {
            console.log("\n" + new Date().toLocaleString() + " " + username);

            if (!err) {
                console.log(docs.length)
            } else {
                console.log(err)
            }
            res.send(docs)
    });
});

app.listen(80, function () {
    console.log('Listening on port 80!')
});

你可以像这样建模一个猫鼬模式(文件名是:“user.js”):

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var UserSchema   = new Schema({
    name: String,
    userId : Number
});
module.exports = mongoose.model('User', UserSchema);

尽量让它最小化,然后随着你的真实模型增加。 希望我的回答对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2012-11-21
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多