我有一个在使用 lettuce 的 EC2 实例中运行的 Java 应用程序(https://lettuce.io/)与 AWS ElasticCache 上的 redis 集群通信。
Java 应用程序可以毫无问题地连接。以下是 netstat 输出:
tcp6 0 0 10.0.56.94:45846 10.0.34.61:6379 ESTABLISHED
tcp6 0 0 10.0.56.94:33198 10.0.33.125:6379 ESTABLISHED
tcp6 0 0 10.0.56.94:57526 10.0.32.189:6379 ESTABLISHED
我已登录到同一个 ec2 实例并尝试使用它redis-cli
来连接同一个集群。但是使用 redis-cli 却没有成功。
Java应用程序的Redis uri是这样的:
rediss://my-project-0001-001.my-project.abczy.use1.cache.amazonaws.com:6379,my-project-0002-001.my-project.abczy.use1.cache.amazonaws.com:6379,my-project-0003-001.my-project.abczy.use1.cache.amazonaws.com:6379
然而,如果我将此 uri 应用于redis-cli
,它会引发一个错误:“无效的 uri 方案”。
rediss
如果我在 uri 中替换为,错误就会被抑制redis
。但我仍然无法连接到集群。
我已经尝试过其他替代方案(但它们只是“什么也不做”:根本没有错误消息。根本没有显示任何内容。)
直接连接到节点
redis-cli -c -h my-project-0001-001.my-project.abczy.use1.cache.amazonaws.com -p 6379 -a auth_token
连接到配置端点
redis-cli -c -h clustercfg.my-project.abczy.use1.cache.amazonaws.com -p 6379 -a auth_token
直接使用 IP
# Use netstat to find out the IPs
redis-cli -c -h 10.0.34.61 -p 6379 -a auth_token
直接使用IP而不使用-c
flag
redis-cli -h 10.0.34.61 -p 6379 -a auth_token
我如何才能找出 redis-cli 无法连接的原因?有什么方法可以追踪路由吗?
答案1
根据文档,redis-cli 不支持 SSL 或 TLS:
要从启用了传输加密的 ElastiCache for Redis 节点访问数据,您可以使用支持安全套接字层 (SSL) 的客户端。但是,redis-cli 不支持 SSL 或传输层安全性 (TLS)。
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/in-transit-encryption.html#connect-tls
您可以使用 stunnel 作为解决方法:
setuid = root
setgid = root
pid = /var/run/stunnel.pid
debug = 7
delay = yes
options = NO_SSLv2
options = NO_SSLv3
[redis-cli]
client = yes
accept = 127.0.0.1:6379
connect = my-project-0001-001.my-project.abczy.use1.cache.amazonaws.com:6379
[redis-cli-replica1]
client = yes
accept = 127.0.0.1:6380
connect = my-project-0002-001.my-project.abczy.use1.cache.amazonaws.com:6379
[redis-cli-replica2]
client = yes
accept = 127.0.0.1:6381
connect = my-project-0003-001.my-project.abczy.use1.cache.amazonaws.com:6379
启动隧道
sudo stunnel /etc/stunnel/redis-cli.conf
使用 redis-cli 连接:
redis-cli -c -h localhost-p 6379 -a auth_token