Node-redis: 每3分钟读取一次ECONNRESET-由于此原因,NodeJS服务器崩溃。 使用newrelic插件进行服务器监视。

创建于 2015-02-09  ·  26评论  ·  资料来源: NodeRedis/node-redis

错误:Redis与redis1.tfs的连接。 tfs:6379失败-在套接字上的RedisClient.on_error(/var/www/a/b/c/node_modules/redis/index.js:196:24)处读取ECONNRESET。(/var/www/a/b/c/node_modules/redis/index.js:106:14)
在Socket.emit(events.js:95:17)
在net.js:441:14
在/var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:188:31
在/var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:188:31
在process._tickDomainCallback(node.js:486:13)
在处理中。(/var/www/a/b/c/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/index.js:18:15)

question

最有用的评论

@ ayazpasha2434这行解决了我的错误

client.on('error',function(err){console.error(err)})

所有26条评论

对我来说,这听起来像是Node.js外部的网络问题,当与Node.js的远程连接意外关闭套接字时,出现此错误“ ECONNRESET”。

您是否在Node和Redis之间使用代理?

什么版本的Node / node_redis / Redis服务器?

我怀疑是否涉及到NewRelic代理,但是您始终可以在没有代理的情况下尝试重现,看看是否可以解决问题。 cc / @wraithan

这些行只是CLS所做的事情。 通过更多的复制,我可以完全排除New Relic代理。 但是我相对有信心这不是我们造成的。

我删除了NewRelic代理,问题仍然出现。 大约每3分钟就会发生一次崩溃。 以下是参考日志。

events.js:72
投掷者 //未处理的“错误”事件
^
错误:Redis与redis1.tfs的连接。 tfs:6379失败-读取ECONNRESET
在RedisClient.on_error(/var/www/a/b/c/node_modules/redis/index.js:196:24)
在套接字。(/var/www/a/b/c/node_modules/redis/index.js:106:14)
在Socket.emit(events.js:95:17)
在net.js:441:14
在process._tickDomainCallback(node.js:486:13)
错误:永远检测到的脚本已退出,代码为:8
错误:脚本重新启动尝试#50

另外,我正在使用Node.JS-v0.10.35,node_redis-0.12.1和Redis-2.8.4。
我正在直接通过Node中的IP访问Redis。

我也遇到了这个问题,但是在昨天意识到由于其他原因我正在玩我的/etc/hosts文件之后,我才得到解决。 它不见了:

127.0.0.1 localhost

@ ayazpasha2434解决方案可能对您而言并不相同,但是就像其他人暗示的那样,它绝对是在节点外部和env / shell / OS / VM中。 退后一点,凝视它。

@sarathms我的主机文件中有此映射。 但是,在我看来,Redis机器是远程机器。 只是交叉检查,我在Redis机器中也有所说的localhost映射。 问题仍然没有解决。

我也面临着同样的问题。 这是控制台输出

events.js:72
投掷者 //未处理的“错误”事件
^
错误:Redis与pub-redis-10606.us-east-1-1.1.ec2.garantiadata的连接。 com:10606失败-在RedisClient.on_error上读取ECONNRESET(C:UsersGigiDesktopeduknow_api_ver_1authnode_m
odulesredisindex.js:196:24)
在套接字。(C:UsersGigiDesktopeduknow_api_ver_1authnode_modulesredisindex.js:106:14)
在Socket.emit(events.js:95:17)
在net.js:441:14
在process._tickCallback(node.js:442:13)

@ ayazpasha2434这行解决了我的错误

client.on('error',function(err){console.error(err)})

@ ayazpasha2434没有@Waterloo有你正确的答案?

您的网络连接似乎有问题,而节点redis似乎没有问题。 添加错误处理程序就足够了,这样应用程序就不会再崩溃(并且应该始终挂载)。

当我向JAVA服务器发布http(使用发布)时遇到了这个问题。{[错误:读取ECONNRESET]
代码:“ ECONNRESET”,
errno:“ ECONNRESET”,
syscall:“读取”,
响应:未定义}
错误:读取ECONNRESET
在exports._errnoException(util.js:856:11)
在TCP.onread(net.js:546:26)
双回调!
POST / user_archives / create / save 500 45.306 ms-386
错误:读取ECONNRESET
在exports._errnoException(util.js:856:11)
在TCP.onread(net.js:546:26)

@ biggu0我不确定这与node_redis有什么连接。 要了解有关ECONNRESET的更多信息,您可能需要查看stackoverflow

嗨,您好 ,
我们也看到了这个问题。 我们观察到这可能是由于redis快照。 每当redis拍摄快照并重置磁盘连接上的存储时。 为了证明自己,我将应用程序日志与redis调试日志进行了比较,并且计时完全匹配。

以下是redis.conf中的快照设置
节省900 1
节省300 10
节省60 10000

如果我们做错了事,请告诉我们。

我也经常遇到连接问题。

RedisClient.emit的ERR(events.js:188:7)
RedisClient.on_error上的ERR(/home/vcap/app/node_modules/redis/index.js:394:14)
RedisClient的ERR。(/home/vcap/app/server.js:28:13)
EmitErrorNT处的ERR(net.js:1281:8)
套接字错误。(/home/vcap/app/node_modules/redis/index.js:272:14)
process._tickCallback的ERR(内部/进程/next_tick.js:98:9)
ERR错误:Redis与XXXXXXXX:XXXXX的连接失败-读取ECONNRESET
TCP.onread(net.js:572:26)的ERR
_combinedTickCallback的ERR(内部/进程/next_tick.js:74:11)
EmitOne的ERR(events.js:96:13)
出口错误_errnoException(util.js:1022:11)
Socket.emit的ERR(events.js:188:7)

收到错误后,它将自动重新连接。
失去连接可能是什么问题。

嗨,滑铁卢,
您在哪里放置此语句client.on('error',function(err){console.error(err)})
我认为这只是为了安慰您的错误而已。
真的有用吗?
请尽快给我您的想法。

提前致谢!!!

你好

我也面临着同样的问题

events.js:160
投掷者 //未处理的“错误”事件
^

错误:读取ECONNRESET

这解决了我的问题:

  1. 我禁用了所有过程监视功能(新版本,弹性apm ...)
  2. 我用了这段代码
    Java脚本
    process.on('uncaughtException',function(err){
    console.error(err.stack);
    console.log(“节点未退出...”);
    });

我也面临这个问题。 我正在使用带钩子的sails.js框架,因此在启动节点服务时只有一个与Redis服务器的连接,我们将使用全局Sails对象访问和使用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);
    }
});

这是错误的堆栈跟踪
AbortError:Redis连接丢失,命令中止。 它可能已经处理过.n在RedisClient.flush_and_error(/var/sample-app/node_modules/redis/index.js:362:23)n在RedisClient.connection_gone(/ var / sample-app / node_modules / redis / index。 js:664:14)n在Socket上的RedisClient.on_error(/var/sample-app/node_modules/redis/index.js:410:10)n(/var/sample-app/node_modules/redis/index.js:279:14)n在emitOne(events.js:116:13)n在Socket.emit(events.js:211:7)n在emitErrorNT(在args上的/var/sample-app/node_modules/async-listener/glue.js:188:31n上的internal / streams / destroy.js:66:8)n(匿名函数)(/ usr / lib / node_modules / pm2 /node_modules/event-loop-inspector/index.js:138:29)n在_combinedTickCallback(内部/进程/next_tick.js:139:11)n在process._tickDomainCallback(内部/进程/next_tick.js:219:9) )n在process.fallback(/var/sample-app/node_modules/async-listener/index.js:563:15)。

我们的节点应用程序在Docker容器上运行,它将连接到安装在EC2 Linux实例上的Redis服务器。

我们也面临着同样的问题,但是在这里,我们使用以下隧道配置将隧道放置为将redis代理到本地主机。

fips =否

setuid =根

setgid =根

pid = /var/run/stunnel.pid
调试= 7

选项= NO_SSLv2

选项= NO_SSLv3
输出= /var/log/stunnel.log

客户=否

前景=是

[redis-cli]
客户=是
接受= 127.0.0.1:6379
connect = redi sendpoint:6379

每隔几分钟,节点就会因以下错误而断开连接。 我们通过docker容器运行它们。

Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
错误:Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
错误:Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
AbortError:Redis连接丢失,命令中止。 它可能已被处理。

有什么决议吗?

我们也面临着同样的问题,但是在这里,我们使用以下隧道配置将隧道放置为将redis代理到本地主机。

fips =否

setuid =根

setgid =根

pid = /var/run/stunnel.pid
调试= 7

选项= NO_SSLv2

选项= NO_SSLv3
输出= /var/log/stunnel.log

客户=否

前景=是

[redis-cli]
客户=是
接受= 127.0.0.1:6379
connect = redi sendpoint:6379

每隔几分钟,节点就会因以下错误而断开连接。 我们通过docker容器运行它们。

Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
错误:Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
错误:Redis与127.0.0.1:6379的连接失败-读取ECONNRESET
在TCP.onStreamRead(internal / stream_base_commons.js:111:27)
AbortError:Redis连接丢失,命令中止。 它可能已被处理。

有什么决议吗?

对我一样,我认为这是stunnel的问题

我也面临着同样的错误

{ 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' 

我也在使用错误处理程序,但问题是为什么会发生,它会影响我的查询调用并延迟我的请求。

@Ayaz能否请您打开此问题,因为此问题尚未完全解决,人们只处理了错误响应,但问题仍未解决。

颠簸:这里有同样的问题:

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' },

我看到以下问题:

  • NodeJS v12.16.3
  • NestJS框架
  • 奥雷迪斯:4.2
  • nestjs-redis:1.2.8

通过使用Google Cloud MemoryStore提供Redis。

日志显示:

[ioredis]未处理的错误事件:错误:读取ECONNRESET

这是每24小时发生一次,没有任何特定原因或相同步骤,只是发生了

@ robertop87
我看到同样的问题。 通过使用Google Cloud MemoryStore提供Redis。 您解决了这个问题吗?

连接到Cloud Memory Store时,还会看到与Cloud run / Cloud Functions非常相似的问题。 当Google随机停止基本资源时,可能会发生这种情况。

对于我们而言,此问题才刚刚开始一周左右,而我们处理Redis连接的方式没有任何变化。 我们还使用ioredis处理连接并运行节点12。

IORedis作为默认策略会在发生错误时重新连接,但是由于某种原因它没有发生。

我所做的是在配置中添加下一个:

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

ECONNRESET错误仍然存​​在,但现在可以重试我的连接,并且我的Google实例不再被卡住了。

抄送: @ hkd987

在此处阅读有关reconnectOnError更多详细信息: https :

@ robertop87进行新部署,并将特定配置始终设置为将reconnectOnError设置为返回true。 这似乎是需要重新打开或制作新票证的问题,因为这种情况发生在最新版本中。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6评论

juriansluiman picture juriansluiman  ·  3评论

strumwolf picture strumwolf  ·  4评论

betimer picture betimer  ·  5评论

yuany picture yuany  ·  4评论