Ioredis: Redis.Cluster 断网时报错: ENETUNREACH or ENETDOWN

Created on 20 Jul 2020  ·  6Comments  ·  Source: luin/ioredis

在macbook上,使用Redis.Cluster创建连接后:

当盒盖、锁屏过久,会报错:

events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: connect ENETDOWN 10.38.164.79:6381 - Local (10.232.74.67:59455)
    at internalConnect (net.js:923:16)
    at defaultTriggerAsyncIdScope (internal/async_hooks.js:313:12)
    at net.js:1011:9
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ENETDOWN',
  code: 'ENETDOWN',
  syscall: 'connect',
  address: '10.38.164.79',
  port: 6381
}

当关闭wifi,也会报错:

events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: connect ENETUNREACH 10.38.164.71:6380 - Local (0.0.0.0:51326)
    at internalConnect (net.js:875:16)
    at defaultTriggerAsyncIdScope (internal/async_hooks.js:294:19)
    at defaultTriggerAsyncIdScope (net.js:965:9)
    at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)

Most helpful comment

emmm,把Redis Cluster安装到本机,看看情况会不会好点😏,或者换台电脑试试?

All 6 comments

emmm,把Redis Cluster安装到本机,看看情况会不会好点😏,或者换台电脑试试?

楼上的办法应该可行,甚至优化到不需要联网都可用。

断网肯定是会报错的,关于你说的盒盖报错,Mac上有类似省电功能,降低网络使用,如果你插的是网线,建议你把网卡优先度调制一下, 应该是小问题

断网肯定是会报错的,关于你说的盒盖报错,Mac上有类似省电功能,降低网络使用,如果你插的是网线,建议你把网卡优先度调制一下, 应该是小问题

可是直接通过new Redis 连接单节点。在以上两种情况下,都能恢复过来,而不是直接报错

虽然问题出现在笔记本盒盖、关闭wifi时,但最终关心的是在服务器环境会不会出问题
而且单节点情况下,可以恢复;在集群模式下却会拖垮整个app;感觉行为差别还挺大的

Should we use ETIMEDOUT or ENETUNREACH in test:

    it("should close the connection when timeout", function (done) {
      const [ host, port ] = ["192.0.0.0",6379]

      const redis = new Redis(port, host , {
        connectTimeout: 1,
        retryStrategy: null,
      });
      let pending = 2;
      redis.on("error", function (err) {
        expect(err.message).to.eql(`connect ETIMEDOUT ${host}:${port}`);
        if (!--pending) {
          done();
        }
      });
      redis.get("foo", function (err) {
        expect(err.message).to.match(/Connection is closed/);
        if (!--pending) {
          redis.disconnect();
          done();
        }
      });
    });

Is any place with docs of error codes?

In case of this error, we have rather unreachable redis than timeout.

Zrzut ekranu z 2020-09-05 10-13-00

Was this page helpful?
0 / 5 - 0 ratings

Related issues

jamesdixon picture jamesdixon  ·  4Comments

lakamsani picture lakamsani  ·  3Comments

AdriVanHoudt picture AdriVanHoudt  ·  4Comments

pavanratnakar picture pavanratnakar  ·  4Comments

PhillipWinder picture PhillipWinder  ·  3Comments