Node-redis: 3分ごとにECONNRESETを読み取ります-これが原因でNodeJSサーバーがクラッシュします。 サーバー監視にnewrelicプラグインを使用する。

作成日 2015年02月09日  ·  26コメント  ·  ソース: NodeRedis/node-redis

エラー:redis1.tfsへのRedis接続。 tfs:6379が失敗しました-Socketの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の外部のネットワークの問題のように聞こえます。このエラー「ECONNRESET」は、Node.jsへのリモート接続が予期せずソケットを閉じた場合に発生します。

NodeとRedisの間でプロキシを使用していますか?

Node / node_redis / Redisサーバーのバージョンは何ですか?

NewRelicエージェントが関与しているとは思えませんが、エージェントなしでいつでも複製を試みて、問題が解決するかどうかを確認できます。 cc / @wraithan

それらの行は、CLSがそれを実行しているだけです。 もっと再現すれば、NewRelicエージェントを完全に除外することができます。 しかし、これは私たちが原因ではないと私は比較的確信しています。

NewRelicエージェントを削除しましたが、問題は引き続き発生します。 約 3分ごとに、このクラッシュが発生します。 以下は参照用のログです。

events.js:72
投げる; //未処理の「エラー」イベント
^
エラー:redis1.tfsへのRedis接続。 tfs:6379が失敗しました
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このマッピングはhostsファイルにあります。 ただし、私の場合のRedisマシンはリモートマシンです。 クロスチェックしたところ、Redisマシンにもローカルホストマッピングがあります。 それでも問題は解決されていません。

私も同じ問題に直面しています。 これがコンソール出力です

events.js:72
投げる; //未処理の「エラー」イベント
^
エラー:pub-redis-10606.us-east-1-1.1.ec2.garantiadataへのRedis接続。 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に問題はないようです。 アプリがクラッシュしないように、エラーハンドラーを追加するだけで十分です(常に接続されている必要があります)。

http(use post)をJAVAサーバーに投稿したときにこの問題が発生しました。{[エラー:read ECONNRESET]
コード: 'ECONNRESET'、
errno: 'ECONNRESET'、
システムコール: '読み取り'、
応答:未定義}
エラー: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をご覧ください。

こんにちは 、
この問題も発生しています。 redisSNAPSHOTTINGが原因である可能性があります。 redisがスナップショットを取得し、ディスク接続に保存するたびにリセットされます。 自分自身を証明するために、アプリケーションログをredisデバッグログと比較し、タイミングが正確に一致しています。

以下はredis.confのスナップショット設定です
900を節約1
300を節約10
6010000節約

何か問題がある場合はお知らせください。

私も頻繁に接続の問題に直面しています。

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)
EmmitErrorNTでのERR(net.js:1281:8)
ソケットでのERR。(/home/vcap/app/node_modules/redis/index.js:272:14)
process._tickCallbackでのERR(internal / process / next_tick.js:98:9)
ERRエラー: XXXXXXXX:XXXXXへのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onreadでのERR(net.js:572:26)
_combinedTickCallbackでのERR(internal / process / next_tick.js:74:11)
EmmitOneでのERR(events.js:96:13)
exports._errnoExceptionでのERR(util.js:1022:11)
Socket.emitでのERR(events.js:188:7)

エラーが発生した後、自動的に再接続されます。
接続が失われた場合の問題は何ですか。

こんにちはウォータールー、
このステートメントを配置する場所client.on( 'error'、function(err){console.error(err)})
そして、私はこのステートメントがあなたのエラーをコンソールするためだけのものだと思います。
本当に使えるの?
早急にご意見をお聞かせください。

前もって感謝します!!!

こんにちは

私も同じ問題に直面しています

events.js:160
投げる; //未処理の「エラー」イベント
^

エラー:ECONNRESETを読み取ります

これは私の問題を解決しました:

  1. すべてのプロセスモニタリングを無効にしました(new relic、elastic apm ...)
  2. 私はこのコードを使用しました
    `` `Javascript
    process.on( 'uncaughtException'、function(err){
    console.error(err.stack);
    console.log( "ノードが終了していません...");
    });

私もこの問題に直面しています。 フック付きのsails.jsフレームワークで使用しているため、ノードサービスを開始するときにredisサーバーへの接続は1つだけです。グローバルな帆オブジェクトを使用して、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接続が失われ、コマンドが中止されました。 RedisClient.flush_and_error(/var/sample-app/node_modules/redis/index.js:362:23)n at RedisClient.connection_gone(/ var / sample-app / node_modules / redis / index)で処理された可能性があります。 js:664:14)n at RedisClient.on_error(/var/sample-app/node_modules/redis/index.js:410:10)n at Socket(/var/sample-app/node_modules/redis/index.js:279:14)n at EmmitOne(events.js:116:13)n at Socket.emit(events.js:211:7)n at EmmitErrorNT( internal /streams/destroy.js:66:8)n at /var/sample-app/node_modules/async-listener/glue.js:188:31n at args。(匿名関数)(/ usr / lib / node_modules / pm2 /node_modules/event-loop-inspector/index.js:138:29)n at _combinedTickCallback(internal / process / next_tick.js:139:11)n at process._tickDomainCallback(internal / process / next_tick.js:219:9 )n at process.fallback(/var/sample-app/node_modules/async-listener/index.js:563:15)。

ノードアプリはDockerコンテナで実行されており、EC2LinuxインスタンスにインストールされているRedisサーバーに接続します。

同じ問題に直面していますが、ここでは、以下のstunnel構成を使用して、redisをlocalhostにプロキシするためのstunnelを配置しました。

fips =いいえ

setuid = root

setgid = root

pid = /var/run/stunnel.pid
デバッグ= 7

オプション= NO_SSLv2

オプション= NO_SSLv3
出力= / var / log / stunnel.log

クライアント=いいえ

前景=はい

[redis-cli]
クライアント=はい
受け入れる= 127.0.0.1:6379
接続= redi sendpoint:6379

ノードは、数分ごとにこれらの以下のエラーで切断されています。 これらをDockerコンテナで実行します。

127.0.0.1:6379へのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onStreamRead(internal / stream_base_commons.js:111:27)で
エラー:127.0.0.1:6379へのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onStreamRead(internal / stream_base_commons.js:111:27)で
エラー:127.0.0.1:6379へのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onStreamRead(internal / stream_base_commons.js:111:27)で
AbortError:Redis接続が失われ、コマンドが中止されました。 処理された可能性があります。

解決策はありますか?

同じ問題に直面していますが、ここでは、以下のstunnel構成を使用して、redisをlocalhostにプロキシするためのstunnelを配置しました。

fips =いいえ

setuid = root

setgid = root

pid = /var/run/stunnel.pid
デバッグ= 7

オプション= NO_SSLv2

オプション= NO_SSLv3
出力= / var / log / stunnel.log

クライアント=いいえ

前景=はい

[redis-cli]
クライアント=はい
受け入れる= 127.0.0.1:6379
接続= redi sendpoint:6379

ノードは、数分ごとにこれらの以下のエラーで切断されています。 これらをDockerコンテナで実行します。

127.0.0.1:6379へのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onStreamRead(internal / stream_base_commons.js:111:27)で
エラー:127.0.0.1:6379へのRedis接続に失敗しました-ECONNRESETを読み取ります
TCP.onStreamRead(internal / stream_base_commons.js:111:27)で
エラー:127.0.0.1:6379へのRedis接続に失敗しました-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フレームワーク
  • IOredis:4.2
  • nestjs-redis:1.2.8

Redisは、Google CloudMemoryStoreを使用して提供されます。

ログは次のことを示しています。

[ioredis]未処理のエラーイベント:エラー:ECONNRESETの読み取り

これは、特定の理由や同じ手順なしで、24時間ごとに約1回発生していますが、発生するだけです。

@ robertop87
同じ問題が発生します。 Redisは、Google CloudMemoryStoreを使用して提供されます。 この問題は解決しましたか?

また、Cloud Memory Storeに接続すると、Cloud run / CloudFunctionsで非常によく似た問題が発生します。 基になるリソースがGoogleによってランダムに停止されるのが早すぎる場合に発生する可能性があります。

この問題は約1週間前に始まったばかりで、Redis接続の処理方法に変更はありません。 また、ioredisを使用して接続を処理し、ノード12を実行しています。

IORedisには、デフォルトの戦略としてエラー時に再接続がありますが、何らかの理由でそれが発生していません。

私がしたことは、構成に次のものを追加することです。

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

ECONNRESETエラーは引き続き存在しますが、接続が再試行され、Googleインスタンスがスタックしなくなりました。

CC: @ hkd987

reconnectOnError詳細については、 https

@ robertop87常にreconnectOnError trueを返すように設定された特定の構成で新しいデプロイメントを作成しました。 これは最新リリースで発生しているため、再度開くか、新しいチケットを作成する必要がある問題のようです。

このページは役に立ちましたか?
0 / 5 - 0 評価