【问题标题】:Unable to connect to redis cluster with node client, what am I doing wrong?无法使用节点客户端连接到redis集群,我做错了什么?
【发布时间】:2022-01-06 00:32:58
【问题描述】:

我已经启动了一个在集群模式下运行的 AWS ElastiCache redis 实例,它目前有 1 个分片和 2 个节点

为了从我的本地机器连接到它,我使用我的 SSH 配置文件打开了一个 SSH 隧道

Host myRedisTunnel
  HostName 1.2.3.4
  ...
  LocalForward 6378 5.6.7.8:6379

隧道正常工作,我可以成功连接到我的 VPC

$ ssh myRedisTunnel
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-1060-aws x86_64)
...

在打开我的隧道并将 -c 作为集群模式的参数传递后,我可以通过 redis-cli 在本地连接到 redis 集群

$ redis-cli -c -h localhost -p 6378
localhost:6378> ping
PONG

但是当我尝试对 nodejs 使用 redis 时,它不会连接,它只是超时,我是否缺少一些配置设置,或者实际上无法通过隧道连接到我的远程 redis?

const { createCluster } = require('redis')

const client = createCluster({
  rootNodes: [
    { url: 'redis://localhost:6378' }
  ]
})

await client.connect()
const res = await client.ping()
console.log({ res })
Error: Connection timeout
      at Socket.<anonymous> (node_modules/@node-redis/client/dist/lib/client/socket.js:163:124)
      at Object.onceWrapper (node:events:513:28)
      at Socket.emit (node:events:394:28)
      at Socket._onTimeout (node:net:486:8)
      at listOnTimeout (node:internal/timers:557:17)
      at processTimers (node:internal/timers:500:7)

我已经为 redis 尝试了几个 nodejs 客户端,并且它们都以相同的方式超时,所以我知道问题必须是我的 nodejs redis 客户端配置中的配置设置错误 - 或者它有一些东西只有一个redis ip地址可以通过隧道访问,除非我为每个人打开隧道,否则集群的所有其余部分都可能无法访问。我不知道如何在开发中模拟我的生产环境以便我可以编写代码。

【问题讨论】:

    标签: node.js amazon-web-services redis amazon-elasticache


    【解决方案1】:
    1. 正如您所指出的,您需要为集群中的每个节点创建一个隧道
    2. 客户端使用CLUSTER NODES 命令来发现所有节点和集群,该命令将返回节点的实际IP 和端口,而不是隧道。您可以使用ioredis"NAT Mapping" 来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 2015-01-18
      • 2016-03-14
      • 2020-10-21
      • 1970-01-01
      • 2015-08-08
      • 2019-07-31
      • 2021-07-21
      相关资源
      最近更新 更多