我有一个商业案例,我想从一个帐户(比如帐户a)访问群集Redis缓存到帐户B
我使用了下面链接中提到的解决方案,在大多数情况下,它是有效的Base Solution
如果我试图通过redis-py
访问集群Redis,则基本解决方案可以正常工作,但是如果我尝试将其与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}
上面的代码在帐户A中非常有效,但在帐户B中,我得到的输出是
{'respCluster': 'error', 'respRegular': '123456789'}
我得到的错误是
rediscluster.exceptions.ClusterError: TTL exhausted
在帐户A中,我们使用AWS ECS+EC2+docker来运行此和
在帐户B中,我们正在AWS EKS Kubernetes吊舱中运行代码
在这种情况下,我应该如何使redis-py-cluster
工作?或者,除了python中的redis-py-cluster
之外,还有其他方法可以访问多节点Redis集群吗
我知道这是一个非常具体的案例,任何帮助都将不胜感激
编辑1:进一步研究后,TTL排气似乎是一个一般性错误,在日志中,初始错误为
redis.exceptions.ConnectionError:
Error 101 connecting to XX.XXX.XX.XXX:6379. Network is unreachable
这里XXXX是帐户A中Redus群集的IP。
这很奇怪,因为redis-py
也连接到相同的IP和端口,
此错误不应存在
根据您的评论:
我认为你要找的是不可能的。在专有网络中,路由总是首先发生-它发生在考虑任何路由表之前。换句话说,如果数据包的目的地位于发送VPC内,它将永远不会离开该VPC,因为AWS将尝试在其自己的VPC内路由它,即使IP当时在VPC中未使用
因此,如果您试图与另一个与您的IP范围相同的VPC通信,即使您专门将流量出口路由设置为不同的IP(但在相同范围内),该规则将被默默忽略,AWS将尝试在原始VPC中传送数据包,这似乎不是你想要完成的
因此,问题在于
redis-py-cluster
如何管理主机和端口创建新的
redis-py-cluster
对象时,它从Redis服务器(即Redis群集主机IP表单帐户a)获取主机IP列表,然后客户端尝试连接到新主机和端口在正常情况下,它作为初始主机工作,响应中的IP是相同的。(即,在创建对象时添加的主机和端口)
在我们的例子中,对象创建主机和端口是从帐户B的端点服务的DNS名称获得的
这导致代码试图从帐户A访问实际IP,而不是从帐户B访问DNS名称
使用Host port remapping解决了这个问题,这里我们将Redis服务器从帐户A返回的IP与帐户B的端点服务DNA名称的IP绑定
相关问题 更多 >
编程相关推荐