Mongoose: 4.7.1 => 4.7.2 : A conexão MongoError expirou

Criado em 9 dez. 2016  ·  44Comentários  ·  Fonte: Automattic/mongoose

Ao testar [email protected] / [email protected] , recebo:

MongoError: conexão 2 para XXXXXX expirou
em Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:29:11)
em Soquete.(/node_modules/mongodb-core/lib/connection/connection.js:186:20)
em Socket.g (eventos.js:286:16)
at emitNone (events.js:86:13)
em Socket.emit (eventos.js:185:7)
em Socket._onTimeout (net.js:333:8)
em tryOnTimeout (timers.js:224:11)
at Timer.listOnTimeout (timers.js:198:5)' } 'conexão 2 a XXXXXX expirou

isso não acontece com [email protected] / [email protected].

Mais detalhes:

  • consulta: agregar com allowDiskUse(true).read('secondaryPreferred').cursor()
  • timing: o erro acontece cerca de 35s após o envio da consulta (antes que os primeiros resultados sejam recebidos)
  • versão do nó: v6.3.0
  • versão npm: 3.10.9
  • opções de conexão:
{
 "socketOptions": {
    "socketTimeoutMS": 240000,
    "keepAlive": 10000,
    "connectTimeoutMS" : 30000
} 
  • consulta:
[
    { $match: {
            _id: { $lt: oid },
            signature: { $exists: true }
        }
    },
    { $group: { 
            _id: { myid: '$myid', signature: '$signature' },
            count: { $sum:  1 },
            myid: { $first: '$myid' },
            docs: { $push: { _id: '$_id', name: '$name' } }
        }
    },
    { $match: {
            count: { $gt : 1 }
        }
    }
]
docs

Comentários muito úteis

A questão está sem solução há algum tempo.
O que devemos fazer para corrigir isso?
Em algum momento eu gostaria de atualizar para a versão recente, mas só posso fazer isso quando isso for resolvido.

Todos 44 comentários

Estou enfrentando o mesmo problema, [email protected] , [email protected]

  • definir socketTimeoutMS para valores mais altos ou 0 não faz diferença
  • definir connectTimeoutMS para valores mais altos ou 0 não faz diferença
  • nenhum evento "close" ou "reconnected" é acionado, apenas um "timeout", que resulta em um erro do Mongoose no retorno de chamada

Reverter para [email protected] / [email protected] resolve o problema, ou seja, não causa timeouts

De [email protected] para 2.2.12 o ouvinte de evento de tempo limite mudou de "uma vez" para "on", talvez isso tenha algo a ver com isso?

Ou devemos postar isso como um problema no driver nativo do mongodb?

@silentjohnny Obtendo o mesmo problema com [email protected]

Eu postaria um problema no driver nativo do mongodb, o mongoose não faz muito em termos de conexão inicial.

Esquisito. Estou enfrentando o mesmo problema, mas com [email protected] e superior, que estão usando [email protected]
Com [email protected] e [email protected] funciona! .
Minha consulta agregada está sem opções, então não sei, talvez essa seja a diferença entre mim e o problema original @dcolens .

Alguém abriu um problema para o driver nativo? para que eu possa segui-lo...
Agora estou ficando com [email protected]

[email protected] atualizado para [email protected] que inclui uma correção para monitorar o tempo limite das operações e gerar um evento de tempo limite nas operações em execução @1284917

Em breve o Mongoose atualiza para [email protected] , vou tentar.

Mesmo problema para mim, e nem tenho certeza se são apenas agregados de longa duração que estão expirando ou se é aleatório e não um tempo limite real. Às vezes, parece que o tempo acaba quase imediatamente, mas outras vezes é executado por 30 segundos ou mais. Neste caso em particular, tenho quatro agregados.execs rodando ao mesmo tempo.

Reverter para [email protected] e [email protected] corrige isso, então estou fazendo isso por enquanto.

Esperamos que isso seja corrigido na próxima versão, já que o mongoose 4.7.7 usa [email protected]. De qualquer forma, isso não é realmente um problema de mangusto como @vkarpov15 disse, mas mais a ver com mongodb. Vou fechar isso por enquanto, mas se você ainda tiver o mesmo problema após o próximo lançamento, você deve abrir um ticket ou um PR no final do mongodb.

Eu acho que pode haver mais nessa questão do que aparenta. Eu tive que reverter para 4.4.20 para parar completamente esses tempos limite agregados que ocorrem em todas as circunstâncias. 4.7.xe 4.6.x ambos tiveram timeouts muito rápidos falsos em algumas circunstâncias de múltiplas execuções simultâneas. Pulei o 4.5 e voltei direto para uma versão boa conhecida (4.4.20) que estamos usando na produção, e isso resolveu completamente o problema, mas TBH ainda estou perplexo com o que está acontecendo. Desculpe, não tenho mais dados para adicionar, mas não tenho certeza se é apenas um problema com a versão do driver mongodb nativo que o mongoose está usando ou se há mais de um fator contributivo no trabalho .

Tendo o mesmo problema com [email protected] e [email protected]. Os tempos limite são realmente estranhos. Este é bem curto (cerca de 5s) e muito reprodutível, mas outras consultas demoram mais de 5s e não expiram

Estou certo de que os tempos limite são muitas vezes falsos. Em um cenário que eu estava olhando, iniciei quatro operações simultâneas de agregação.exec que levam cerca de 30 segundos. Um expirou em 8 segundos, um expirou em 20 segundos, mas os outros dois completaram normalmente em 30 segundos. A repetição causou uma ordem de tempo limite diferente, mas sempre um resultado semelhante. Suspeito que os tempos limite estão sendo configurados incorretamente nas conexões erradas ou não estão sendo removidos quando uma operação é concluída para que sejam acionados inesperadamente em um exec subsequente. Algo assim de qualquer maneira. Infelizmente não tenho tempo no momento para persegui-lo.

[email protected] parece ter resolvido os tempos limite para mim. @steve-p-com como você está sugerindo, os tempos limite em 4.7.2 eram realmente falsos e causavam eventos de erro sendo emitidos na conexão errada, isso foi resolvido por [email protected] e então [email protected] deveria funciona bem no seu caso. Você fez um teste com essa versão?

Ainda não testei 4.7.9 ou 4.8.0, talvez o [email protected] tenha introduzido uma regressão, o que explicaria o problema que o @flosky está enfrentando. Esse tempo limite também acontece no [email protected]?

Eu testei novamente com 4.8.1 hoje e não tive nenhum problema com tempos limite inesperados. Eu removi todos os caches npm e caches de fios primeiro, depois zapeei node_modules e reinstalei tudo. Até agora tudo bem.

Acontecendo para mim com 4.8.1 também. Voltei muitas versões no Mongoose e no MongoDB e recebo o problema o tempo todo.

@thenitai você tem mais contexto / podemos ver como você configura sua conexão mongoDB?

@varunjayaraman Descobri que nosso código de erro de domínio está pegando o erro e, assim, reinicia nosso aplicativo. No entanto, a questão ainda está lá.

Não tenho certeza do que você precisa ver na configuração de nossa conexão. Você quer dizer as opções de conexão? Se sim, são:

var dbOptions = {
            db: { native_parser: true },
            server: {
                auto_reconnect: true,
                socketOptions: {
                    keepAlive: 1, 
                    connectTimeoutMS: 300000,
                    socketTimeoutMS: 300000
                }
            }
        };

Eu tenho mesmo problema também. mesmo com a versão mais recente v4.8.4

acabei de encontrar o prob. no meu caso, é porque o uso de memória do servidor é muito alto (sempre 95% ~ 99%), após o aumento da memória, não há mais problema.

Estou vendo esse problema também no meu servidor com Mongoose 4.7.7 , MongoDB 3.4.1 e Node 4.7.2 . Quando o uso de memória é alto no meu servidor, os tempos limite parecem ocorrer aleatoriamente em série:

CosWebsite-27 MongoError: connection 42 to 127.0.0.1:27017 timed out
CosWebsite-27     at Function.MongoError.create (/home/cos/cos/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:29:11)
CosWebsite-27     at Socket.<anonymous> (/home/cos/cos/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:186:20)
CosWebsite-27     at Socket.g (events.js:260:16)
CosWebsite-27     at emitNone (events.js:67:13)
CosWebsite-27     at Socket.emit (events.js:166:7)
CosWebsite-27     at Socket.wrapped (/home/cos/cos/node_modules/newrelic/lib/transaction/tracer/index.js:183:28)
CosWebsite-27     at Socket.wrappedEmit [as emit] (/home/cos/cos/node_modules/newrelic/lib/transaction/tracer/index.js:220:46)
CosWebsite-27     at Socket._onTimeout (net.js:333:8)
CosWebsite-27     at _runOnTimeout (timers.js:537:11)
CosWebsite-27     at _makeTimerTimeout (timers.js:528:3)
CosWebsite-27     at Timer.unrefTimeout (timers.js:597:5)
... times 6
CosWebsite-27 GET /clans/compas-c-r-98QP9J2G/members 500 10569.300 ms - 9893
CosWebsite-27 GET /players/1000-99JQVQ9VU 500 12388.484 ms - 9849
CosWebsite-27 GET /players/R0YUPPRR/profile 500 8204.622 ms - 9857
CosWebsite-27 GET /players/UG8YJUJY/profile 500 4622.819 ms - 9857
CosWebsite-27 GET /clans/next-state-P8RYGQYV 500 11526.859 ms - 9861
CosWebsite-27 GET /clans/YY2CCUVV 500 6755.380 ms - 9817

Como você pode ver as solicitações, nenhuma delas durou mais de 12s. Meu conector mangusto está configurado desta forma:

const mongoDB = {
    uri: "mongodb://127.0.0.1:27017/XXX",
    options: {
        host: '127.0.0.1',
        port: '27017',
        database: "XXX",
        compression: false,
        server: {
            poolSize: 5,
            auto_reconnect: true,
            socketOptions: {
                socketTimeoutMS: 0,
                connectTimeoutMS: 0
            }
        },
        promiseLibrary: Promise
    }
};

Alguma ideia do que pode estar dando errado?

@adrienbaron Eu também!!!
alguém por favor me ajude.

Alguém arquiva um relatório de bug para os desenvolvedores do driver mongo nativo?

esse problema ainda existe no 4.9.1?

Sim, o problema ainda existe no 4.9.1....

[email protected]
[email protected]
[email protected]

Tive o mesmo problema hoje depois de atualizar para a versão mais recente do mangusto, depois fiz o downgrade para 4.7.1 e tudo está funcionando perfeitamente!

A questão está sem solução há algum tempo.
O que devemos fazer para corrigir isso?
Em algum momento eu gostaria de atualizar para a versão recente, mas só posso fazer isso quando isso for resolvido.

Atualizei o Mongoose de 4.4.17 para 4.7.9 há cerca de um mês. Desde então, um cronjob diário errou três vezes agora, sempre com um erro de tempo limite de conexão do mongo.

Vou mudar para o Mongoose 4.7.1 e ver se isso ajuda.

edit: a mensagem de erro

2017-04-19 03:09:23: You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
MongoError: connection 261 to localhost:27017 timed out
    at Function.MongoError.create (/var/www/someproject/node_modules/mongodb-core/lib/error.js:29:11)
    at Socket.<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/connection.js:186:20)
    at Socket.g (events.js:286:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:333:8)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

@centigrade-thomas-becker Eu tive o mesmo problema por mais de um mês em produção, voltei para 4.7.1 ontem, sem mais problemas!

mesmo problema ocorre @ 4.7.7

Com o Mongo 4.7.1 há menos problemas do que com o 4.7.9, mas ainda recebo a mensagem de erro ocasional ao salvar no MongoDB:

2017-04-30 03:09:32: Error: connection timeout
    at .<anonymous> (/var/www/someproject/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:168:17)
    at emitTwo (events.js:106:13)
    at emit (events.js:191:7)
    at listener (/var/www/someproject/node_modules/mongodb/lib/db.js:1791:14)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb/lib/server.js:270:14)
    at g (events.js:286:16)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/topologies/server.js:322:12)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)
    at .<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/pool.js:271:12)
    at g (events.js:286:16)
    at emitTwo (events.js:106:13)
    at emit (events.js:191:7)
    at Socket.<anonymous> (/var/www/someproject/node_modules/mongodb-core/lib/connection/connection.js:175:10)
    at Socket.g (events.js:286:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:333:8)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

O erro ocorre em uma VM Linux executando o Ubuntu 15.04

O mesmo aqui com:

├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]

versão mongo @ 3.2.11

na AWS EC2.

Alguma atualização/solução? keepAlive: true teria algum efeito positivo?

Não tenho certeza se isso ajuda alguém, mas no nosso caso percebemos que estávamos passando nossos parâmetros de tempo limite ( socketTimeoutMS etc) por meio de options.server . Isso foi _errado_! Estamos usando um conjunto de réplicas e, como tal, nossas opções devem ter como abaixo:

No nosso caso, o aplicativo realmente precisava da capacidade de se conectar a uma réplica ou a um servidor normal, então fizemos:

const serverOptions = {
  poolSize: 100,
  socketOptions: {
    socketTimeoutMS: 60000
  }
};

mongoose.createConnection(dbpath, {
  server: serverOptions,
  replset: serverOptions
});

Espero que ajude alguém!

Olá a todos,
Estou usando o mlab para hospedar meu banco de dados. eu recebo esse erro
Erro de conexão do Mongo DB: {[MongoError: connection 0 to ds155841.mlab. com:xxxxx expirou'}

@RemeAjayi Acho que isso não tem nada a ver com este bilhete.
Você deve tentar / criar outro depois de investigar o problema.

@ht2 você salvou meu dia ❤️

Existe alguma solução viável para o problema original?

Caso ajude alguém, experimentei esse problema ao paralelizar 2 consultas brutais find() (usando o padrão Promise).

Girando

Promise.all([
  col1.find({longQuery: true}),
  col2.find({longQuery: true})
])
.spread(function(result1, result2) {
  //stuff
});

em uma abordagem sequencial

col1.find({longQuery: true})
.then(function(result1) {
  return Promise.all([
    result1,
    col2.find({longQuery: true})
  ]);
})
.spread(function(result1, result2) {
  //stuff
});

Fez funcionar

@cyrilchapon pensou que estava funcionando para mim, mas sua abordagem sequencial não resolveu meu problema :/

é intermitente.. às vezes funciona, às vezes expira..

Por que esse fechamento silencioso?

Uma continuação do meu comentário anterior https://github.com/Automattic/mongoose/issues/4789#issuecomment -298849907

Mudei o banco de dados incorreto de uma máquina virtual para um contêiner docker com novo linux, nodeJS e mongoDB. Eu criei um teste de estresse que não faz nada além de truncar e reabastecer o banco de dados o dia todo. Descobri que cerca de 1 em 6.000 execuções de teste resultam em um erro de tempo limite.

Acho que tive a mesma experiência depois do meu último comentário, esqueci de mencionar.

Mas atualizar o node para uma de suas versões mais recentes, juntamente com todos os outros deps, aparentemente fez o truque.

Agora com o comentário acima acredito que seja uma questão de erro legado

Eu também estava tendo o mesmo problema com mongo 3.6.2 e mongoose 4.9.2
Eu consertei passando parâmetros de conexão adicionais

MONGO_URI=mongodb://user:[email protected]:27017/dbname?keepAlive=true&poolSize=30&autoReconnect=true&socketTimeoutMS=360000&connectTimeoutMS=360000

@mzahidriaz Muito obrigado, suas soluções funcionam para mim, mas você pode explicar ou consultar um link de como você escolheu esses parâmetros para resolver esse problema?

@MinhNguyen41092 agora os únicos documentos são os documentos do driver MongoDB http://mongodb.github.io/node-mongodb-native/3.1/api/MongoClient.html#connect . adicionaremos detalhes sobre isso em http://mongoosejs.com/docs/connections.html

Para aqueles que experimentam os erros intermitentes, eu também os tinha no mongoose-4.13.11 com mongodb-2.2.35 mongodb-core-2.1.19 em um ambiente específico. Várias consultas em diferentes pontos do nosso conjunto de testes, embora testando principalmente uma parte específica do nosso aplicativo que tem consultas mais pesadas e faz coisas em paralelo IIRC, estavam recebendo essa mensagem de erro. E todo o conjunto de testes não leva nem 15s para ser executado, então não há como eu ter atingido os tempos limite de 30s padrão em primeiro lugar:

     MongoError: connection 0 to localhost:27017 timed out
      at Function.MongoError.create (node_modules/mongoose/node_modules/mongodb-core/lib/error.js:29:11)
      at Socket.<anonymous> (node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:200:20)
      at Socket._onTimeout (net.js:448:8)

Isso só aconteceu em nosso servidor de compilação de teste de CI. Não consegui reproduzi-lo na minha máquina dev.

(No meu próprio sistema (repositório privado, isso é para minha própria referência, caso precise desenterrar isso novamente), esse erro aparece pelo menos nos números de compilação são 358, 356, 355, 352).

Depois de ativar useMongoClient: true , os testes parecem passar de forma confiável no ambiente de CI até agora. Eu tive três execuções bem-sucedidas com apenas essa alteração, enquanto muitas execuções sequenciais anteriores falharam devido ao erro de tempo limite estranho.

Acho que @thenitai @steve-p-com @adrienbaron também estava enfrentando os tempos de espera falsos e estranhos. Acho que o erro estava acontecendo com vocês antes do lançamento do 4.11, o que até trouxe useMongoClient: true como opção. Você pode dizer se isso fez a diferença para suas cargas de trabalho?

[email protected]
[email protected]
[email protected]
Tem o mesmo problema, erros de 1,5M na barra de rolagem por alguns dias, com o que pode ser conectado? Como resolver?
screen shot 2019-02-25 at 2 53 37 pm
screen shot 2019-02-25 at 2 54 01 pm
screen shot 2019-02-25 at 2 55 27 pm

@SergeyVatz veja a resposta à sua pergunta em # 5376

Esta página foi útil?
0 / 5 - 0 avaliações