MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O mongoDB tem problemas de reconexão ou estou fazendo errado?


ATUALIZAÇÃO :Nosso artigo de suporte para este tópico (basicamente uma cópia desta postagem) foi movido para nosso documento de solução de problemas de conexão.

Há um problema conhecido de que a rede IaaS do Azure impõe um tempo limite ocioso de aproximadamente treze minutos (chegado empiricamente). Estamos trabalhando com o Azure para ver se não podemos tornar as coisas mais fáceis de usar, mas, enquanto isso, outros tiveram sucesso configurando suas opções de driver para solucionar o problema.

Tempo máximo de inatividade da conexão

A solução alternativa mais eficaz que encontramos ao trabalhar com o Azure e nossos clientes foi definir o tempo máximo de inatividade da conexão abaixo de quatro minutos. A ideia é fazer com que o driver recicle conexões ociosas antes que o firewall force o problema. Por exemplo, um cliente, que está usando o driver C#, defina MongoDefaults.MaxConnectionIdleTime a um minuto e esclareceu seus problemas.
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

O código do aplicativo em si não mudou, mas agora nos bastidores o driver recicla agressivamente as conexões ociosas. O resultado também pode ser visto nos logs do servidor:muita perda de conexão durante períodos ociosos no aplicativo.

Há mais detalhes sobre essa abordagem no thread de usuário mongo relacionado, SocketException usando o driver C# no azure.

Mantenha ativo

Você também pode contornar o problema tornando suas conexões menos ociosas com algum tipo de keepalive. Isso é um pouco complicado de implementar, a menos que seu driver o suporte imediatamente, geralmente aproveitando o TCP Keepalive. Se você precisar fazer o seu próprio, certifique-se de pegar cada conexão ociosa do pool a cada dois minutos e emitir algum comando simples e barato, provavelmente um ping.

Como lidar com desconexões

Desconexões podem acontecer de tempos em tempos, mesmo sem uma configuração agressiva de firewall. Antes de entrar em produção, você quer ter certeza de manuseá-los corretamente.

Primeiro, certifique-se de habilitar a reconexão automática. Como fazer isso varia de driver para driver, mas quando o driver detecta que uma operação falhou porque a conexão estava ruim, ativar a reconexão automática informa ao driver para tentar se reconectar.

Mas isso não resolve completamente o problema. Você ainda tem o problema do que fazer com a operação com falha que acionou a reconexão. A reconexão automática não repete automaticamente as operações com falha. Isso seria perigoso, especialmente para gravações. Portanto, geralmente uma exceção é lançada e o aplicativo é solicitado a tratá-la. Muitas vezes, repetir as leituras é um acéfalo. Mas a repetição de gravações deve ser cuidadosamente considerada.

A sessão do shell mongo abaixo demonstra o problema. O shell mongo por padrão tem a reconexão automática habilitada. Insiro um documento em uma coleção chamada stuff em seguida, encontre todos os documentos dessa coleção. Eu então ajustei um cronômetro para trinta minutos e tentei o mesmo achado novamente. Ele falhou, mas o shell se reconectou automaticamente e, quando tentei novamente, funcionou conforme o esperado.
% 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") }

Estamos aqui para ajudar

Claro, se você tiver alguma dúvida, não hesite em nos contatar em [email protected] Estamos aqui para ajudar.