Node-redis: Leia ECONNRESET a cada 3 minutos - o servidor NodeJS trava devido a isso. Usando o plugin newrelic para monitoramento de servidor.

Criado em 9 fev. 2015  ·  26Comentários  ·  Fonte: NodeRedis/node-redis

Erro: conexão do Redis com redis1.tfs. tfs: 6379 falhou - leia ECONNRESET em RedisClient.on_error (/var/www/a/b/c/node_modules/redis/index.js:196:24) em Socket.(/var/www/a/b/c/node_modules/redis/index.js:106:14)
em Socket.emit (events.js: 95: 17)
em net.js: 441: 14
em /var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:188:31
em /var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:188:31
em process._tickDomainCallback (node.js: 486: 13)
no processo.(/var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/index.js:18:15)

question

Comentários muito úteis

@ ayazpasha2434 Esta linha resolveu meu erro

client.on ('erro', função (err) {console.error (err)})

Todos 26 comentários

Para mim, isso soa como um problema de rede fora do Node.js, esse erro "ECONNRESET" ocorre quando a conexão remota com o Node.js fecha o soquete inesperadamente.

Você está usando um proxy entre o Node e o Redis?

Qual versão do servidor Node / node_redis / Redis?

Duvido que o agente NewRelic esteja envolvido, mas você sempre pode tentar reproduzir sem o agente e ver se isso corrige o problema. cc / @wraithan

Essas linhas são apenas CLS fazendo isso. Com mais uma reprodução, eu poderia descartar totalmente o agente da New Relic. Mas estou relativamente confiante de que isso não foi causado por nós.

Removi o agente NewRelic, o problema ainda ocorre. Aproximadamente. a cada 3 minutos eu vejo esse acidente acontecendo. Abaixo estão os logs para referência.

events.js: 72
jogue er; // Evento de 'erro' não tratado
^
Erro: conexão do Redis com redis1.tfs. tfs: 6379 falhou - leia ECONNRESET
em RedisClient.on_error (/var/www/a/b/c/node_modules/redis/index.js:196:24)
em Socket.(/var/www/a/b/c/node_modules/redis/index.js:106:14)
em Socket.emit (events.js: 95: 17)
em net.js: 441: 14
em process._tickDomainCallback (node.js: 486: 13)
erro: Script para sempre detectado saiu com código: 8
erro: tentativa de reinicialização do script # 50

Além disso, estou usando Node.JS - v0.10.35, node_redis - 0.12.1 e Redis - 2.8.4.
Estou acessando o Redis diretamente via IP no Node.

Eu também estava enfrentando esse problema, mas só foi resolvido depois que percebi que estava brincando com meu arquivo /etc/hosts ontem por algum outro motivo. Estava faltando:

127.0.0.1 localhost

@ ayazpasha2434 a solução pode não ser a mesma para você, mas como os outros estão sugerindo, é definitivamente fora do nó e no env / shell / OS / VM. Dê um passo para trás e olhe para ele.

@sarathms Eu tenho esse mapeamento em meu arquivo hosts. No entanto, a máquina Redis no meu caso é remota. Apenas checado, eu tenho o referido mapeamento de host local na máquina Redis também. Ainda assim, o problema não foi resolvido.

Eu também estou enfrentando o mesmo problema . Aqui está a saída do console

events.js: 72
jogue er; // Evento de 'erro' não tratado
^
Erro: conexão do Redis com pub-redis-10606.us-east-1-1.1.ec2.garantiadata. com: 10606 falhou - leia ECONNRESET em RedisClient.on_error (C: UsersGigiDesktopeduknow_api_ver_1authnode_m
odulesredisindex.js: 196: 24)
em Socket.(C: UsersGigiDesktopeduknow_api_ver_1authnode_modulesredisindex.js: 106: 14)
em Socket.emit (events.js: 95: 17)
em net.js: 441: 14
em process._tickCallback (node.js: 442: 13)

@ ayazpasha2434 Esta linha resolveu meu erro

client.on ('erro', função (err) {console.error (err)})

@ ayazpasha2434 @Waterloo tem a resposta certa para você?

Parecia haver um problema com sua conexão de rede e não parece ser um problema com o nó redis. Adicionar o manipulador de erros deve ser suficiente para que o aplicativo não trave mais (e deve estar sempre anexado).

Eu encontrei esse problema quando postei um http (usar postagem) no servidor JAVA. {[Erro: leia ECONNRESET]
código: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'ler',
resposta: indefinido}
Erro: leia ECONNRESET
em exportações._errnoException (util.js: 856: 11)
em TCP.onread (net.js: 546: 26)
retorno de chamada duplo!
POST / user_archives / criar / salvar 500 45,306 ms - 386
Erro: leia ECONNRESET
em exportações._errnoException (util.js: 856: 11)
em TCP.onread (net.js: 546: 26)

@ biggu0 Não tenho certeza de que conexão isso tem com node_redis. Para saber mais sobre ECONNRESET, você pode querer dar uma olhada em stackoverflow .

Olá ,
Também estamos vendo esse problema. Observamos que pode ser por causa do SNAPSHOTTING do redis. Sempre que o redis está tirando instantâneo e armazenando no disco, a conexão é redefinida. Para provar a mim mesmo, comparo os logs do aplicativo com os logs de depuração do Redis e os tempos são exatamente iguais.

abaixo estão as configurações de instantâneo em redis.conf
economize 900 1
economize 300 10
economize 60 10.000

Informe-nos se estivermos fazendo algo errado.

Também estou enfrentando problemas de conexão com freqüência.

ERR em RedisClient.emit (events.js: 188: 7)
ERR em RedisClient.on_error (/home/vcap/app/node_modules/redis/index.js:394:14)
ERR no RedisClient.(/home/vcap/app/server.js:28:13)
ERR em emitErrorNT (net.js: 1281: 8)
ERR no soquete.(/home/vcap/app/node_modules/redis/index.js:272:14)
ERR em process._tickCallback (internal / process / next_tick.js: 98: 9)
ERR Error: Redis connection to XXXXXXXX: XXXXX falhou - leia ECONNRESET
ERR em TCP.onread (net.js: 572: 26)
ERR em _combinedTickCallback (internal / process / next_tick.js: 74: 11)
ERR em emitOne (events.js: 96: 13)
ERR nas exportações._errnoException (util.js: 1022: 11)
ERR em Socket.emit (events.js: 188: 7)

Depois de obter o erro, ele se reconecta automaticamente.
Qual pode ser o problema para perder a conexão.

Oi Waterloo,
Onde você coloca esta instrução client.on ('error', function (err) {console.error (err)})
e acho que esta declaração apenas para consolar seu erro nada mais.
é realmente utilizável?
Por favor, dê-me seus pensamentos o mais rápido possível.

Desde já, obrigado!!!

Olá

Eu também estou enfrentando o mesmo problema

events.js: 160
jogue er; // Evento de 'erro' não tratado
^

Erro: leia ECONNRESET

Isso resolveu meu problema com:

  1. Desativei o monitoramento de todos os meus processos (nova relíquia, apm elástico ...)
  2. Eu usei este código
    `` `Javascript
    process.on ('uncaughtException', function (err) {
    console.error (err.stack);
    console.log ("Nó NÃO Sai ...");
    });

Eu também estou enfrentando esse problema. Estou usando o framework sails.js com um gancho, então há apenas uma conexão com o servidor redis ao iniciar o serviço de nó, usaremos o objeto velas globais para acessar e trabalhar com redis

redisClient = redis.createClient({
    host: redisConfig.host,
    port: redisConfig.port,
    db: redisConfig.db,
    retry_strategy: (retryOptions) => {
        if (retryOptions.error && retryOptions.error.code === 'ECONNREFUSED') {
            // End reconnecting on a specific error and flush all commands with
            // a individual error
            return new Error('The server refused the connection');
        }

        if (retryOptions.total_retry_time > 1000 * 60 * 60) {
            // End reconnecting after a specific timeout and flush all commands
            // with a individual error
            return new Error('Retry time exhausted');
        }

        if (retryOptions.attempt > 3) {
            // End reconnecting with built in error
            return undefined;
        }

        sails.log.debug('Handling redis retry strategy', {
            error: retryOptions.error,
            totalRetryTime: retryOptions.total_retry_time,
            attempt: retryOptions.attempt
        });

        // Reconnect after
        return Math.min(retryOptions.attempt * 100, 3000);
    }
});

Aqui está o rastreamento da pilha do erro
AbortError: Conexão do Redis perdida e comando abortado. Pode ter sido processado.n em RedisClient.flush_and_error (/var/sample-app/node_modules/redis/index.js:362:23) n em RedisClient.connection_gone (/ var / sample-app / node_modules / redis / index. js: 664: 14) n em RedisClient.on_error (/var/sample-app/node_modules/redis/index.js:410:10)n em Socket.(/var/sample-app/node_modules/redis/index.js:279:14)n em emitOne (events.js: 116: 13) n em Socket.emit (events.js: 211: 7) n em emitErrorNT ( internal / streams / destroy.js: 66: 8) n em /var/sample-app/node_modules/async-listener/glue.js:188:31n em args. (função anônima) (/ usr / lib / node_modules / pm2 /node_modules/event-loop-inspector/index.js:138:29)n em _combinedTickCallback (internal / process / next_tick.js: 139: 11) n em process._tickDomainCallback (internal / process / next_tick.js: 219: 9 ) n em process.fallback (/var/sample-app/node_modules/async-listener/index.js:563:15).

Nosso aplicativo de nó está sendo executado em um contêiner Docker e se conectará ao servidor Redis instalado em uma instância Linux EC2.

Também enfrentamos o mesmo problema, mas aqui colocamos o stunnel para fazer o proxy do redis para o localhost usando a configuração do stunnel abaixo.

fips = não

setuid = root

setgid = root

pid = /var/run/stunnel.pid
debug = 7

options = NO_SSLv2

options = NO_SSLv3
output = /var/log/stunnel.log

cliente = não

primeiro plano = sim

[redis-cli]
cliente = sim
aceitar = 127.0.0.1:6379
conectar = redi ponto de envio: 6379

o nó está se desconectando com os erros abaixo a cada dois minutos. Estamos executando isso através de contêineres docker.

Falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
Erro: falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
Erro: falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
AbortError: Conexão do Redis perdida e comando abortado. Pode ter sido processado.

qualquer resolução?

Também enfrentamos o mesmo problema, mas aqui colocamos o stunnel para fazer o proxy do redis para o localhost usando a configuração do stunnel abaixo.

fips = não

setuid = root

setgid = root

pid = /var/run/stunnel.pid
debug = 7

options = NO_SSLv2

options = NO_SSLv3
output = /var/log/stunnel.log

cliente = não

primeiro plano = sim

[redis-cli]
cliente = sim
aceitar = 127.0.0.1:6379
conectar = redi ponto de envio: 6379

o nó está se desconectando com os erros abaixo a cada dois minutos. Estamos executando isso através de contêineres docker.

Falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
Erro: falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
Erro: falha na conexão do Redis com 127.0.0.1:6379 - leia ECONNRESET
em TCP.onStreamRead (internal / stream_base_commons.js: 111: 27)
AbortError: Conexão do Redis perdida e comando abortado. Pode ter sido processado.

qualquer resolução?

o mesmo para mim, eu acho que este é um problema com o stunnel

Eu também estou enfrentando o mesmo erro

{ Error: Redis connection to xx.xx.x.x:6379 failed - read ECONNRESET" 

at TCP.onStreamRead (internal/stream_base_commons.js:111:27) errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read' 

Também estou usando o manipulador de erros, mas o motivo disso é porque isso pode afetar minhas chamadas de consulta e atrasar minhas solicitações.

@Ayaz Pode abrir este problema porque este problema não foi completamente resolvido, as pessoas apenas trataram da resposta de erro, mas o problema ainda não foi resolvido.

Batendo: mesmo problema aqui:

error: Error: Redis connection to xx.yy.zz.aa:6379 failed - read ECONNRESET at TCP.onStreamRead (internal/stream_base_commons.js:205:27) { errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read' },

Vejo o mesmo problema com:

  • NodeJS v12.16.3
  • Estrutura NestJS
  • IOredis: 4.2
  • nestjs-redis: 1.2.8

O Redis é fornecido usando o Google Cloud MemoryStore.

Os registros mostram:

[ioredis] Evento de erro não tratado: Erro: leia ECONNRESET

Isso está acontecendo uma vez a cada 24 horas, sem nenhum motivo específico ou as mesmas etapas, simplesmente acontece

@ robertop87
Eu vejo o mesmo problema. O Redis é fornecido usando o Google Cloud MemoryStore. Você resolveu esse problema?

Também observamos um problema muito semelhante com Cloud run / Cloud Functions ao se conectar ao Cloud Memory Store. Possivelmente, pode estar acontecendo quando os recursos subjacentes são interrompidos muito cedo de forma aleatória pelo Google.

Esse problema começou há cerca de uma semana para nós, sem alterações em como estamos lidando com a conexão do Redis. Também estamos usando ioredis para lidar com a conexão e executar o nó 12.

IORedis tem como estratégia padrão reconectar em caso de erro, mas por algum motivo isso não está acontecendo.

O que fiz foi adicionar o próximo na configuração:

reconnectOnError: (error): boolean => {
  console.log('Always reconnect on error', error)
  return true
}

O erro ECONNRESET ainda está presente, mas agora minha conexão foi tentada novamente e minha instância do Google não está mais travada.

CC: @ hkd987

Leia mais detalhes sobre reconnectOnError aqui: https://github.com/luin/ioredis

@ robertop87 Fez uma nova implantação com a configuração específica para sempre reconnectOnError definida para retornar verdadeiro. Este parece ser um problema que precisa ser reaberto ou um novo tíquete feito, já que isso está acontecendo na versão mais recente.

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

Questões relacionadas

betimer picture betimer  ·  5Comentários

lemon707 picture lemon707  ·  3Comentários

Stono picture Stono  ·  6Comentários

jackycchen picture jackycchen  ·  4Comentários

id0Sch picture id0Sch  ·  4Comentários