Подтвердить что ты не робот

Помогает ли mongoDB проблемы, или я делаю это неправильно?

Я использую nodejs и mongoDB - и у меня возникают проблемы с подключением.

Ну, на самом деле "проснуться"! Он прекрасно соединяется - супер быстрый, и я в целом доволен результатами.

Моя проблема: Если я не использую соединение какое-то время (скажу, что, поскольку таймфрейм меняется 5+ минут), похоже, он останавливается. Я не получаю сообщения об отключении - это просто зависает.

В конце концов я получаю ответ вроде Error: не удалось подключиться к [*.mongolab.com: *] - (* = маскированные значения)

Быстрый перезапуск приложения, а соединение - снова. Иногда, если я не перезапускаю приложение, я могу обновить его и снова подключиться.

Вот почему я думаю, что это "бодрствование".

Грубая схема кода:

Я не включил код - я не думаю, что он нужен. Он работает (помимо отключения связи)

Замечания: Есть только один "connect" - я никогда не закрываю его. Я никогда не открываю глаза.

Я использую mongoose, socketio.

/* constants */

var mongoConnect = 'myworkingconnectionstring-includingDBname';


/* includes */

/* settings */

/* Schema */

var db = mongoose.connect(mongoConnect);

    /* Socketio */

io.configure(function (){
    io.set('authorization', function (handshakeData, callback) {

    });
});

io.sockets.on('connection', function (socket) {

});//sockets

io.sockets.on('disconnect', function(socket) {
    console.log('socket disconnection')
});

/* The Routing */

app.post('/login', function(req, res){  

});

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

});

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

});

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

});

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

});

server.listen(port);
console.log('Listening on port '+port);

db.connection.on('error', function(err) {
    console.log("DB connection Error: "+err);
});
db.connection.on('open', function() {
    console.log("DB connected");
});
db.connection.on('close', function(str) {
    console.log("DB disconnected: "+str);
});

Я пробовал различные конфигурации здесь, как открытие и закрытие все время - я считаю, однако, общий консенсус заключается в том, чтобы сделать то же самое, что я с одной открытой упаковкой.??

Я пробовал тестер подключения, который продолжает проверять статус соединения... хотя это, как говорят, все в порядке - проблема все еще происходит.

У меня была эта проблема с первого дня. Я всегда принимал MongoDB с MongoLab. Проблема, по-видимому, хуже на локальном хосте. Но у меня все еще есть проблема с Azure и теперь nodejit.su.

Как это происходит везде - это, должно быть, я, MongoDB или mongolab.

Кстати, у меня тоже был опыт работы с драйвером php. (чтобы подтвердить это на узле, хотя)

Это было бы здорово для некоторой помощи - даже если кто-то просто сказал "это нормально"

заблаговременно

Rob

4b9b3361

Ответ 1

Спасибо всем парням-ребятам - мне удалось решить эту проблему как на локальном хосте, так и на локальном сервере.

Вот мой действующий код подключения:

var MONGO = {
    username: "username",
    password: "pa55W0rd!",
    server: '******.mongolab.com',
    port: '*****',
    db: 'dbname',
    connectionString: function(){
        return 'mongodb://'+this.username+':'+this.password+'@'+this.server+':'+this.port+'/'+this.db;
    },
    options: {
        server:{
            auto_reconnect: true,
            socketOptions:{
                connectTimeoutMS:3600000,
                keepAlive:3600000,
                socketTimeoutMS:3600000
            }
        }
    }
};

var db = mongoose.createConnection(MONGO.connectionString(), MONGO.options);

db.on('error', function(err) {
    console.log("DB connection Error: "+err);
});
db.on('open', function() {
    console.log("DB connected");
});
db.on('close', function(str) {
    console.log("DB disconnected: "+str);
});

Я думаю, что самое большое изменение заключалось в том, чтобы использовать "createConnection" поверх "connect" - я использовал это раньше, но, возможно, варианты теперь помогают. Эта статья помогла значительно http://journal.michaelahlers.org/2012/12/building-with-nodejs-persistence.html

Если честно, я не слишком уверен в том, почему я добавил эти параметры - как упоминалось в @jareed, я также нашел некоторых людей, имеющих успех с MaxConnectionIdleTime, - но насколько я могу видеть драйвер javascript не имеет этой опции: это была моя попытка попытаться воспроизвести поведение.

До сих пор так хорошо - надеюсь, что это поможет кому-то.

ОБНОВЛЕНИЕ: 18 апреля 2013 г. заметьте, это второе приложение с другой настройкой

Теперь я думал, что это решение было решено, но проблема снова подняла уродливую голову еще на другое приложение - с тем же кодом подключения. Confused!!!

Однако настройка немного отличалась...

Это новое приложение запускалось в окне Windows с использованием IISNode. Я не видел это как значительного изначально.

Я читал, что, возможно, возникли некоторые проблемы с монго на Azure (@jareed), поэтому я переместил БД на AWS - все еще проблема сохранялась.

Итак, я снова начал играть с этим опционным объектом, довольно много читаю на нем. Пришел к такому выводу:

options: {
    server:{
        auto_reconnect: true,
        poolSize: 10,
        socketOptions:{
            keepAlive: 1
        }
    },
    db: {
        numberOfRetries: 10,
        retryMiliSeconds: 1000
    }
}

Это было немного более образованным, чем мой исходный объект объектов i. Однако - это все еще не хорошо.

Теперь по какой-то причине мне пришлось выйти из окна Windows (что-то делать с модулем, не компилирующимся на нем) - было легче перемещаться, чем тратить на другой неделе, пытаясь заставить его работать.

Итак, я переместил мое приложение на nodejitsu. Низкая, и вот моя связь осталась жива! Woo!

Итак.... что это значит... Я понятия не имею! Я знаю, что эти параметры, похоже, работают на Nodejitsu.... для меня.

Я считаю, что IISNode использует какой-то "навсегда" script для сохранения приложения. Теперь, чтобы быть справедливым, приложение не терпит крах для этого, но я думаю, что должен быть какой-то "цикл приложений", который постоянно обновляется - так он может выполнять непрерывное развертывание (ftp-код вверх, нет необходимости перезапустите приложение) - возможно, это фактор; но теперь я просто догадываюсь.

Конечно, все это означает, что это не решено. Он все еще не решен. Это просто решило для меня в моей настройке.

Ответ 2

ОБНОВЛЕНИЕ. Наша статья поддержки для этой темы (по существу, копия этого сообщения) переместилась на наше устранение неполадок с подключением doc.

Известно, что сеть Azure IaaS обеспечивает тайм-аут простоя около тринадцати минут (эмпирически прибыл). Мы работаем с Azure, чтобы убедиться, что мы не можем сделать вещи более удобными для пользователя, но в то же время у других был успех, настроив параметры своих драйверов, чтобы обойти эту проблему.

Максимальное время простоя подключения

Самое эффективное обходное решение, которое мы нашли при работе с Azure и нашими клиентами, заключалось в том, чтобы установить максимальное время простоя соединения менее четырех минут. Идея состоит в том, чтобы заставить драйвер перерабатывать незанятые соединения до того, как брандмауэр запустит проблему. Например, один клиент, который использует драйвер С#, установил MongoDefaults.MaxConnectionIdleTime на одну минуту, и он очистил свои проблемы.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

Сам код приложения не изменился, но теперь за кулисами драйвер агрессивно перерабатывает незанятые соединения. Результат также можно увидеть в журналах сервера: много сбоев подключения в периоды простоя в приложении.

Более подробная информация об этом подходе содержится в соответствующем потоке mongo-user, SocketException с использованием драйвера С# на лазурном экране.

Keepalive

Вы также можете обойти проблему, сделав ваши соединения менее простыми с помощью keepalive. Это немного сложно реализовать, если ваш драйвер не поддерживает его из коробки, обычно используя TCP Keepalive. Если вам нужно сворачивать самостоятельно, не забудьте каждую пару минут пропустить каждое свободное соединение из пула и выдайте простую и дешевую команду, возможно, ping.

Обработка разъединений

Отключение может происходить время от времени даже без агрессивной настройки брандмауэра. Перед тем, как начать работать, вы должны быть уверены, что будете правильно их обрабатывать.

Во-первых, обязательно включите автоматическое повторное подключение. Как это сделать может варьироваться от драйвера к драйверу, но когда драйвер обнаруживает, что операция завершилась неудачно, потому что соединение было неудачным, включение автоматического повторного подключения говорит драйверу попытаться снова подключиться.

Но это не полностью решает проблему. У вас все еще есть вопрос, что делать с неудавшейся операцией, вызвавшей повторное подключение. Автоматическое повторное подключение не выполняет автоматическую повторную попытку неудачных операций. Это было бы опасно, особенно для писем. Поэтому обычно генерируется исключение, и приложение запрашивает его. Часто повторное чтение читает. Но повторные записи должны быть тщательно рассмотрены.

Сессия оболочки mongo ниже демонстрирует проблему. По умолчанию оболочка mongo имеет автоматическое повторное подключение. Я вставляю документ в коллекцию с именем stuff, затем нахожу все документы в этой коллекции. Затем я установил таймер на тридцать минут и снова попробовал ту же самую находку. Он не удался, но оболочка автоматически подключилась, и когда я сразу же повторил свою находку, она работала, как ожидалось.

% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p *** 
MongoDB shell version: 2.2.2 
connecting to: ds012345.mongolab.com:12345/mydatabase 
> db.stuff.insert({}) 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") } 
> db.stuff.find() 
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345 
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345] 
Fri Jan 18 13:29:28 DBClientCursor::init call() failed 
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345 
Error: error doing query: failed 
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345 
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }

Мы здесь, чтобы помочь

Конечно, если у вас есть какие-либо вопросы, не стесняйтесь обращаться к нам по адресу [email protected] Мы здесь, чтобы помочь.

Ответ 3

Несколько рекомендаций для людей, все еще имеющих эту проблему:

  • Убедитесь, что вы используете последний клиент mongodb для node.js. Я заметил значительные улучшения в этой области при переходе с v1.2.x на v1.3.10 (последнее на сегодняшний день)

  • Вы можете передать объект options в MongoClient.connect. Следующие опции работали для меня при подключении Azure к MongoLab:

    options = { db: {}, server: {   auto_reconnect: true,   socketOptions: {keepAlive: 1} }, replSet: {}, mongos: {} };

    MongoClient.connect(dbUrl, options, function (err, dbConn) { // ваш код });

  • См. другой ответ, в котором я описываю, как обрабатывать событие "закрыть", которое кажется более надежным. fooobar.com/questions/209057/...

Ответ 4

Включите параметр auto_reconnect Server следующим образом:

var db = mongoose.connect(mongoConnect, {server: {auto_reconnect: true}});

Соединение, которое вы открываете здесь, представляет собой пул из 5 подключений (по умолчанию), поэтому вы можете просто подключиться и оставить его открытым. Я предполагаю, что вы периодически теряете связь с монголабом, и ваши соединения умирают, когда это происходит. Надеемся, что включение auto_reconnect разрешит это.

Ответ 5

Увеличение времени ожидания может помочь.

  • "socketTimeoutMS": сколько времени может отправляться или получать по сокету до истечения времени.
  • "wTimeoutMS": он определяет, сколько миллисекунд ожидает сервер беспокойство о записи должно быть удовлетворено.
  • "connectTimeoutMS": как долго может открываться соединение до истечения времени в миллисекундах.

    $m = новый MongoClient ( "mongodb://127.0.0.1: 27017", array ( "connect" = > TRUE, "connectTimeoutMS" = > 10, "socketTimeoutMS" = > 10, "wTimeoutMS" = > 10));

        $db= $m->mydb;
        $coll = $db->testData;
        $coll->insert($paramArr);
    

Ответ 6

У меня была аналогичная проблема: периодически отключался от MongoDB. Выполнение двух вещей исправлено:

  • Убедитесь, что ваш компьютер никогда не спит (это приведет к отключению вашего сетевого подключения).
  • Обход вашего маршрутизатора/межсетевого экрана (или его настройка должным образом, что я еще не понял, как это сделать).