无法用node客户端连接redis集群,我做错了什么?

问题描述 投票:0回答:1

我已经启动了一个以集群模式运行的 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 地址可以通过隧道访问,因此集群的所有其他 IP 地址可能都无法访问,除非我为每个地址打开隧道。我只是不知道如何模拟我的开发中的生产环境以便我可以编写代码。

node.js amazon-web-services redis amazon-elasticache
1个回答
1
投票
  1. 正如您所指出的,您需要为集群中的每个节点创建一个隧道
  2. 客户端使用
    CLUSTER NODES
    命令来发现所有节点和集群,该命令将返回节点的实际 IP 和端口,而不是隧道。您可以使用
    ioredis
    “NAT 映射” 来解决这个问题。

编辑: 如果你发现这个问题但使用的是node-redis,你可以使用

nodeAddressMap
选项

© www.soinside.com 2019 - 2024. All rights reserved.