abh*_*314 5 python amazon-web-services redis docker kubernetes
我有一个业务案例,我想从一个帐户(假设帐户 A)到帐户 B 访问集群 Redis 缓存。
我使用了以下链接中提到的解决方案,并且在大多数情况下,它可以工作Base Solution
如果我尝试通过以下方式访问集群 Redis,redis-py
则基本解决方案工作正常,但是如果我尝试使用redis-py-cluster
它失败。
我在 Redis 集群只有一个节点的暂存环境中测试所有这些,但在生产环境中,它有两个节点,因此该redis-py
方法对我不起作用。
下面是我的示例代码
redis = "3.5.3"
redis-py-cluster = "2.1.3"
==============================
from redis import Redis
from rediscluster import RedisCluster
respCluster = 'error'
respRegular = 'error'
host = "vpce-XXX.us-east-1.vpce.amazonaws.com"
port = "6379"
try:
ru = RedisCluster(startup_nodes=[{"host": host, "port": port}], decode_responses=True, skip_full_coverage_check=True)
respCluster = ru.get('ABC')
except Exception as e:
print(e)
try:
ru = Redis(host=host, port=port, decode_responses=True)
respRegular = ru.get('ABC')
except Exception as e:
print(e)
return {"respCluster": respCluster, "respRegular": respRegular}
Run Code Online (Sandbox Code Playgroud)
上面的代码在账户 A 中完美运行,但在账户 B 中我得到的输出是
{'respCluster': 'error', 'respRegular': '123456789'}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
rediscluster.exceptions.ClusterError: TTL exhausted
Run Code Online (Sandbox Code Playgroud)
在账户 A 中,我们使用 AWS ECS + EC2 + docker 来运行它,并且
在账户 B 中,我们在 AWS EKS Kubernetes pod 中运行代码。
redis-py-cluster
在这种情况下我应该怎么做才能完成工作?或者redis-py-cluster
在 python 中是否有替代方法来访问多节点 Redis 集群?
我知道这是一个非常具体的案例,任何帮助表示赞赏。
编辑 1:经过进一步研究,似乎 TTL 排气是一个一般错误,在日志中,初始错误是
redis.exceptions.ConnectionError:
Error 101 connecting to XX.XXX.XX.XXX:6379. Network is unreachable
Run Code Online (Sandbox Code Playgroud)
这里XXXX是Account A中Redus集群的IP,奇怪了,因为redis-py
也连接到相同的IP和端口,这个错误应该不存在。
事实证明,问题是由于如何redis-py-cluster
管理主机和端口造成的。
当创建一个新redis-py-cluster
对象时,它会从 Redis 服务器获取主机 IP 列表(即账户 A 中的 Redis 集群主机 IP),之后客户端尝试连接到新主机和端口。
正常情况下,它作为初始主机,并且响应的IP是相同的。(即在创建对象时添加的主机和端口)
在我们的示例中,对象创建主机和端口是从账户 B 的端点服务的 DNS 名称获取的。
这会导致代码尝试从帐户 A 访问实际 IP,而不是从帐户 B 访问 DNS 名称。
使用主机端口重新映射解决了该问题,这里我们将账户 A 从 Redis 服务器返回的 IP 与账户 B 的端点服务 DNA 名称的 IP 绑定在一起。
归档时间: |
|
查看次数: |
265 次 |
最近记录: |